ó
    Eñiõ%  ã                   ó  • S SK r S SKrS SKJr  S SKJr  S SKJrJrJ	r	  S SK
r
S SK
Jr  S SKrS SKJrJrJr  SSKJr  SS	KJr  S
SKJrJrJr  S
SKJrJrJr  S
SKJrJr  S
SK J!r!  \ RD                  " \#5      r$ " S S5      r% " S S\\5      r&g)é    N)ÚCallable)Úpartial)ÚAnyÚOptionalÚUnion)ÚExpr)Úbound_sympyÚSymPyValueRangeAnalysisÚValueRangesé   ©ÚPowByNatural)Úint_ooé   )ÚInterpreterShimÚLoopBodyÚLoopBodyBlock)ÚDefaultHandlerÚReductionTypeÚ	StoreMode)Úcache_on_selfÚdominated_nodes)ÚVc                   óv  • \ rS rSrSrS\SS4S jrS\4S jr\	S\
\R                  R                  \\   4   4S j5       rS	\
\\S
\4   4   S\
\\S
\\   4   4   4S jrS\S\
\R                  R                  \\   4   S\S\S	\
\\S
\4   4   S\\   4S jrS\S\\   S\\   4S jrS\S\\   4S jrSrg)Ú	BoundVarsé   aŠ  
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  • S[         [        [        4   S[        4S jnXl        UR                  R                  5        VVs0 s H#  u  p4U[        [           " SU" U5      S-
  5      _M%     snnU l        [        S U R                  R                  5        5       5      U l
        0 U l        g s  snnf )NÚvr   c                 óZ   • [        U [        5      (       a  [        U 5      R                  $ U $ ©N)Ú
isinstancer   r	   Úupper)r    s    ÚS/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/bounds.pyÚupper_boundÚ'BoundVars.__init__.<locals>.upper_bound'   s#   € Ü+5°a¼×+>Ñ+>”;˜q“>×'Ñ'ÐEÀAÐEó    r   r   c              3   óŒ   #   • U  H:  nUR                   S S[        R                  4;   d  SUR                   ;   d  M6  Uv •  M<     g7f)ÚloadÚ	reductionÚmasked_subblockN)ÚtargetÚoperatorÚgetitem)Ú.0Únodes     r%   Ú	<genexpr>Ú%BoundVars.__init__.<locals>.<genexpr>0   s>   é € ð .
â2�Ø�{‰{˜v {´H×4DÑ4DÐEÓEØ  D§K¡KÑ/÷ ‰DÚ2ùs
   ‚5A»	A)r   r   Úintr   Ú
var_rangesÚitemsr   Úreplacement_valsr   Ú	get_nodesÚunbounded_varsÚ_bounds)Úselfr   r&   Úkr    s        r%   Ú__init__ÚBoundVars.__init__&   s®   € ð	Fœ5¤¤s Ñ+ð 	F´ô 	Fð #Œð "×,Ñ,×2Ñ2Ô4ô!
â4‘�ð Œ{œ4Ò  ¡K°£N°QÑ$6Ó7Ò7Ù4ò!
ˆÔô
 .ñ .
àŸ™×0Ñ0Ô2ó.
ó 
ˆÔð @Bˆ�ùó!
s   Á*B,c           
      óœ   • U R                   R                   SU R                   SU R                   SU R                   SU R
                   S3
$ )Nz(loop_body=z,
 replacement_vals=z, 
unbounded_vars=z, 
_bounds=Ú))Ú	__class__Ú__name__r   r7   r9   r:   )r;   s    r%   Ú__repr__ÚBoundVars.__repr__9   s]   € à�~‰~×&Ñ&Ð'ð (ØŸ™Ð(ð ) Ø $× 5Ñ 5Ð6ð 7Ø"×1Ñ1Ð2ð 3Ø—|‘|�n Að	'ð	
r(   c                 óü  • U R                  U R                  R                  5      nU R                   Hn  n[	        UR
                  [        5      (       a$  SUR
                  ;  d  M4  SUR
                  ;  d  MF  [        [           R                  5       U R                  U'   Mp     [        R                  " [        5       5         [        U R                  R                  R                   U5      n["        R%                  SU R                  R                  R                   5        UR'                  [        R(                  " 5       U R                  S9  S S S 5        U R                  $ ! , (       d  f       U R                  $ = f)Nr,   Úset_indirectzget_bounds:
%s©Úinitial_env)Úswap_submodulesr   Ú
submodulesr9   r#   r-   Ústrr   r   Úunknownr:   r   Úset_ops_handlerÚValueRangeAnalysisr   Ú
root_blockÚgraphÚlogÚdebugÚrunÚget_ops_handler)r;   rJ   r1   Úinterpreters       r%   Ú
get_boundsÚBoundVars.get_boundsB   s  € à×)Ñ)¨$¯.©.×*CÑ*CÓDˆ
ð ×'Ô'ˆDä˜dŸk™k¬3×/Ñ/Ø!¨¯©Õ4Ø"¨$¯+©+Õ5ä%0´Ñ%6×%>Ñ%>Ó%@�—‘˜TÓ"ñ (ô ×ÒÔ1Ó3Õ4Ü)¨$¯.©.×*CÑ*C×*IÑ*IÈ:ÓVˆKÜ�I‰IÐ'¨¯©×)BÑ)B×)HÑ)HÔIØ�O‰OœA×-Ò-Ó/¸T¿\¹\ˆOÑJ÷ 5ð �|‰|Ð÷	 5Ô4ð �|‰|Ðús   ÃBE"Å"
E;rJ   .c                 óÈ  ^ ^• 0 mU H×  nUS:X  a  T R                   TU'   M  SU;   aU  T R                  R                  U   nS[        S[        [
        [
        /[        [           4   4UU 4S jjnU" U5      TU'   Mu  SU;   aM  [        U[        S5      S  5      nT R                  R                  U   n[        T R                  U5      nUTU'   MÈ  SU;   d   eX   TU'   MÙ     T$ )NÚ	get_indexr,   Úsubblockr   c                 ó   >^ • UUU 4S j$ )Nc                 ó@   >• TR                  TTR                  XT5      $ r"   )r,   r:   )ÚmaskÚvalueÚresultr;   rZ   s     €€€r%   Ú<lambda>Ú<BoundVars.swap_submodules.<locals>.make_fn.<locals>.<lambda>h   s   ø€ ¨t×/CÑ/CØ  $§,¡,°¸Vô0r(   © )rZ   r_   r;   s   `€€r%   Úmake_fnÚ*BoundVars.swap_submodules.<locals>.make_fne   s   ù€ öð r(   rF   Úscan)rY   r   Ú	subblocksr   r   r   r   r   r4   ÚlenÚindirect_varsr   rF   )	r;   rJ   ÚkeyrZ   rc   ÚidxÚvarÚindirectr_   s	   `       @r%   rI   Ú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(   rZ   Úenvr]   r^   c                 ó2  • [        UR                  U5      nUR                  [        R                  " 5       US9  UR                  R
                   Vs/ s H  owR                  S:X  d  M  UPM     nn[        U5      S:X  d   eUR                  US      $ s  snf )NrG   Úoutputr   r   )	r   rP   rS   r   rT   Únodesr-   rg   rn   )	r;   rZ   rn   r]   r^   rJ   Úinterpr1   rp   s	            r%   r,   ÚBoundVars.masked_subblockx   sƒ   € ô ! §¡°Ó<ˆØ�
‰
”1×$Ò$Ó&°Cˆ
Ñ8Ø#+§>¡>×#7Ò#7ÓSÒ#7˜4¿;¹;È(Ñ;R—$Ñ#7ˆÐSÜ�6‹{˜aÓÐÐð �z‰z˜& ™)Ñ$Ð$ùò	 Ts   ÁBÁ)BÚoldÚnewc                 óP   • [        U[        5      (       d   eX R                  U'   U$ r"   )r#   r   r7   )r;   rt   ru   s      r%   rF   ÚBoundVars.set_indirectˆ   s(   € Ü˜#œ{×+Ñ+Ð+Ð+Ø%(×Ñ˜cÑ"Øˆ
r(   Únamec                 óº   • U R                   R                  U   nU R                  R                  U5      nUc  [	        X R                  5      nX0R                  U'   U$ r"   )r   Úindexing_exprsr7   Úgetr	   )r;   rx   ÚexprÚbounds       r%   rY   ÚBoundVars.get_index�   sV   € Ø�~‰~×,Ñ,¨TÑ2ˆØ×%Ñ%×)Ñ)¨$Ó/ˆØ‰=Ü ×&;Ñ&;Ó<ˆEð ',×Ñ˜dÑ#Øˆr(   )r:   r   r7   r9   )rB   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r=   rK   rC   r   ÚdictÚtorchÚfxÚNoder   r   rV   r   r   rI   r   r,   rF   rY   Ú__static_attributes__rb   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                   óT  • \ rS rSrSS jr\S\S\S\\   4S j5       rS\	S\
\S	4   S\\	\4   S\4S
 jrS\	S\R                  S\\   4S jr S S\	S\R                  S\S\SS4
S jjrS\R&                  S\R&                  S\S\S\\   4
S jr\S\S\R&                  S\\   4S j5       r\  S!S\S\R&                  S\\R&                     S\S\\   4
S jj5       r\S\S\\   4S j5       r\S\S\\   4S j5       r\S\S\S\\   4S j5       r\S\S\S\\   4S j5       rSrg)"rN   é™   r   Nc                 óT   • SU l         SnU H  n[        XU R                  5        M     g )NrN   )ÚxorÚlogical_andÚ
logical_orÚlogical_not)rx   ÚsetattrÚbool_handler)r;   Úboolean_operatorsÚops      r%   r=   ÚValueRangeAnalysis.__init__š   s-   € Ø(ˆŒ	ð
Ðó $ˆBÜ�D˜d×/Ñ/Ö0ò $r(   ÚargsÚkwargsc                  óR   • [        [        R                  [        R                  5      $ r"   )r   ÚsympyÚfalseÚtrue)r”   r•   s     r%   r�   ÚValueRangeAnalysis.bool_handler¥   s   € ô œ5Ÿ;™;¬¯
©
Ó3Ð3r(   rx   .c                 ó,   • [         R                  " 5       $ r"   ©r   rL   )r;   rx   r”   r•   s       r%   Ú_defaultÚValueRangeAnalysis._defaultª   s   € ô ×"Ò"Ó$Ð$r(   Úindexc                 ó,   • [         R                  " 5       $ r"   rœ   )r;   rx   rŸ   s      r%   r*   ÚValueRangeAnalysis.load¯   s   € Ü×"Ò"Ó$Ð$r(   r^   Úmodec                 ó   • g r"   rb   )r;   rx   rŸ   r^   r¢   s        r%   ÚstoreÚValueRangeAnalysis.store²   s   € ð 	r(   ÚdtypeÚ	src_dtypeÚreduction_typec                 ó,   • [         R                  " 5       $ r"   rœ   )r;   r¦   r§   r¨   r^   s        r%   r+   ÚValueRangeAnalysis.reduction·   s   € ô ×"Ò"Ó$Ð$r(   c                 óR   • [        U[        5      (       d   eU R                  X5      $ r"   )r#   r   Úto_dtype)ÚclsrŸ   r¦   s      r%   Ú
index_exprÚValueRangeAnalysis.index_exprÀ   s$   € ä˜%¤×-Ñ-Ð-Ð-Ø�|‰|˜EÓ)Ð)r(   ÚxÚuse_compute_typesc                 ó$  • [         R                  " U 5      n U[        R                  :X  a�  U R	                  5       (       a#  [         R                  " U R
                  S:g  5      $ U R                  (       a  U $ SU ;  a$  [         R                  " [        R                  5      $ [        [        R                  [        R                  5      $ S[        S[        R                  S[        R                  4S jnU R                  (       a`  U R	                  5       (       a1  U R
                  (       a  SOSn[         R                  " U" XQ5      5      $ [        U" SU5      U" SU5      5      $ [        U" U R
                  U5      U" U R                  U5      5      $ )Nr   r°   r¦   r   c                 óÈ   • UR                   (       a  [        R                  " U 5      $ U [        [        * 4;   a  U $  [        R                  " U 5      $ ! [
         a    U s $ f = fr"   )Úis_floating_pointr—   ÚFloatr   ÚIntegerÚ	TypeError)r°   r¦   s     r%   ÚcastÚ)ValueRangeAnalysis.to_dtype.<locals>.castØ   sU   € à×&×&Ü—{’{ 1“~Ð%àœ¤& Ð)Ó)Ø�HðÜ Ÿ=š=¨Ó+Ð+øÜ ó à’Hðús   ¼A ÁA!Á A!r   )r   Úwrapr„   ÚboolÚis_singletonÚlowerÚis_boolr—   r™   r˜   r   r¦   r   r$   )r°   r¦   r§   r±   r¸   Úvals         r%   r¬   Ú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                 ó2   • [         R                  " U S 5      $ )Nc                 ó   • [        U S5      $ )Nr   r   )Úys    r%   r`   Ú+ValueRangeAnalysis.square.<locals>.<lambda>ñ   s   € ¼LÈÈAÔ<Nr(   )r   Úconvex_min_zero_map©r°   s    r%   ÚsquareÚValueRangeAnalysis.squareï   s   € ä×.Ò.¨qÑ2NÓOÐOr(   c                 óL   • [         R                  " U [        R                  5      $ r"   )r   Údecreasing_mapr.   ÚnegrÆ   s    r%   rË   ÚValueRangeAnalysis.negó   s   € ä×)Ò)¨!¬X¯\©\Ó:Ð:r(   ÚaÚbc                 ó|   • U R                  X5      nU[        R                  " 5       :X  a  U$ U R                  U5      $ r"   )Útruedivr   rL   Útrunc)r­   rÍ   rÎ   r°   s       r%   ÚtruncdivÚValueRangeAnalysis.truncdivú   s4   € à�K‰K˜ÓˆØ”×#Ò#Ó%Ó%ØˆHà�y‰y˜‹|Ðr(   c                 óB   • U R                  XR                  U5      5      $ r"   )ÚaddrË   )r­   rÍ   rÎ   s      r%   ÚsubÚValueRangeAnalysis.sub  s   € à�w‰w�qŸ'™' !›*Ó%Ð%r(   )rx   )r   Nr"   )NT) rB   r   r€   r�   r=   Ústaticmethodr   r   r�   rK   Útuplerƒ   r�   r—   r   r*   r   r¤   r„   r¦   r   r+   Úclassmethodr®   r   r»   r¬   rÇ   rË   rÒ   rÖ   r‡   rb   r(   r%   rN   rN   ™   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(   rN   )'Úloggingr.   Úcollections.abcr   Ú	functoolsr   Útypingr   r   r   r—   r   r„   Útorch.utils._sympy.value_rangesr	   r
   r   Úutils._sympy.functionsr   Úutils._sympy.numbersr   r   r   r   r   Úops_handlerr   r   r   Úutilsr   r   Úvirtualizedr   Ú	getLoggerrB   rQ   r   rN   rb   r(   r%   Ú<module>ræ      st   ðÛ Û Ý $Ý ß 'Ñ 'ã Ý ã ÷ñ õ 2Ý )ß ?Ñ ?ß AÑ Aß 1Ý ð ×Ò˜Ó!€÷zñ zôzk&Ð0°.õ k&r(   