Ë
    L²jJ&  ã                   ó  — d dl Z d dlZd dlmZ d dlmZ d dl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 j@                  e!«      Z" G d„ d«      Z# G d„ dee«      Z$y)é    N)ÚCallable)Úpartial)ÚAny)Ú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                 óR  — dt         t        z  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    úU/var/www/html/ia-enhanced/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>0   s=   è ø€ ò .
àØ�{‰{˜v {´H×4DÑ4DÐEÑEØ  D§K¡KÑ/ô ñ.
ùs   ‚9;)r   Úintr   Ú
var_rangesÚitemsr	   Úreplacement_valsr   Ú	get_nodesÚunbounded_varsÚ_bounds)Úselfr   r#   Úkr   s        r"   Ú__init__zBoundVars.__init__&   s¨   € ð	Fœ4¤#™:ð 	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   r2   r4   r5   )r6   s    r"   Ú__repr__zBoundVars.__repr__9   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   Ú
submodulesr4   r    r)   Ústrr	   r   Úunknownr5   r   Úset_ops_handlerÚValueRangeAnalysisr   Ú
root_blockÚgraphÚlogÚdebugÚrunÚget_ops_handler)r6   rC   r-   Úinterpreters       r"   Ú
get_boundszBoundVars.get_boundsB   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*rC   .c                 ó®  ‡ ‡— i Š|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(   r5   )ÚmaskÚvalueÚresultr6   rR   s     €€€r"   ú<lambda>z<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>h   s!   ø€ ¨t×/CÑ/CØ  $§,¡,°°e¸Vó0€ r$   © )rR   rW   r6   s   `€€r"   Úmake_fnz*BoundVars.swap_submodules.<locals>.make_fne   s   ù€ õð r$   r?   Úscan)rQ   r   Ú	subblocksr   r   r   r	   r   r/   ÚlenÚindirect_varsr   r?   )	r6   rC   ÚkeyrR   rZ   ÚidxÚvarÚindirectrW   s	   `       @r"   rB   zBoundVars.swap_submodulesU   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$   rR   ÚenvrU   rV   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 )Nr@   Úoutputr   r   )	r   rI   rL   r   rM   Únodesr)   r]   rc   )	r6   rR   rc   rU   rV   rC   Úinterpr-   re   s	            r"   r(   zBoundVars.masked_subblockx   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	   r2   )r6   rh   ri   s      r"   r?   zBoundVars.set_indirectˆ   s'   € Ü˜#œ{Ô+Ð+Ð+Ø%(ˆ×Ñ˜cÑ"Øˆ
r$   Únamec                 ó¼   — | j                   j                  |   }| j                  j                  |«      }|€t	        || j                  «      }|| j                  |<   |S r   )r   Úindexing_exprsr2   Úgetr   )r6   rk   ÚexprÚbounds       r"   rQ   zBoundVars.get_index�   sZ   € Ø�~‰~×,Ñ,¨TÑ2ˆØ×%Ñ%×)Ñ)¨$Ó/ˆØˆ=Ü  d×&;Ñ&;Ó<ˆEð ',ˆ×Ñ˜dÑ#Øˆr$   )r<   Ú
__module__Ú__qualname__Ú__doc__r   r8   rD   r=   r   ÚdictÚtorchÚfxÚNoder	   r   rO   r   r   rB   r   r(   r?   rQ   rY   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j$                  dz  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) rG   r   Nc                 óR   — d| _         d}|D ]  }t        | || j                  «       Œ y )NrG   )ÚxorÚlogical_andÚ
logical_orÚlogical_not)rk   ÚsetattrÚbool_handler)r6   Úboolean_operatorsÚops      r"   r8   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$   rk   .c                 ó*   — t        j                  «       S r   ©r	   rE   )r6   rk   r‚   rƒ   s       r"   Ú_defaultzValueRangeAnalysis._defaultª   s   € ô ×"Ñ"Ó$Ð$r$   Úindexc                 ó*   — t        j                  «       S r   r‰   )r6   rk   r‹   s      r"   r&   zValueRangeAnalysis.load¯   s   € Ü×"Ñ"Ó$Ð$r$   rV   Úmodec                  ó   — y r   rY   )r6   rk   r‹   rV   r�   s        r"   ÚstorezValueRangeAnalysis.store²   s   € ð 	r$   ÚdtypeÚ	src_dtypeÚreduction_typec                 ó*   — t        j                  «       S r   r‰   )r6   r�   r‘   r’   rV   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	   Úwrapru   Ú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"   rX   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	   rE   Ú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<   rq   rr   r8   Ústaticmethodr   r	   r   rD   Útuplert   rŠ   r…   r   r&   r   r�   ru   r�   r   r'   Úclassmethodr—   r¢   r•   r¬   r¯   rµ   r¸   rY   r$   r"   rG   rG   ™   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ò *ó ð*ð ð
 )-Ø"&ñ	'KØð'Kà�{‰{ð'Kð —;‘; Ñ%ð'Kð  ð	'Kð
 
�SÑ	ò'Kó ð'KðR ðP�#ð P˜+ cÑ*ò Pó ðPð ð;ˆsð ;�{ 3Ñ'ò ;ó ð;ð ð˜ð  ð ¨°SÑ)9ò ó ðð ð&�Cð &˜Cð & K°Ñ$4ò &ó ñ&r$   rG   )%Úloggingr*   Úcollections.abcr   Ú	functoolsr   Útypingr   r…   r   ru   Ú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<   rJ   r   rG   rY   r$   r"   ú<module>rÇ      ss   ðÛ Û Ý $Ý Ý ã Ý ã ÷ñ õ 2Ý )ß ?Ñ ?ß AÑ Aß 1Ý ð €g×Ñ˜Ó!€÷zñ zôzn&Ð0°.õ n&r$   