Ë
    g^(há%  ã                   ó  — d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl	m
Z
 d dlZd dlmZmZmZ ddlmZ ddlmZ d	d
lmZmZmZ d	dlmZmZmZ d	dlmZmZ d	dlm Z   e jB                  e"«      Z# G d„ d«      Z$ G d„ dee«      Z%y)é    N)Úpartial)ÚAnyÚCallableÚOptionalÚUnion)ÚExpr)Úbound_sympyÚSymPyValueRangeAnalysisÚValueRangesé   ©ÚPowByNatural)Úint_ooé   )ÚInterpreterShimÚLoopBodyÚLoopBodyBlock)ÚDefaultHandlerÚReductionTypeÚ	StoreMode)Úcache_on_selfÚdominated_nodes)ÚVc                   ó`  — e Zd ZdZdeddfd„Zdefd„Zede	e
j                  j                  ee   f   fd„«       Zde	eed	ef   f   de	eed	ee   f   f   fd
„Zdede	e
j                  j                  ee   f   dedede	eed	ef   f   dee   fd„Zdedee   dee   fd„Zdedee   fd„Zy)Ú	BoundVarsa¢  
    Performs Value Range Analysis on LoopBody's fx graph by calling BoundVars.run()
    It exposes the ranges of the nodes in the `bounds` variable

    Note. A current limitation of this analysis is that it just works on a per-loop basis.
    We should be able to propagate the bounds between across the whole graph. This may benefit
    the case a bounded variable is returned by a kernel and fed into another.
    Ú	loop_bodyÚreturnNc                 ó^  — dt         t        t        f   dt        fd„}|| _        |j                  j                  «       D ��ci c]"  \  }}|t        t           d ||«      dz
  «      “Œ$ c}}| _        t        d„ | j                  j                  «       D «       «      | _
        i | _        y c c}}w )NÚvr   c                 óP   — t        | t        «      rt        | «      j                  S | S ©N)Ú
isinstancer   r	   Úupper)r   s    úT/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/bounds.pyÚupper_boundz'BoundVars.__init__.<locals>.upper_bound&   s    € Ü+5°a¼Ô+>”;˜q“>×'Ñ'ÐEÀAÐEó    r   r   c              3   óz   K  — | ]3  }|j                   d dt        j                  fv sd|j                   v r|–— Œ5 y­w)ÚloadÚ	reductionÚmasked_subblockN)ÚtargetÚoperatorÚgetitem)Ú.0Únodes     r$   ú	<genexpr>z%BoundVars.__init__.<locals>.<genexpr>/   s=   è ø€ ò .
àØ�{‰{˜v {´H×4DÑ4DÐEÑEØ  D§K¡KÑ/ô ñ.
ùs   ‚9;)r   r   Úintr   Ú
var_rangesÚitemsr   Úreplacement_valsr   Ú	get_nodesÚunbounded_varsÚ_bounds)Úselfr   r%   Úkr   s        r$   Ú__init__zBoundVars.__init__%   s­   € ð	Fœ5¤¤s Ñ+ð 	F´ó 	Fð #ˆŒð "×,Ñ,×2Ñ2Ó4÷!
á��1ð Œ{œ4Ñ  ¡K°£N°QÑ$6Ó7Ñ7ó!
ˆÔô
 .ñ .
àŸ™×0Ñ0Ó2ô.
ó 
ˆÔð @Bˆ�ùó!
s   Á'B)c           
      óœ   — | j                   j                  › d| j                  › d| j                  › d| j                  › d| j
                  › d�
S )Nz(loop_body=z,
 replacement_vals=z, 
unbounded_vars=z, 
_bounds=ú))Ú	__class__Ú__name__r   r4   r6   r7   )r8   s    r$   Ú__repr__zBoundVars.__repr__8   s]   € à�~‰~×&Ñ&Ð'ð (ØŸ™Ð(ð ) Ø $× 5Ñ 5Ð6ð 7Ø"×1Ñ1Ð2ð 3Ø—|‘|�n Að	'ð	
r&   c                 óÚ  — | j                  | j                  j                  «      }| j                  D ]b  }t	        |j
                  t        «      rd|j
                  vsŒ,d|j
                  vsŒ;t        t           j                  «       | j                  |<   Œd t        j                  t        «       «      5  t        | j                  j                  j                   |«      }t"        j%                  d| j                  j                  j                   «       |j'                  t        j(                  «       | j                  ¬«       d d d «       | j                  S # 1 sw Y   | j                  S xY w)Nr*   Úset_indirectzget_bounds:
%s©Úinitial_env)Úswap_submodulesr   Ú
submodulesr6   r"   r+   Ústrr   r   Úunknownr7   r   Úset_ops_handlerÚValueRangeAnalysisr   Ú
root_blockÚgraphÚlogÚdebugÚrunÚget_ops_handler)r8   rE   r/   Úinterpreters       r$   Ú
get_boundszBoundVars.get_boundsA   s  € à×)Ñ)¨$¯.©.×*CÑ*CÓDˆ
ð ×'Ñ'ò 	AˆDä˜dŸk™k¬3Ô/Ø!¨¯©Ò4Ø"¨$¯+©+Ò5ä%0´Ñ%6×%>Ñ%>Ó%@�—‘˜TÒ"ð	Aô ×ÑÔ1Ó3Ó4ñ 	KÜ)¨$¯.©.×*CÑ*C×*IÑ*IÈ:ÓVˆKÜ�I‰IÐ'¨¯©×)BÑ)B×)HÑ)HÔIØ�O‰OœA×-Ñ-Ó/¸T¿\¹\ˆOÔJ÷	Kð �|‰|Ð÷		Kð �|‰|Ðús   Â4BEÅE*rE   .c                 óÊ  ‡ ‡— i Š|j                  «       D ]Ë  }|dk(  r‰ j                  ‰|<   Œd|v rR‰ j                  j                  |   }dt        dt
        t        t        gt        t           f   fˆˆ fd„} ||«      ‰|<   Œnd|v rLt        |t        d«      d  «      }‰ j                  j                  |   }t        ‰ j                  |«      }|‰|<   Œ¾d|v sJ ‚||   ‰|<   ŒÍ ‰S )NÚ	get_indexr*   Úsubblockr   c                 ó   •‡ — ˆˆˆ fd„S )Nc                 óB   •— ‰j                  ‰‰j                  | |‰«      S r!   )r*   r7   )ÚmaskÚvalueÚresultr8   rT   s     €€€r$   ú<lambda>z<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>g   s!   ø€ ¨t×/CÑ/CØ  $§,¡,°°e¸Vó0€ r&   © )rT   rY   r8   s   `€€r$   Úmake_fnz*BoundVars.swap_submodules.<locals>.make_fnd   s   ù€ õð r&   rA   Úscan)ÚkeysrS   r   Ú	subblocksr   r   r   r   r   r1   ÚlenÚindirect_varsr   rA   )	r8   rE   ÚkeyrT   r\   ÚidxÚvarÚindirectrY   s	   `       @r$   rD   zBoundVars.swap_submodulesT   sø   ù€ ð ?AˆØ—?‘?Ó$ò 	.ˆCØ�kÒ!Ø"Ÿn™n��s’Ø" cÑ)ØŸ>™>×3Ñ3°CÑ8�ðÜ+ðäœs¤C˜j¬+´dÑ*;Ð;Ñ<öñ & hÓ/��s’Ø 3Ñ&Ü˜#œc .Ó1Ð3Ð4Ó5�Ø—n‘n×2Ñ2°3Ñ7�Ü" 4×#4Ñ#4°cÓ:�Ø&��s’à ‘}Ð$�}Ø(¨™o��s’ð7	.ð: ˆr&   rT   ÚenvrW   rX   c                 ó,  — t        |j                  |«      }|j                  t        j                  «       |¬«       |j                  j
                  D �cg c]  }|j                  dk(  sŒ|‘Œ }}t        |«      dk(  sJ ‚|j                  |d      S c c}w )NrB   Úoutputr   r   )	r   rK   rN   r   rO   Únodesr+   r`   rf   )	r8   rT   rf   rW   rX   rE   Úinterpr/   rh   s	            r$   r*   zBoundVars.masked_subblockw   s‚   € ô ! §¡°Ó<ˆØ�
‰
”1×$Ñ$Ó&°Cˆ
Ô8Ø#+§>¡>×#7Ñ#7ÖS˜4¸4¿;¹;È(Ó;R’$ÐSˆÐSÜ�6‹{˜aÒÐÐð �z‰z˜& ™)Ñ$Ð$ùò	 Ts   ÁBÁ)BÚoldÚnewc                 óH   — t        |t        «      sJ ‚|| j                  |<   |S r!   )r"   r   r4   )r8   rk   rl   s      r$   rA   zBoundVars.set_indirect‡   s'   € Ü˜#œ{Ô+Ð+Ð+Ø%(ˆ×Ñ˜cÑ"Øˆ
r&   Únamec                 ó¼   — | j                   j                  |   }| j                  j                  |«      }|€t	        || j                  «      }|| j                  |<   |S r!   )r   Úindexing_exprsr4   Úgetr	   )r8   rn   ÚexprÚbounds       r$   rS   zBoundVars.get_indexŒ   sZ   € Ø�~‰~×,Ñ,¨TÑ2ˆØ×%Ñ%×)Ñ)¨$Ó/ˆØˆ=Ü  d×&;Ñ&;Ó<ˆEð ',ˆ×Ñ˜dÑ#Øˆr&   )r>   Ú
__module__Ú__qualname__Ú__doc__r   r:   rF   r?   r   ÚdictÚtorchÚfxÚNoder   r   rQ   r   r   rD   r   r*   rA   rS   r[   r&   r$   r   r      sG  „ ñðB (ð B¨tó Bð&
˜#ó 
ð ð˜D §¡§¡°¸DÑ0AÐ!AÑBò ó ðð$!Ø˜s H¨S°#¨XÑ$6Ð6Ñ7ð!à	ˆc�8˜C ¨TÑ!2Ð2Ñ3Ð3Ñ	4ó!ðF%àð%ð �%—(‘(—-‘- ¨TÑ!2Ð2Ñ3ð%ð ð	%ð
 ð%ð ˜˜h s¨C xÑ0Ð0Ñ1ð%ð 
�TÑ	ó%ð  ð ¨;°tÑ+<ð ÀÈTÑARó ð
	˜cð 	 k°$Ñ&7ô 	r&   r   c                   ó0  — e Zd Zdd„Zedededee   fd„«       Zdede	edf   de
eef   defd	„Zded
ej                  dee   fd„Z	 dded
ej                  dededdf
d„Zdej$                  dej$                  dededee   f
d„Zed
edej$                  dee   fd„«       Ze	 	 ddedej$                  deej$                     dedee   f
d„«       Zededee   fd„«       Zededee   fd„«       Zedededee   fd„«       Zedededee   fd„«       Zy) rI   r   Nc                 óR   — d| _         d}|D ]  }t        | || j                  «       Œ y )NrI   )ÚxorÚlogical_andÚ
logical_orÚlogical_not)rn   ÚsetattrÚbool_handler)r8   Úboolean_operatorsÚops      r$   r:   zValueRangeAnalysis.__init__™   s4   € Ø(ˆŒ	ð
Ðð $ò 	1ˆBÜ�D˜"˜d×/Ñ/Õ0ñ	1r&   ÚargsÚkwargsc                  óR   — t        t        j                  t        j                  «      S r!   )r   ÚsympyÚfalseÚtrue)r…   r†   s     r$   r‚   zValueRangeAnalysis.bool_handler¤   s   € ô œ5Ÿ;™;¬¯
©
Ó3Ð3r&   rn   .c                 ó*   — t        j                  «       S r!   ©r   rG   )r8   rn   r…   r†   s       r$   Ú_defaultzValueRangeAnalysis._default©   s   € ô ×"Ñ"Ó$Ð$r&   Úindexc                 ó*   — t        j                  «       S r!   rŒ   )r8   rn   rŽ   s      r$   r(   zValueRangeAnalysis.load®   s   € Ü×"Ñ"Ó$Ð$r&   rX   Úmodec                  ó   — y r!   r[   )r8   rn   rŽ   rX   r�   s        r$   ÚstorezValueRangeAnalysis.store±   s   € ð 	r&   ÚdtypeÚ	src_dtypeÚreduction_typec                 ó*   — t        j                  «       S r!   rŒ   )r8   r“   r”   r•   rX   s        r$   r)   zValueRangeAnalysis.reduction¶   s   € ô ×"Ñ"Ó$Ð$r&   c                 óJ   — t        |t        «      sJ ‚| j                  ||«      S r!   )r"   r   Úto_dtype)ÚclsrŽ   r“   s      r$   Ú
index_exprzValueRangeAnalysis.index_expr¿   s#   € ä˜%¤Ô-Ð-Ð-Ø�|‰|˜E 5Ó)Ð)r&   ÚxÚuse_compute_typesc                 óä  — t        j                  | «      } |t        j                  k(  r�| j	                  «       r"t        j                  | j
                  dk7  «      S | j                  r| S d| vr#t        j                  t        j                  «      S t        t        j                  t        j                  «      S dt        dt        j                  dt        j                  fd„}| j                  rV| j	                  «       r,| j
                  rdnd}t        j                   |||«      «      S t         |d|«       |d|«      «      S t         || j
                  |«       || j                  |«      «      S )Nr   r›   r“   r   c                 ó´   — |j                   rt        j                  | «      S | t        t         fv r| S 	 t        j                  | «      S # t
        $ r | cY S w xY wr!   )Úis_floating_pointrˆ   ÚFloatr   ÚIntegerÚ	TypeError)r›   r“   s     r$   Úcastz)ValueRangeAnalysis.to_dtype.<locals>.cast×   sU   € à×&Ò&Ü—{‘{ 1“~Ð%àœ¤& Ð)Ñ)Ø�HðÜ Ÿ=™=¨Ó+Ð+øÜ ò à’Hðús   ´A	 Á	AÁAr   )r   Úwraprx   ÚboolÚis_singletonÚlowerÚis_boolrˆ   rŠ   r‰   r   r“   r   r#   )r›   r“   r”   rœ   r£   Úvals         r$   r˜   zValueRangeAnalysis.to_dtypeÄ   s  € ô ×Ñ˜QÓˆà”E—J‘JÒØ�~‰~ÔÜ"×'Ñ'¨¯©°1©Ó5Ð5Ø—’Ø�Ø˜!‘Ü"×'Ñ'¬¯
©
Ó3Ð3ä"¤5§;¡;´·
±
Ó;Ð;ð	”Cð 	¤§¡ð 	´·
±
ó 	ð �9Š9Ø�~‰~ÔØŸ7š7‘a¨�Ü"×'Ñ'©¨S°%Ó(8Ó9Ð9ä"¡4¨¨5£>±4¸¸5³>ÓBÐBô ™t A§G¡G¨UÓ3±T¸!¿'¹'À5Ó5IÓJÐJr&   c                 ó0   — t        j                  | d„ «      S )Nc                 ó   — t        | d«      S )Nr   r   )Úys    r$   rZ   z+ValueRangeAnalysis.square.<locals>.<lambda>ð   s   € ¼LÈÈAÓ<N€ r&   )r   Úconvex_min_zero_map©r›   s    r$   ÚsquarezValueRangeAnalysis.squareî   s   € ä×.Ñ.¨qÑ2NÓOÐOr&   c                 óJ   — t        j                  | t        j                  «      S r!   )r   Údecreasing_mapr,   Únegr®   s    r$   r²   zValueRangeAnalysis.negò   s   € ä×)Ñ)¨!¬X¯\©\Ó:Ð:r&   ÚaÚbc                 óz   — | j                  ||«      }|t        j                  «       k(  r|S | j                  |«      S r!   )Útruedivr   rG   Útrunc)r™   r³   r´   r›   s       r$   ÚtruncdivzValueRangeAnalysis.truncdivù   s6   € à�K‰K˜˜1ÓˆØ”×#Ñ#Ó%Ò%ØˆHà�y‰y˜‹|Ðr&   c                 óD   — | j                  || j                  |«      «      S r!   )Úaddr²   )r™   r³   r´   s      r$   ÚsubzValueRangeAnalysis.sub  s   € à�w‰w�q˜#Ÿ'™' !›*Ó%Ð%r&   )r   Nr!   )NT)r>   rt   ru   r:   Ústaticmethodr   r   r‚   rF   Útuplerw   r�   rˆ   r   r(   r   r’   rx   r“   r   r)   Úclassmethodrš   r   r¥   r˜   r¯   r²   r¸   r»   r[   r&   r$   rI   rI   ˜   sH  „ ó	1ð ð4˜Cð 4¨3ð 4°;¸sÑ3Cò 4ó ð4ð%˜Sð %¨¨c°3¨h©ð %ÀÀcÈ3ÀhÁð %ÐTWó %ð
%˜ð % U§Z¡Zð %°KÀÑ4Dó %ð KOñØðØ %§
¡
ðØ36ðØ>Gðà	óð
%à�{‰{ð%ð —;‘;ð%ð &ð	%ð
 ð%ð 
�SÑ	ó%ð ð*˜sð *¨5¯;©;ð *¸;ÀsÑ;Kò *ó ð*ð ð ,0Ø"&ñ	'KØð'Kà�{‰{ð'Kð ˜EŸK™KÑ(ð'Kð  ð	'Kð
 
�SÑ	ò'Kó ð'KðR ðP�#ð P˜+ cÑ*ò Pó ðPð ð;ˆsð ;�{ 3Ñ'ò ;ó ð;ð ð˜ð  ð ¨°SÑ)9ò ó ðð ð&�Cð &˜Cð & K°Ñ$4ò &ó ñ&r&   rI   )&Úloggingr,   Ú	functoolsr   Útypingr   r   r   r   rˆ   r   rx   Útorch.utils._sympy.value_rangesr	   r
   r   Úutils._sympy.functionsr   Úutils._sympy.numbersr   r   r   r   r   Úops_handlerr   r   r   Úutilsr   r   Úvirtualizedr   Ú	getLoggerr>   rL   r   rI   r[   r&   r$   ú<module>rÉ      ss   ðÛ Û Ý ß 1Ó 1ã Ý ã ÷ñ õ 2Ý )ß ?Ñ ?ß AÑ Aß 1Ý ð €g×Ñ˜Ó!€÷zñ zôzk&Ð0°.õ k&r&   