ó
    Eñi„i  ã                  óî  • S SK Jr  S SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
JrJrJrJr  S SKrS SKrS SKJr  S SKJrJr  S SKJr  SS	KJr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%J&r&  SSK'J(r(J)r)  \(       a  S SK*J+r+J,r,  \" S5      r- " S S\R\                  R^                  5      r0 " S S\5      r1 " S S\5      r2 " S S\5      r3 " S S5      r4 " S S5      r5 " S S\5      r6 " S S\!5      r7g) é    )ÚannotationsN)ÚautoÚEnum)ÚAnyÚ
NamedTupleÚOptionalÚTYPE_CHECKINGÚTypeVar)Úidentity)ÚScopeÚ
TracerBase)ÚSymTé   )ÚconfigÚdependencies)Úindex_prevent_reordering)ÚDefaultHandlerÚ
OpsHandlerÚWrapperHandler)Úcache_on_selfÚreduction_num_outputsÚsympy_index_symbol_with_prefixÚ
sympy_subs)ÚopsÚV)ÚCallableÚSequenceÚTc                  ór   ^ • \ rS rSr\\R                  S 5       5       rU 4S jrSU 4S jjr	U 4S jr
SrU =r$ )ÚInterpreterShimé%   c                 óH   • [         R                  R                  [        5      $ ©N)ÚtorchÚfxÚsymbolic_tracer   © ó    ÚV/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/loop_body.pyÚ	_dummy_gmÚInterpreterShim._dummy_gm&   s   € ô �x‰x×&Ñ&¤xÓ0Ð0r(   c                ó    >• [         TU ]  U R                  5       SS9  X l        Xl        X l        SU l        UR                  U l        S U l	        g )NF)Úgarbage_collect_values)
ÚsuperÚ__init__r*   ÚmoduleÚgraphÚ
submodulesÚextra_tracebackÚ__getitem__Ú
fetch_attrÚcurrent_node)Úselfr1   r2   Ú	__class__s      €r)   r/   ÚInterpreterShim.__init__+   sJ   ø€ ô 	‰Ñ˜Ÿ™Ó)À%ÐÑHØŒØŒ
Ø$ŒØ$ˆÔØ$×0Ñ0ˆŒØ ˆÕr(   c                ó.   >• Xl         [        TU ]	  U5      $ r#   )r6   r.   Úrun_node)r7   Únr8   s     €r)   r;   ÚInterpreterShim.run_node6   s   ø€ àÔÜ‰wÑ Ó"Ð"r(   c                ó†   >• [         R                  " U 5         [        TU ]  " U0 UD6sS S S 5        $ ! , (       d  f       g = fr#   )r   Úset_interpreter_handlerr.   Úrun)r7   ÚargsÚkwargsr8   s      €r)   r@   ÚInterpreterShim.run;   s.   ø€ Ü×&Ò& tÕ,Ü‘7’; Ð/¨Ñ/÷ -×,×,ús	   ˜2²
A )r6   r3   r5   r1   r0   r2   )r<   ztorch.fx.NodeÚreturnr   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚstaticmethodÚ	functoolsÚcacher*   r/   r;   r@   Ú__static_attributes__Ú__classcell__©r8   s   @r)   r    r    %   s5   ø† ØØ‡_�_ñ1ó ó ð1õ	!÷#÷
0ó 0r(   r    c                  ó(   ^ • \ rS rSrU 4S jrSrU =r$ )ÚLightTraceréA   c                ó¸   >• [         TU ]  5         [        R                  R	                  U R
                  S9U l        [        SS 5      U l        0 U l	        0 U l
        g )N)Ú
tracer_clsÚ )r.   r/   r$   r%   ÚGraphr8   r1   r   ÚscopeÚmodule_stackÚnode_name_to_scope)r7   r8   s    €r)   r/   ÚLightTracer.__init__B   sE   ø€ Ü‰ÑÔÜ—X‘X—^‘^¨t¯~©~�^Ð>ˆŒ
Ü˜2˜t“_ˆŒ
ØˆÔØ"$ˆÕr(   )r1   rW   rX   rV   )rE   rF   rG   rH   r/   rL   rM   rN   s   @r)   rP   rP   A   s   ø† ÷%ó %r(   rP   c                  ó4   • \ rS rSr% S\S'   S\S'   S\S'   Srg)	ÚMemoryEntryéJ   ÚstrÚ
index_nameúOptional[str]Úbuffer_nameÚmoder'   N)rE   rF   rG   rH   Ú__annotations__rL   r'   r(   r)   r[   r[   J   s   ‡ ØƒOØÓØ
Ör(   r[   c                  óv   • \ rS rSr\" 5       r\" 5       r\" 5       r\" 5       r\" 5       r	\" 5       r
\" 5       rSrg)ÚMemoryUsageTypeéP   r'   N)rE   rF   rG   rH   r   ÚLOADÚ	LOAD_SEEDÚSTOREÚSTORE_REDUCTIONÚ
INDEX_EXPRÚCHECK_BOUNDSÚ	BUCKETIZErL   r'   r(   r)   rd   rd   P   s3   † á‹6€DÙ“€IÙ‹F€EÙ“f€OÙ“€JÙ“6€LÙ“ƒIr(   rd   c                  ó¬  ^ • \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   S\S'   S\S'   S\S'    S6U 4S jjrS7S jrS rS r	S8S jr
S9S jrS:S jr      S;S jrS:S jr\S 5       r\S  5       r\S! 5       rS" rS# rS$ rS% rS& rS' rS( rS<S) jr\r  S=       S>S* jjrS+ rS, rS- r S. r!S6S/ jr"SS0.S1 jr#S2 r$S3 r%S4 r&S5r'U =r($ )?ÚLoopBodyé[   zŒ
Captures the body of a Loops subclass into an FX graph.  Persists any
indexing simplifications and makes it easier to analyze loop bodies.
zdict[str, sympy.Expr]Úindexing_exprsúdict[str, Any]r2   zdict[str, LoopBodyBlock]Ú	subblockszlist[sympy.Symbol]Úindirect_varszdict[sympy.Symbol, sympy.Expr]Úindirect_var_rangesÚLoopBodyBlockÚ
root_blockz(dict[MemoryUsageType, list[MemoryEntry]]Úmemory_usageúcollections.Counter[str]Ú	op_countszdict[sympy.Expr, str]Úindexing_exprs_nameFc                ó:  >• [         TU ]  5         [        UR                  5       5      nUS [	        U5       U[	        U5      S  4U l        X@l        XPl        X0l        [        U[        5      (       a  U R                  XU5        OU R                  X5        S U l        g r#   )r.   r/   ÚtupleÚvaluesÚlenÚsizesÚ	iter_varsÚreduce_varsÚ
var_rangesÚ
isinstancern   Ú_init_with_copyÚ_init_with_tracingÚindexing)	r7   ÚfnrA   r‚   r€   r�   Úallow_same_symbol_in_indexÚ_flat_sizesr8   s	           €r)   r/   ÚLoopBody.__init__m   s�   ø€ ô 	‰ÑÔä˜J×-Ñ-Ó/Ó0ˆàÐ(œ#˜i›.Ð)Øœ˜I›Ð(Ð)ð
ˆŒ
ð
 #ŒØ&ÔØ$Œä�bœ(×#Ñ#Ø× Ñ  Ð+EÕFà×#Ñ# BÔ-àˆ�r(   c                óž   • U R                   (       d   eU R                  R                  R                  SSS9S   nUR                  S   nUS   $ )NÚcall_methodÚpartial_accumulate©ÚopÚtargetr   éÿÿÿÿÚnum_reduction_dims)Úhas_partial_accumulaterv   r1   Ú
find_nodesrA   )r7   ÚnodeÚmetas      r)   Úget_original_num_rdimsÚLoopBody.get_original_num_rdims‰   sY   € Ø×*×*Ð*Ð*Ø�‰×$Ñ$×/Ñ/ØÐ%9ð 0ð 
à
ñˆð �y‰y˜‰}ˆØÐ(Ñ)Ð)r(   c                óø   • U R                   R                  5       U l         SU l        U R                  U R                  -   U l        / U l        U R
                  S   U R
                  S   -   [        5       4U l        U $ )NTr   r   )rv   Úextract_pw_from_reductionr“   r€   r�   r   r|   ©r7   s    r)   rš   Ú"LoopBody.extract_pw_from_reduction‘   sd   € ØŸ/™/×CÑCÓEˆŒØ&*ˆÔ#ØŸ™¨$×*:Ñ*:Ñ:ˆŒØˆÔØ—j‘j ‘m d§j¡j°¡mÑ3´U³WÐ=ˆŒ
Øˆr(   c                ó^  • 0 U l         0 U l        SU R                  0U l        0 U l        / U l        0 U l        [         Vs0 s H  o3/ _M     snU l        [        R                  " 5       U l        [        XU5      U l        U R                  R                  R                  SSS9U l        U ?gs  snf )z9Do an FX trace of an arbitrary callable to construct selfÚ	get_indexrŒ   r�   rŽ   N)rp   rz   rž   r2   rr   rs   rt   rd   rw   ÚcollectionsÚCounterry   ru   rv   r1   r”   r“   )r7   r‡   rA   Úts       r)   r…   ÚLoopBody._init_with_tracing™   s¦   € à ˆÔØ#%ˆÔ Ø&¨¯©Ð7ˆŒØˆŒØˆÔØCEˆÔ Ý,;Ó<ªO q šU©OÑ<ˆÔÜ$×,Ò,Ó.ˆŒÜ'¨°$Ó7ˆŒØ&*§o¡o×&;Ñ&;×&FÑ&FØÐ%9ð 'Gð '
ˆÔ#ð Ñ$ùò =s   ¿B*c           	     ó>  • UR                  X#5      nUR                  5        VVs0 s H9  u  pVU[        R                  R                  R                  X`R                  5      _M;     snnU l        UR                  R                  5        VVs0 s H  u  pxXxR                  U 5      _M     snnU l        UR                  U l
        UR                  U l        UR                  U l        UR                  U l        UR                  R                  U 5      U l        UR                  U l        0 UR                   En	U	R#                  S5        SU R$                  0U	R                  5        VVs0 s H  u  pxXxR                  U 5      _M     snnEU l        gs  snnf s  snnf s  snnf )z“
_init_with_tracing() is slow, so this is a fast path in the case
where we are just reordering/merging/splitting the args of an
existing LoopBody.
rž   N)Úindexing_from_argsÚitemsr   r1   ÚsizevarsÚsimplify_with_rangesr‚   rp   rr   Úcloners   rt   rw   ry   rv   r“   r2   Úpoprž   )
r7   ÚotherrA   rˆ   rp   ÚnameÚexprÚkÚvr2   s
             r)   r„   ÚLoopBody._init_with_copy©   s\  € ð ×1Ñ1°$ÓSˆð -×2Ñ2Ô4ô
â4‘
�ð ”!—'‘'×"Ñ"×7Ñ7¸¿o¹oÓNÒNÙ4ò
ˆÔð 8=·±×7LÑ7LÔ7NÔOÒ7N©t¨q˜!ŸW™W T›]Ò*Ñ7NÒOˆŒØ"×0Ñ0ˆÔØ#(×#<Ñ#<ˆÔ Ø!×.Ñ.ˆÔØŸ™ˆŒØ×*Ñ*×0Ñ0°Ó6ˆŒØ&+×&BÑ&BˆÔ#à)˜×(Ñ(Ð)ˆ
Ø�‰�{Ô#à˜Ÿ™ð
à,6×,<Ñ,<Ô,>Ô?Ò,>¡D Aˆq—'‘'˜$“-ÒÑ,>Ò?ð
ˆ�ùó
ùó Pùó @s   ¥A FÂFÅ%Fc                ó@   • U R                   R                  US5      S:„  $ )Nr   )ry   Úget©r7   r«   s     r)   Úhas_opÚLoopBody.has_opÃ   s   € Ø�~‰~×!Ñ! $¨Ó*¨QÑ.Ð.r(   c           	     óä  • U nU R                   nUR                  u  p4Uu  pV/ UR                  R                  5       Qn[        R
                  R                  R                  UU[        XsU5      5      u  p‰n
[        R
                  R                  R                  UU[        XtU5      5      u  p¼n
X…:X  a  X¶:X  a  U$ [        R                  " X‹SS9u  u  nnn[        UU	" U5      U" U5      /UUUSS9nU$ )zE
Merge both iteration and reduction loops and return a new LoopBody.
Úp)ÚprefixT©rˆ   )r   Úvarsrp   r}   r   r1   r¦   Ú_simplify_loopsr   r   Úindex_vars_no_squeezern   )r7   Úold_bodyÚ	old_sizesÚold_iter_varsÚold_reduce_varsÚold_iter_sizesÚold_reduce_sizesÚindex_exprsÚ
iter_sizesÚiter_reindexÚ_Úreduce_sizesÚreduce_reindexr€   r�   r‚   Únew_bodys                    r)   Úmerge_loopsÚLoopBody.merge_loopsÆ   s
  € ð ˆØ—J‘Jˆ	Ø)1¯©Ñ&ˆØ+4Ñ(ˆà9˜×/Ñ/×6Ñ6Ó8Ð9ˆä&'§g¡g×&6Ñ&6×&FÑ&FØØÜ$ [ÀÓPó'
Ñ#ˆ
 !ô +,¯'©'×*:Ñ*:×*JÑ*JØØÜ$ [ÐCSÓTó+
Ñ'ˆ að Ó'¨LÓ,LØˆOô ×.Ò.¨zÐPSÑTñ	
ñØØàäØÙ˜)Ó$¡n°[Ó&AÐBØØØØ'+ñ
ˆð ˆr(   c                ó&  ^^^^^• U mU R                   nUu  mmTT   m[        T5      nX$T'   UT4n[        R                  " USS06u  u  pgnSUUUUU4S jjn	[	        X–U4X†U5      n
[        R                  " USS06u  u  p¼n[	        X«U4XÛU5      n	U	$ )zf
Expand node on `dimension` to `new_range` and rely on index modular to avoid
out-of-boundary access.
r·   r¡   c                 ó  >• / [         R                  R                  U 5      Qn[        U5      [        T5      [        T	5      -   :X  d   eUS [        T5       nU[        T5      S  n[	        U5      nUT   T-  UT'   T" XC5      $ r#   )Ú	itertoolsÚchainÚfrom_iterabler~   Úlist)
ÚindicesÚindexÚiter_idxÚ
reduce_idxÚnew_iter_idxÚ	dimensionÚ	iter_sizer¼   Úoriginal_rangeÚreduce_sizes
        €€€€€r)   rÈ   Ú>LoopBody.expand_dimension_for_pointwise_node.<locals>.new_body  s†   ø€ Ø=”i—o‘o×3Ñ3°GÓ<Ð=ˆEÜ�u“:¤ Y£´#°kÓ2BÑ!BÓBÐBÐBØÐ-œs 9›~Ð.ˆHØœs 9›~Ð/Ð0ˆJä ›>ˆLØ&.¨yÑ&9¸NÑ&JˆL˜Ñ#á˜LÓ5Ð5r(   r¶   ©rÑ   zSequence[sympy.Expr]rD   r   )r   rÐ   r   r»   rn   )r7   rÖ   Ú	new_ranger½   Únew_iter_sizeÚ	new_sizesr€   r�   r‚   rÈ   Ú	loop_bodyÚ
iter_vars2Úreduce_vars2Úvar_ranges2r×   r¼   rØ   rÙ   s    `            @@@@r)   Ú#expand_dimension_for_pointwise_nodeÚ,LoopBody.expand_dimension_for_pointwise_nodeò   sË   ü€ ð ˆØ—J‘Jˆ	à!*Ñˆ	�;Ø" 9Ñ-ˆÜ˜Y›ˆØ#,�iÑ Ø" KÐ0ˆ	ä/;×/QÒ/QØð0
àñ0
Ñ,Ñ ˆ *÷
		6ó 		6ô Ø +Ð.°
À{ó
ˆ	ô
 3?×2TÒ2TØð3
àñ3
Ñ/Ñ"ˆ Kô Ø LÐ1°;ÈLó
ˆð ˆr(   c                ó°  ^^^^• SSK Jn  U mU R                  n[        US   5      [        U5      :X  d   eU" U5      nUu  mmU" T5      nUT4n[        R
                  " USS06u  u  pxn	[        U5       V
Vs0 s H  u  p«Xº_M	     snn
m[        [        U5      5       Vs/ s H  nTU   PM
     snmSUUUU4S jjn[        UXx4U	UU5      $ s  snn
f s  snf )z4
Reorder iteration loops and return a new LoopBody.
r   )Úsame_reorderr   r·   r¶   c                 ó
  >• / [         R                  R                  U 5      Qn[        U5      [        T5      [        T5      -   :X  d   eUS [        T5       nU[        T5      S  nT Vs/ s H  oBU   PM	     nnT" X#SS9$ s  snf )NTr¸   )rÍ   rÎ   rÏ   r~   )	rÑ   rÒ   rÓ   rÔ   ÚiÚinverse_orderr×   r¼   rÙ   s	        €€€€r)   rÈ   Ú-LoopBody.reorder_iter_loops.<locals>.new_body9  s†   ø€ Ø=”i—o‘o×3Ñ3°GÓ<Ð=ˆEÜ�u“:¤ Y£´#°kÓ2BÑ!BÓBÐBÐBØÐ-œs 9›~Ð.ˆHØœs 9›~Ð/Ð0ˆJÙ-:Ó;ª]¨ œ©]ˆHÐ;Ù˜HÈTÑRÐRùò <s   Á)B rÛ   )	Úirræ   r   r~   r   r»   Ú	enumerateÚrangern   )r7   Ú	new_orderræ   r½   Ú
reorder_fnrÝ   rÞ   r€   r�   r‚   ÚaÚbrè   rÈ   ré   r×   r¼   rÙ   s                 @@@@r)   Úreorder_iter_loopsÚLoopBody.reorder_iter_loops!  s÷   û€ õ 	%àˆØ—J‘Jˆ	Ü�9˜Q‘<Ó ¤C¨	£NÓ2Ð2Ð2Ù! )Ó,ˆ
à!*Ñˆ	�;Ù" 9Ó-ˆà" KÐ0ˆ	ä/;×/QÒ/QØð0
àñ0
Ñ,Ñ ˆ *ô
 +4°IÔ*>Ô?Ò*>¡$ !˜šÑ*>Ò?ˆÜ38¼¸Y»Ô3HÓIÒ3H¨a˜ qÔ)Ñ3HÑIˆ÷	Sò 	Sô ØØÐ$ØØØó
ð 	
ùó @ùÚIs   Á8CÂ Cc                ón   • U R                   c   eU R                  c   eU R                   U R                  4$ r#   )r€   r�   r›   s    r)   r¹   ÚLoopBody.varsI  s9   € à�~‰~Ñ)Ð)Ð)Ø×ÑÑ+Ð+Ð+Ø�~‰~˜t×/Ñ/Ð/Ð/r(   c                óò   • [         R                  " U R                  R                  4S U R                  R                  5        5       5      nU VVs/ s H  o"R                    H  o3PM     M     snn$ s  snnf )Nc              3  ó8   #   • U  H  oR                   v •  M     g 7fr#   )r1   )Ú.0Úblocks     r)   Ú	<genexpr>Ú%LoopBody.get_nodes.<locals>.<genexpr>S  s   é € Ð>Ò&=˜U�[Ž[Ò&=ùs   ‚)rÍ   rÎ   rv   r1   rr   r}   Únodes)r7   Ú
all_graphsr1   r•   s       r)   Ú	get_nodesÚLoopBody.get_nodesO  sY   € ä—_’_Ø�_‰_×"Ñ"Ð$Ù> d§n¡n×&;Ñ&;Ô&=Ó>ó
ˆ
ñ #-ÔE¢*˜¿½°’¹‘¡*ÒEÐEùÓEs   ÁA3c                ó   • SSK Jn  U" U 5      $ )Nr   )Ú	BoundVars)Úboundsr  )r7   r  s     r)   r  ÚLoopBody.boundsW  s   € õ 	&á˜‹Ðr(   c                óÈ   • [        U R                  [        R                     5       H.  nUR                  U:X  d  M  U R
                  UR                     s  $    [        U5      er#   )Úreversedrw   rd   rf   r`   rp   r^   ÚKeyError©r7   r`   Úentrys      r)   Úget_read_exprÚLoopBody.get_read_expr^  sU   € ä˜d×/Ñ/´×0DÑ0DÑEÖFˆEØ× Ñ  KÕ/Ø×*Ñ*¨5×+;Ñ+;Ñ<Ò<ñ Gô �{Ó#Ð#r(   c                ó  • [         R                  " U R                  [        R                     U R                  [        R
                     5       H.  nUR                  U:X  d  M  U R                  UR                     s  $    [        U5      er#   )
rÍ   rÎ   rw   rd   rh   ri   r`   rp   r^   r  r  s      r)   Úget_write_exprÚLoopBody.get_write_expre  sq   € Ü—_’_Ø×Ñœo×3Ñ3Ñ4Ø×Ñœo×=Ñ=Ñ>ö
ˆEð × Ñ  KÕ/Ø×*Ñ*¨5×+;Ñ+;Ñ<Ò<ñ
ô �{Ó#Ð#r(   c                ó–   • U R                   [        R                      Vs/ s H  nU R                  UR                     PM     sn$ s  snf r#   )rw   rd   rf   rp   r^   ©r7   r  s     r)   Úget_read_exprsÚLoopBody.get_read_exprsn  sK   € ð ×*Ñ*¬?×+?Ñ+?Ò@ó
â@�ð ×Ñ × 0Ñ 0Ô1Ù@ñ
ð 	
ùò 
s    #Ac                óØ   • / n[        U R                  [        R                     5       H=  nUR                  U:X  d  M  UR                  U R                  UR                     5        M?     U$ r#   )r  rw   rd   rf   r`   Úappendrp   r^   ©r7   r`   Úoutr  s       r)   Úget_all_read_exprÚLoopBody.get_all_read_exprt  sZ   € àˆÜ˜d×/Ñ/´×0DÑ0DÑEÖFˆEØ× Ñ  KÕ/Ø—
‘
˜4×.Ñ.¨u×/?Ñ/?Ñ@ÖAñ Gð ˆ
r(   c                óö   • [         R                  " U R                  [        R                     U R                  [        R
                     5       Vs/ s H  nU R                  UR                     PM     sn$ s  snf r#   )rÍ   rÎ   rw   rd   rh   ri   rp   r^   r  s     r)   Úget_write_exprsÚLoopBody.get_write_exprs|  so   € ô #ŸšØ×!Ñ!¤/×"7Ñ"7Ñ8Ø×!Ñ!¤/×"AÑ"AÑBôó
ò�ð ×Ñ × 0Ñ 0Ô1ññ
ð 	
ùò 
s   Á#A6c                ó&  • / n[         R                  " U R                  [        R                     U R                  [        R
                     5       H=  nUR                  U:X  d  M  UR                  U R                  UR                     5        M?     U$ r#   )
rÍ   rÎ   rw   rd   rh   ri   r`   r  rp   r^   r  s       r)   Úget_all_write_exprÚLoopBody.get_all_write_expr…  sv   € ØˆÜ—_’_Ø×Ñœo×3Ñ3Ñ4Ø×Ñœo×=Ñ=Ñ>ö
ˆEð × Ñ  KÕ/Ø—
‘
˜4×.Ñ.¨u×/?Ñ/?Ñ@ÖAñ
ð ˆ
r(   c           	     óÒ  • S[        U R                  5       3/nUR                  U R                  R	                  5        VVs/ s H  u  p#U SU 3PM     snn5        UR                  [
        R                  " SU R                  4/U R                  R	                  5       5       VVs/ s H  u  p$UR                  U5      PM     snn5        SR                  U5      $ s  snnf s  snnf )Nzvar_ranges = z = ÚbodyÚ
)Údictr‚   Úextendrp   r¥   rÍ   rÎ   rv   rr   Ú	debug_strÚjoin)r7   Úlinesr«   Úvalrù   s        r)   r#  ÚLoopBody.debug_str�  sÏ   € Ø ¤ d§o¡oÓ!6Ð 7Ð8Ð9ˆØ�‰¸×9LÑ9L×9RÑ9RÔ9TÔUÒ9T©I¨D˜˜˜c # Ó'Ñ9TÒUÔVØ�‰ô $-§?¢?Ø˜dŸo™oÐ.Ð/°·±×1EÑ1EÓ1Gô$ôò$‘K�Dð —‘ Ö%ñ$òô	
ð �y‰y˜ÓÐùó Vùós   ÁC
Â'C#
c                ó6  • [        U R                  [        R                     5      S:H  =(       aj    [        U R                  [        R                     5      S:H  =(       a:    [        U R
                  5      S:H  =(       a    U R                  R                  S5      $ )z`
True of this contains only a single loads and store.
Note, this could involve a layout change.
r   )ÚloadÚstore)r~   rw   rd   rf   rh   r2   rv   Úcontains_only_opsr›   s    r)   Úis_memory_copyÚLoopBody.is_memory_copyœ  s}   € ô �×!Ñ!¤/×"6Ñ"6Ñ7Ó8¸AÑ=÷ EÜ�D×%Ñ%¤o×&;Ñ&;Ñ<Ó=ÀÑB÷Eä�D—O‘OÓ$¨Ñ)÷Eð —‘×1Ñ1Ð2CÓDð		
r(   c                ó  • U R                   R                  U5      nU(       d4  S[        U R                  5       3nXPR                   U'   XR                  U'   U R                  U   R                  [        XSU5      5        U$ )NrÒ   )rz   r±   r~   rp   rw   r  r[   )r7   r¬   Úmtyper`   ra   r«   s         r)   Úadd_index_exprÚLoopBody.add_index_exprª  sv   € ð ×'Ñ'×+Ñ+¨DÓ1ˆÞØœ3˜t×2Ñ2Ó3Ð4Ð5ˆDØ-1×$Ñ$ TÑ*Ø(,×Ñ Ñ%Ø×Ñ˜%Ñ ×'Ñ'¬°DÀtÓ(LÔMØˆr(   c                ó¨   • US   R                  5       (       a  X R                  ;  a  UnOU [        U R                  5       3nXR                  U'   U$ )zaNot actually for nn.Modules, but subblocks in generated code are mapped to FX call_module opcodesr‘   )Ú	isnumericr2   r~   )r7   rù   r·   r«   s       r)   Úadd_submoduleÚLoopBody.add_submodule¹  sL   € à�"‰:×Ñ×!Ñ! f·O±OÓ&CØ‰Dà�Xœc $§/¡/Ó2Ð3Ð4ˆDØ %�‰˜ÑØˆr(   c                óÔ   • [        [        R                  [        U R                  5      5      nX R
                  ;  d   eU R                  R                  U5        XR
                  U'   U$ r#   )r   r   ÚINDIRECTr~   rs   rt   r  )r7   ÚsizeÚvars      r)   Úadd_indirectÚLoopBody.add_indirectÂ  sV   € Ü,¬T¯]©]¼CÀ×@RÑ@RÓ<SÓTˆØ×2Ñ2Ó2Ð2Ð2Ø×Ñ×!Ñ! #Ô&Ø(,× Ñ  Ñ%Øˆ
r(   c           
     óà   • [        U5      [        U5      :X  a  gU R                  c   eU R                  R                  5        VVs0 s H  u  p4U[        XAU05      _M     snnU l        gs  snnf )z,Swap in a variable used in indirect indexingN)r]   r†   r¥   r   )r7   ÚoldÚnewr­   r®   s        r)   Úreplace_indirectÚLoopBody.replace_indirectÉ  s]   € äˆs‹8”s˜3“xÓØØ�}‰}Ñ(Ð(Ð(àBFÇ-Á-×BUÑBUÔBWÔXÒBW¹$¸!˜œJ q°¨*Ó5Ò5ÑBWÒXˆ�ùÓXs   ÁA*c                ó>   • U R                   c   eU R                   U   $ r#   )r†   r²   s     r)   rž   ÚLoopBody.get_indexÑ  s!   € Ø�}‰}Ñ(Ð(Ð(Ø�}‰}˜TÑ"Ð"r(   c           	     óü  ^ • / [         R                  R                  U5      Qn[        U5      [        T R                  5      :X  d   UT R                  45       eU(       d3  [        U 4S jU 5       5      (       d   ST R                  < SU< 35       e[        [        T R                  R                  5       U5      5      nT R                  R                  5        VVs0 s H  u  pVU[        Xd5      _M     snn$ s  snnf )Nc              3  ó@   >#   • U  H  oTR                   ;  v •  M     g 7fr#   )r‚   )rø   r®   r7   s     €r)   rú   Ú.LoopBody.indexing_from_args.<locals>.<genexpr>Ø  s   øé € ð 1
Ú.3¨�T—_‘_Ö$ªeùs   ƒzself.var_ranges=z
, indices=)rÍ   rÎ   rÏ   r~   r‚   Úallr!  ÚzipÚkeysrp   r¥   r   )r7   rÑ   rˆ   rÒ   Úreplacementsr«   r¬   s   `      r)   r¤   ÚLoopBody.indexing_from_argsÕ  sç   ø€ Ø9”)—/‘/×/Ñ/°Ó8Ð9ˆÜ�5‹zœS §¡Ó1Ó1ÐK°E¸4¿?¹?Ð3KÓKÐ1Þ)¬Sô 1
Ù.3ó1
÷ .
ñ .
ð 	-àˆd�o‰oÑ˜{ '¡Ð,ó	-ð 
ô œC §¡× 4Ñ 4Ó 6¸Ó>Ó?ˆð #×1Ñ1×7Ñ7Ô9ô
â9‘
�ð ”*˜TÓ0Ò0Ù9ò
ð 	
ùó 
s   ÃC8r¸   c               ó`   • U R                  X!5      U l        U R                  5       nS U l        U$ r#   )r¤   r†   rv   )r7   rˆ   rÑ   Úresults       r)   Ú__call__ÚLoopBody.__call__â  s,   € Ø×/Ñ/°ÓTˆŒØ—‘Ó"ˆØˆŒØˆr(   c                óz   ^ ^^^^• UU UUU4S jn[         R                  " [        R                  TTTTS9Ul        U$ )Nc           	     ój   >• TR                  T[        R                  R                  U TTT5      5        g r#   )r?  r   r   Úindirect_indexing)Únew_varÚcheckr7   r8  r9  Úwrap_negs    €€€€€r)   Úset_indirectÚ5LoopBody.bind_set_indirect_shim.<locals>.set_indirecté  s+   ø€ Ø×!Ñ!Ø”Q—U‘U×,Ñ,¨W°d¸EÀ8ÓLõr(   )r9  r8  rS  rT  )rJ   Úpartialrn   Úbind_set_indirect_shimr¨   )r7   r9  r8  rS  rT  rU  s   ````` r)   rX  ÚLoopBody.bind_set_indirect_shimè  s?   ü€ ÷	ñ 	ô
 '×.Ò.Ü×+Ñ+ØØØØñ
ˆÔð Ðr(   c                ód   ^• U4S jn[         R                  " [        R                  TS9Ul        U$ )Nc                óF   >• [         R                  R                  U TU5      $ r#   )r   r   Úscan)Údtypesr}   Ú
combine_fns     €r)   ÚshimÚ%LoopBody.bind_scan_shim.<locals>.shimø  s   ø€ Ü—5‘5—:‘:˜f j°&Ó9Ð9r(   )r^  )rJ   rW  rn   Úbind_scan_shimr¨   )r7   r^  r_  s    ` r)   ra  ÚLoopBody.bind_scan_shim÷  s)   ø€ õ	:ô ×&Ò&¤x×'>Ñ'>È:ÑVˆŒ
Øˆr(   c                óh   ^ ^• UU 4S jn[         R                  " [        R                  TS9Ul        U$ )Nc                ó`   >• [         R                  R                  U TR                  T   U5      $ r#   )r   r   Úmaskedrr   )Úmaskrª   r«   r7   s     €€r)   r_  Ú'LoopBody.bind_masked_shim.<locals>.shimÿ  s#   ø€ Ü—5‘5—<‘<  d§n¡n°TÑ&:¸EÓBÐBr(   )r«   )rJ   rW  rn   Úbind_masked_shimr¨   )r7   r«   r_  s   `` r)   rh  ÚLoopBody.bind_masked_shimþ  s*   ù€ ö	Cô ×&Ò&¤x×'@Ñ'@ÀtÑLˆŒ
Øˆr(   )r“   r†   rp   rz   rt   rs   r€   rw   ry   r�   rv   r   rr   r2   r‚   )F)rD   Úint)rª   rn   )r«   r]   )rD   rn   )rÖ   rj  rÜ   rj  rD   rn   ©rD   Úbool©NN)r¬   ú
sympy.Exprr/  rd   r`   r_   ra   r_   ))rE   rF   rG   rH   Ú__doc__rb   r/   r—   rš   r…   r„   r³   rÉ   rã   rò   Úpropertyr¹   r   rþ   r  r	  r  r  r  r  r  r#  r,  Ú__repr__r0  r4  r:  r?  rž   r¤   rM  rX  ra  rh  rL   rM   rN   s   @r)   rn   rn   [   sh  ø‡ ñð
 *Ó)ØÓØ'Ó'Ø%Ó%Ø7Ó7ØÓØ:Ó:Ø'Ó'ð /Ó.ð $)÷ô8*òò%ô 
ô4/ô*ðX-Øð-Ø),ð-à	ô-ô^&
ðP ñ0ó ð0ð
 ñFó ðFð ñó ðò$ò$ò
òò
òò ô

ð €Hð &*Ø"ðàðð ðð #ð	ð
 õòòòYò#ô
ð =Bõ òò÷ð r(   rn   c                  óL   • \ rS rSrSrSS jrS rS rSS jrSS jr	SS jr
S	rg
)ru   i  zð
Captures the body of a Loops subclass into an FX graph.
In normal cases there will be a 1:1 mapping between LoopBody and
LoopBodyBlock, however in the case of ops.masked() the masked out
operations will manifest as an extra LoopBodyBlock.
c                óØ  • Xl         [        5       nUR                  SSS0 5      nSSKJn  [        [        XQU5      UR                  5      n[        R                  (       a1  U" XpR                   R                  U R                   R                  5      n[        R                  " U5         [        R                  " U" U6 5        S S S 5        UR                   U l        g ! , (       d  f       N = f)NÚplaceholderr   r'   r   )ÚIndexPropagation)r  rP   Úcreate_proxyÚindex_propagationru  ÚCountOpsÚCaptureIndexingry   r   Úconstant_and_index_propagationr‚   rt   r   Úset_ops_handlerr   Úoutputr1   )r7   r  r‡   rA   ÚtracerÚ	proxy_opsru  Úhandlers           r)   r/   ÚLoopBodyBlock.__init__  s­   € ØŒ	ä“ˆØ×'Ñ'¨°u¸bÀ"ÓEˆ	å7äÜ˜I¨VÓ4Ø�N‰Nó
ˆô ×0×0Ù&ØŸ™×-Ñ-¨t¯y©y×/LÑ/LóˆGô ×Ò˜wÕ'ô �JŠJ‘r˜4�yÔ!÷ (ð —\‘\ˆ�
÷	 (Õ'ús   Â'CÃ
C)c           	     óª  • S nS nU R                   R                   H;  nUR                  S:X  a  U(       a   eUnUR                  S:X  d  M0  U(       a   eUnM=     U(       d   eU(       d   eUR                  S   nUR                  S   nUR                  S   nUR                  S   nS[	        U R
                  R                  5      0nU R                   R                  U5         U R                   R                  SXvXEU45        S S S 5        U R                   R                  U5        U R                   R                  U5        U $ ! , (       d  f       NF= f)	NÚ	reductionÚstore_reductionéþÿÿÿr‘   r   r   r’   r�   )
r1   rü   r�   rA   r~   r  r�   Úinserting_afterrŒ   Ú
erase_node)	r7   Úredr*  r•   Úreduction_typeÚred_argÚbufr   Ú
extra_metas	            r)   rš   Ú'LoopBodyBlock.extract_pw_from_reduction%  s  € ØˆØˆØ—J‘J×$Ô$ˆDØ�{‰{˜kÓ)Þ��wØ�Ø�{‰{Ð/Õ/Þ Ð �yØ’ñ %ö ˆ
ˆsÞˆˆuØŸ™ "™ˆØ—(‘(˜2‘,ˆØ�j‰j˜‰mˆØ�j‰j˜‰mˆð !¤# d§i¡i×&;Ñ&;Ó"<ð
ˆ
ð �Z‰Z×'Ñ'¨Õ.Ø�J‰J×"Ñ"Ø$ s°È*Ð&Uô÷ /ð 	�
‰
×Ñ˜eÔ$Ø�
‰
×Ñ˜cÔ"Øˆ÷ /Õ.ús   Ã$ EÅ
Ec                ó    • U R                   nU R                  R                  n[        X5      R	                  [
        R                  " 5       5      $ r#   )r1   r  r2   r    r@   r   Úget_ops_handler)r7   r1   r2   s      r)   rM  ÚLoopBodyBlock.__call__A  s9   € Ø—
‘
ˆØ—Y‘Y×)Ñ)ˆ
ä˜uÓ1×5Ñ5´a×6GÒ6GÓ6IÓJÐJr(   c           
     ó  • [         R                  R                  U R                  R                  U R
                  5      R                  n[        R                  " SSUR                  5       R                  SSU S35      5      $ )Nz;[^\n]*rT   zdef forward(zdef Ú()r$   r%   ÚGraphModuler  r2   r1   ÚcodeÚreÚsubÚstripÚreplace)r7   r«   r“  s      r)   r#  ÚLoopBodyBlock.debug_strG  sa   € Ü�x‰x×#Ñ# D§I¡I×$8Ñ$8¸$¿*¹*ÓE×JÑJˆÜ�vŠvàØØ�J‰J‹L× Ñ  °4¸°v¸Q°Ó@ó	
ð 	
r(   c                ó\   ^• [        U4S jU R                  R                  SS9 5       5      $ )Nc              3  óB   >#   • U  H  nUR                   T;   v •  M     g 7fr#   )r�   )rø   r•   Úallowed_opss     €r)   rú   Ú2LoopBodyBlock.contains_only_ops.<locals>.<genexpr>Q  s!   øé € ð 
â?�ð �K‰K˜;Ö&Ú?ùs   ƒrŒ   )r�   )rF  r1   r”   )r7   r›  s    `r)   r+  ÚLoopBodyBlock.contains_only_opsP  s/   ø€ Üô 
àŸ
™
×-Ñ-°Ð-Ñ?ó
ó 
ð 	
r(   c                óŽ   • [         R                  [         5      nUR                  R                  0 U R                  ESU0E5        U$ )z'Shallow copy with a new parent LoopBodyr  )ru   Ú__new__Ú__dict__Úupdate)r7   r  Úcopys      r)   r¨   ÚLoopBodyBlock.cloneV  s:   € ä×$Ñ$¤]Ó3ˆØ�‰×ÑÐ< §¡Ð<¨v°tÑ<Ô=Øˆr(   )r  r1   N)r  rn   r‡   úCallable[..., Any]rA   z	list[Any])rù   rk  )r  rn   )rE   rF   rG   rH   ro  r/   rš   rM  r#  r+  r¨   rL   r'   r(   r)   ru   ru     s&   † ñô"ò.ò8Kô
ô
÷r(   ru   c                  ó(   • \ rS rSrSS jrSS jrSrg)rx  i]  c                ó   • Xl         X l        g r#   )Ú_innerÚ_counts)r7   ÚinnerÚcountss      r)   r/   ÚCountOps.__init__^  s   € ØŒØ�r(   c                óh   • U R                   U==   S-  ss'   [        U R                  U5      " U0 UD6$ )Nr   )r¨  Úgetattrr§  )r7   r«   rA   rB   s       r)   Ú_defaultÚCountOps._defaultb  s1   € Ø�‰�TÓ˜aÑÓÜ�t—{‘{ DÔ)¨4Ð:°6Ñ:Ð:r(   )r¨  r§  N)r©  úOpsHandler[Any]rª  rx   )r«   r]   rA   ztuple[Any, ...]rB   rq   rD   r   )rE   rF   rG   rH   r/   r®  rL   r'   r(   r)   rx  rx  ]  s   † ô÷;r(   rx  c                  óê   ^ • \ rS rSrS r      SU 4S jjrSS jrSS jrSS jrSS jr	SS jr
S rS	 rS
 rS r  S               SS jjrSS jr  SS jrS rS rSS jrS rSrU =r$ )ry  ig  c                ó<   >• [         TU ]  U5        X l        X0l        g r#   )r.   r/   r  r}  )r7   r©  r  r}  r8   s       €r)   r/   ÚCaptureIndexing.__init__j  s   ø€ ô 	‰Ñ˜ÔØŒ	Ø�r(   c           	     óv   • U R                   R                  SSU R                  R                  " X40 UD640 5      $ )NÚcall_modulerž   )r}  rv  r  r0  )r7   r¬   r/  rB   s       r)   Ú
_add_indexÚCaptureIndexing._add_indext  s<   € Ø�{‰{×'Ñ'ØØØ�Y‰Y×%Ò% dÑ<°VÑ<Ð>Øó	
ð 	
r(   c                ó|   • [         R                  R                  R                  XR                  R
                  5      $ r#   )r   r1   r¦   r§   r  r‚   )r7   r¬   s     r)   Ú	_simplifyÚCaptureIndexing._simplify|  s'   € Ü�w‰w×Ñ×4Ñ4°T¿9¹9×;OÑ;OÓPÐPr(   c                ó˜   • U R                  U5      nU R                  U[        R                  US9nU R                  R                  X5      $ ©N©r`   )r¹  r¶  rd   rf   r§  r)  ©r7   r«   rÒ   s      r)   r)  ÚCaptureIndexing.load  s?   € Ø—‘˜uÓ%ˆØ—‘ ¤×';Ñ';È�ÐNˆØ�{‰{×Ñ Ó,Ð,r(   c                óà   • [        U[        5      (       d   eU R                  R                  [        R
                  " U5      [        R                  US9  U R                  R                  X5      $ r¼  )
rƒ   rj  r  r0  ÚsympyÚIntegerrd   rg   r§  Ú	load_seedr¾  s      r)   rÃ  ÚCaptureIndexing.load_seed„  sY   € Ü˜%¤×%Ñ%Ð%Ð%Ø�	‰	× Ñ Ü�MŠM˜%Ó ¤/×";Ñ";Èð 	!ñ 	
ð �{‰{×$Ñ$ TÓ1Ð1r(   c                óš   • U R                  U5      nU R                  U[        R                  XS9nU R                  R                  XX45      $ )N)r`   ra   )r¹  r¶  rd   rh   r§  r*  )r7   r«   rÒ   Úvaluera   s        r)   r*  ÚCaptureIndexing.store‹  sI   € Ø—‘˜uÓ%ˆØ—‘Ø”?×(Ñ(°dð  ð 
ˆð �{‰{× Ñ  ¨eÓ:Ð:r(   c                óš   • U R                  U5      nU R                  U[        R                  US9nU R                  R                  XU5      $ r¼  )r¹  r¶  rd   ri   r§  rƒ  )r7   r«   rÒ   rÆ  s       r)   rƒ  ÚCaptureIndexing.store_reduction’  sI   € Ø—‘˜uÓ%ˆØ—‘Ø”?×2Ñ2Àð  ð 
ˆð �{‰{×*Ñ*¨4¸Ó>Ð>r(   c                óž   ^• U R                   R                  XX45      m[        U5      nUS:”  a  [        U4S j[	        U5       5       5      $ T$ )Nr   c              3  ó.   >#   • U  H
  nTU   v •  M     g 7fr#   r'   ©rø   rè   rL  s     €r)   rú   Ú,CaptureIndexing.reduction.<locals>.<genexpr>�  s   øé € Ð?Ò,> q˜ žÒ,>ùó   ƒ)r§  r‚  r   r|   rí   )r7   ÚdtypeÚ	src_dtyperˆ  rÆ  Únum_outputsrL  s         @r)   r‚  ÚCaptureIndexing.reduction™  sE   ø€ Ø—‘×&Ñ& u¸ÓOˆÜ+¨NÓ;ˆØ˜‹?ÜÔ?¬E°+Ô,>Ó?Ó?Ð?Øˆr(   c                ó.  • U R                  U5      n[        U[        [        R                  45      (       a%  U R
                  R                  [        U5      U5      $ U R                  U[        R                  5      nU R
                  R                  X5      $ r#   )r¹  rƒ   rj  rÁ  rÂ  r§  Úconstantr¶  rd   rj   Ú
index_expr)r7   rÒ   rÏ  s      r)   rÕ  ÚCaptureIndexing.index_expr   sl   € Ø—‘˜uÓ%ˆÜ�eœc¤5§=¡=Ð1×2Ñ2Ø—;‘;×'Ñ'¬¨E«
°EÓ:Ð:Ø—‘ ¤×'AÑ'AÓBˆØ�{‰{×%Ñ% eÓ3Ð3r(   c                óÜ   • U R                  U5      nU R                  U[        R                  5      nU R                  U[        R                  5      nU R                  R                  XX45      $ r#   )r¹  r¶  rd   rk   r§  Úcheck_bounds)r7   rÒ   r8  ÚlowerÚuppers        r)   rØ  ÚCaptureIndexing.check_bounds§  sS   € Ø—‘˜uÓ%ˆØ—‘ ¤×'CÑ'CÓDˆØ�‰˜t¤_×%AÑ%AÓBˆØ�{‰{×'Ñ'¨°UÓBÐBr(   c           	     ó‚  • US   U R                  US   [        R                  US   S9U R                  US   [        R                  US   S9U R                  US   [        R                  US   S94nUb*  US   U R                  US   [        R                  US   S94nU R                  R	                  UUUUUUU5      $ )z#
See [Note: Inductor bucketize op]
r   r   r½  é   é   )r¶  rd   rl   r§  Ú	bucketize)r7   r}   Ú
boundariesÚboundary_indicesÚindexing_dtypeÚrightÚsorterÚsorter_indicess           r)   rß  ÚCaptureIndexing.bucketize­  sø   € ð �q‰MØ�O‰OØ˜1‘Ü×)Ñ)Ø& q™Mð ð ð
 �O‰OØ˜1‘Ü×)Ñ)Ø& q™Mð ð ð
 �O‰OØ˜1‘Ü×)Ñ)Ø& q™Mð ð ð
ˆ
ð$ Ñà�q‘	Ø—‘Ø˜1‘Iœ×8Ñ8ÀfÈQÁið  ð ðˆFð �{‰{×$Ñ$ØØØØØØØó
ð 	
r(   c                ó8  • U R                   R                  SS5      nU R                   R                  U5      U R                   R                  U'   [	        U R                   U/ 5      U R                   R
                  U'   U R                  R                  SXAU40 5      $ )zB
Recursively capture the masked out body in another LoopBodyBlock
NÚmasked_subblockrµ  )r  r4  rh  r2   ru   rr   r}  rv  )r7   Ú
mask_proxyÚmasked_bodyÚother_proxyr«   s        r)   re  ÚCaptureIndexing.maskedÞ  s‚   € ð �y‰y×&Ñ& tÐ->Ó?ˆØ%)§Y¡Y×%?Ñ%?ÀÓ%Eˆ�	‰	×Ñ˜TÑ"Ü$1°$·)±)¸[È"Ó$Mˆ�	‰	×Ñ˜DÑ!Ø�{‰{×'Ñ'Ø˜4¨kÐ!:¸Bó
ð 	
r(   c                óþ   ^• U R                   R                  U5      nU R                   R                  US5      nU R                  R	                  SUX40 5      m[        U4S j[        [        U5      5       5       5      $ )Nr\  rµ  c              3  ó.   >#   • U  H
  nTU   v •  M     g 7fr#   r'   rÌ  s     €r)   rú   Ú'CaptureIndexing.scan.<locals>.<genexpr>ø  s   øé € Ð@Ò(? 1�V˜A–YÒ(?ùrÎ  )r  ra  r4  r}  rv  r|   rí   r~   )r7   Údtype_proxyr^  Úvalue_proxyr_  r«   rL  s         @r)   r\  ÚCaptureIndexing.scané  so   ø€ ð �y‰y×'Ñ'¨
Ó3ˆØ�y‰y×&Ñ& t¨VÓ4ˆØ—‘×)Ñ)ØØØÐ&Øó	
ˆô Ô@¬¬c°+Ó.>Ô(?Ó@Ó@Ð@r(   c                óŠ   ^• U R                   R                  XX45      m[        U4S j[        [	        U5      5       5       5      $ )Nc              3  ó.   >#   • U  H
  nTU   v •  M     g 7fr#   r'   rÌ  s     €r)   rú   Ú'CaptureIndexing.sort.<locals>.<genexpr>ý  s   øé € Ð;Ò(: 1�V˜A–YÒ(:ùrÎ  )r§  Úsortr|   rí   r~   )r7   r]  r}   ÚstableÚ
descendingrL  s        @r)   rö  ÚCaptureIndexing.sortú  s3   ø€ Ø—‘×!Ñ! &°&ÓEˆäÔ;¬¬c°&«kÔ(:Ó;Ó;Ð;r(   c                óL   • U R                   R                  U5      nUS   US   4$ )Nr   r   )r§  Úfrexp)r7   rñ  rL  s      r)   rû  ÚCaptureIndexing.frexpÿ  s)   € Ø—‘×"Ñ" ;Ó/ˆà�q‘	˜6 !™9Ð%Ð%r(   c                óì   • U R                   R                  U5      nU R                   R                  XRX45      nU R                  R	                  SU R                   R                  USU 35      U40 5        U$ )z`
Flow data from tensors into indexing formulas.
Introduce a call_module to update the indexing.
rµ  Úset_)r  r:  rX  r}  rv  r4  )r7   Úindex_proxyr8  rS  rT  r9  rU  s          r)   rQ  Ú!CaptureIndexing.indirect_indexing  sl   € ð �i‰i×$Ñ$ TÓ*ˆØ—y‘y×7Ñ7¸À5ÓSˆØ�‰× Ñ ØØ�I‰I×#Ñ# L°D¸¸°,Ó?ØˆNØô		
ð ˆ
r(   c                ó@   • U R                   R                  SSU0 5        g )Nr|  )r}  rv  )r7   rL  s     r)   r|  ÚCaptureIndexing.output  s   € Ø�‰× Ñ  ¨8°V¸RÕ@r(   )r  r}  )r©  r°  r  rn   r}  rP   )r¬   rn  r/  rd   rB   r   )r¬   rn  rD   rn  )r«   r]   rÒ   rn  )r«   r]   rÒ   rj  r#   rm  )r}   r   rà  z.tuple[str, sympy.Expr, sympy.Expr, sympy.Expr]rá  r   râ  ztorch.dtyperã  rl  rä  z Optional[tuple[str, sympy.Expr]]rå  zOptional[T]rD   r   )rê  r¤  )r^  z=Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]])TT)rE   rF   rG   rH   r«   r/   r¶  r¹  r)  rÃ  r*  rƒ  r‚  rÕ  rØ  rß  re  r\  rö  rû  rQ  r|  rL   rM   rN   s   @r)   ry  ry  g  sç   ø† Ø€Dðàðð ðð ÷	ô
ôQô-ô
2ô;ò?òò4òCð 48Ø&*ð/
àð/
ð Cð/
ð ð	/
ð
 $ð/
ð ð/
ð 1ð/
ð $ð/
ð 
õ/
ôb	
ðAð RôAò"<ò
&ô
÷ Að Ar(   ry  )8Ú
__future__r   rŸ   rJ   rÍ   r”  Úenumr   r   Útypingr   r   r   r	   r
   rÁ  Útorch.fxr$   Útorch._dynamo.utilsr   Útorch.fx.proxyr   r   Útorch.utils._sympy.symbolr   rT   r   r   Úcodegen.commonr   Úops_handlerr   r   r   Úutilsr   r   r   r   Úvirtualizedr   r   Úcollections.abcr   r   r   r%   ÚInterpreterr    rP   r[   rd   rn   ru   rx  ry  r'   r(   r)   Ú<module>r     sÊ   ðå "ã Û Û Û 	ß ß DÕ Dã ã Ý (ß ,Ý *ç "Ý 4ß CÑ C÷ó ÷  ö ß2ñ ˆCƒL€ô0�e—h‘h×*Ñ*ô 0ô8%�*ô %ô�*ô ô�dô ÷hñ h÷VTñ Tôn;ˆ~ô ;ônA�nõ nAr(   