Ë
    ÄÓ^j]s  ã                  óô  — d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZmZ d dlZd dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d	d
lmZ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&m'Z'm(Z(m)Z) d	dl*m+Z+m,Z, erd dl-m.Z.m/Z/  ed«      Z0 G d„ dejb                  jd                  «      Z3 G d„ de«      Z4 G d„ de«      Z5 G d„ de«      Z6 G d„ d«      Z7 G d„ d«      Z8 G d„ de «      Z9 G d„ d e"«      Z:y)!é    )ÚannotationsN)ÚautoÚEnum)ÚAnyÚ
NamedTupleÚTYPE_CHECKINGÚTypeVar)Úidentity)ÚScopeÚ
TracerBase)ÚMod)ÚSymTé   )ÚconfigÚdependencies)Úindex_prevent_reordering)ÚDefaultHandlerÚ
OpsHandlerÚWrapperHandler)Úcache_on_selfÚdecompose_indexÚflatten_indexÚreduction_num_outputsÚsympy_index_symbol_with_prefixÚ
sympy_subs)ÚopsÚV)ÚCallableÚSequenceÚTc                  ób   ‡ — e Zd Zeej
                  d„ «       «       Zˆ fd„Zdˆ fd„Zˆ fd„Z	ˆ xZ
S )ÚInterpreterShimc                 óH   — t         j                  j                  t        «      S ©N)ÚtorchÚfxÚsymbolic_tracer
   © ó    úd/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/loop_body.pyÚ	_dummy_gmzInterpreterShim._dummy_gm)   s   € ô �x‰x×&Ñ&¤xÓ0Ð0r)   c                ó¬   •— t         ‰| �  | j                  «       d¬«       | | _        || _        || _        d| _        |j                  | _        d | _	        y )NF)Úgarbage_collect_values)
ÚsuperÚ__init__r+   ÚmoduleÚgraphÚ
submodulesÚextra_tracebackÚ__getitem__Ú
fetch_attrÚcurrent_node)Úselfr1   r2   Ú	__class__s      €r*   r/   zInterpreterShim.__init__.   sP   ø€ ô 	‰Ñ˜Ÿ™Ó)À%ÐÔHØˆŒØˆŒ
Ø$ˆŒØ$ˆÔØ$×0Ñ0ˆŒØ ˆÕr)   c                ó0   •— || _         t        ‰| �	  |«      S r$   )r6   r.   Úrun_node)r7   Únr8   s     €r*   r:   zInterpreterShim.run_node9   s   ø€ àˆÔÜ‰wÑ Ó"Ð"r)   c                óx   •— t        j                  | «      5  t        ‰| �  |i |¤Žcd d d «       S # 1 sw Y   y xY wr$   )r   Úset_interpreter_handlerr.   Úrun)r7   ÚargsÚkwargsr8   s      €r*   r>   zInterpreterShim.run>   s7   ø€ Ü×&Ñ& tÓ,ñ 	0Ü‘7‘; Ð/¨Ñ/÷	0÷ 	0ò 	0ús   —0°9)r;   ztorch.fx.NodeÚreturnr   )Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚ	functoolsÚcacher+   r/   r:   r>   Ú__classcell__©r8   s   @r*   r"   r"   (   s5   ø„ ØØ‡_�_ñ1ó ó ð1ô	!õ#÷
0ð 0r)   r"   c                  ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚLightTracerc                ó¾   •— t         ‰| �  «        t        j                  j	                  | j
                  ¬«      | _        t        dd «      | _        i | _	        i | _
        y )N)Ú
tracer_clsÚ )r.   r/   r%   r&   ÚGraphr8   r1   r   ÚscopeÚmodule_stackÚnode_name_to_scope)r7   r8   s    €r*   r/   zLightTracer.__init__E   sE   ø€ Ü‰ÑÔÜ—X‘X—^‘^¨t¯~©~�^Ó>ˆŒ
Ü˜2˜t“_ˆŒ
ØˆÔØ"$ˆÕr)   )rB   rC   rD   r/   rH   rI   s   @r*   rK   rK   D   s   ø„ ÷%ð %r)   rK   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)ÚMemoryEntryÚstrÚ
index_nameú
str | NoneÚbuffer_nameÚmodeN)rB   rC   rD   Ú__annotations__r(   r)   r*   rT   rT   M   s   … ØƒOØÓØ
Ôr)   rT   c                  ón   — e Zd Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z	 e«       Z
y)ÚMemoryUsageTypeN)rB   rC   rD   r   ÚLOADÚ	LOAD_SEEDÚSTOREÚSTORE_REDUCTIONÚ
INDEX_EXPRÚCHECK_BOUNDSÚ	BUCKETIZEr(   r)   r*   r\   r\   S   s3   „ á‹6€DÙ“€IÙ‹F€EÙ“f€OÙ“€JÙ“6€LÙ“�Ir)   r\   c                  ó¢  ‡ — e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   ed„ «       Z	 d6ˆ fd„	Zd7d„Zd„ Z	d„ Z
d8d„Zd9d„Zd:d„Z	 	 	 	 	 	 d;d„Zd<d„Zd:d„Zed „ «       Zed!„ «       Zed"„ «       Zd#„ Zd$„ Zd%„ Zd&„ Zd'„ Zd(„ Zd)„ Zd=d*„ZeZ	 	 d>	 	 	 	 	 	 	 d?d+„Zd,„ Z d-„ Z!d.„ Z"d/„ Z#d6d0„Z$dd1œd2„Z%d3„ Z&d4„ Z'd5„ Z(ˆ xZ)S )@ÚLoopBodyz˜
    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_namec                óR   — t        | «      t        u rt        j                  | «      S | S r$   )ÚtypeÚintÚsympyÚInteger)Úexprs    r*   Ú_wrap_int_to_sympy_integerz#LoopBody._wrap_int_to_sympy_integerp   s$   € ô �‹:œÑÜ—=‘= Ó&Ð&Øˆr)   Fc                óH  •— t         ‰| �  «        t        |j                  «       «      }|d t	        |«       |t	        |«      d  f| _        || _        || _        || _        t        |t        «      r| j                  |||«       d | _        y | j                  ||«       d | _        y r$   )r.   r/   ÚtupleÚvaluesÚlenÚsizesÚ	iter_varsÚreduce_varsÚ
var_rangesÚ
isinstancere   Ú_init_with_copyÚ_init_with_tracingÚindexing)	r7   Úfnr?   r   r}   r~   Úallow_same_symbol_in_indexÚ_flat_sizesr8   s	           €r*   r/   zLoopBody.__init__w   s¡   ø€ ô 	‰ÑÔä˜J×-Ñ-Ó/Ó0ˆàÐ(œ#˜i›.Ð)Øœ˜I›Ð(Ð)ð
ˆŒ
ð
 #ˆŒØ&ˆÔØ$ˆŒä�bœ(Ô#Ø× Ñ   TÐ+EÔFð ˆ�ð ×#Ñ# B¨Ô-àˆ�r)   c                óš   — | j                   sJ ‚| j                  j                  j                  dd¬«      d   }|j                  d   }|d   S )NÚcall_methodÚpartial_accumulate©ÚopÚtargetr   éÿÿÿÿÚnum_reduction_dims)Úhas_partial_accumulaterl   r1   Ú
find_nodesr?   )r7   ÚnodeÚmetas      r*   Úget_original_num_rdimszLoopBody.get_original_num_rdims“   sY   € Ø×*Ò*Ð*Ð*Ø�‰×$Ñ$×/Ñ/ØÐ%9ð 0ó 
à
ñˆð �y‰y˜‰}ˆØÐ(Ñ)Ð)r)   c                óø   — | j                   j                  «       | _         d| _        | j                  | j                  z   | _        g | _        | j
                  d   | j
                  d   z   t        «       f| _        | S )NTr   r   )rl   Úextract_pw_from_reductionr�   r}   r~   r|   ry   ©r7   s    r*   r•   z"LoopBody.extract_pw_from_reduction›   sd   € ØŸ/™/×CÑCÓEˆŒØ&*ˆÔ#ØŸ™¨$×*:Ñ*:Ñ:ˆŒØˆÔØ—j‘j ‘m d§j¡j°¡mÑ3´U³WÐ=ˆŒ
Øˆr)   c                ór  — i | _         i | _        d| j                  i| _        i | _        g | _        i | _        t        D �ci c]  }|g “Œ c}| _        t        j                  «       | _        t        | ||«      | _        t        | j                  j                  j!                  dd¬«      «      | _        | `yc c}w )z9Do an FX trace of an arbitrary callable to construct selfÚ	get_indexrˆ   r‰   rŠ   N)rf   rp   r˜   r2   rh   ri   rj   r\   rm   ÚcollectionsÚCounterro   rk   rl   Úboolr1   r�   r�   )r7   r„   r?   Úts       r*   r‚   zLoopBody._init_with_tracing£   s­   € à ˆÔØ#%ˆÔ Ø&¨¯©Ð7ˆŒØˆŒØˆÔØCEˆÔ Ü,;Ö< q˜Q ™UÒ<ˆÔÜ$×,Ñ,Ó.ˆŒÜ'¨¨b°$Ó7ˆŒÜ&*Ø�O‰O×!Ñ!×,Ñ,Ø Ð)=ð -ó ó'
ˆÔ#ð
 Ñ$ùò =s   ¿
B4c                óX  — |j                  ||«      }|j                  «       D ��ci c]I  \  }}|| j                  t        j                  j
                  j                  || j                  «      «      “ŒK c}}| _        |j                  j                  «       D ��ci c]  \  }}||j                  | «      “Œ c}}| _	        |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  j                  | «      | _        |j                   | _        i |j"                  ¥}	|	j%                  d«       d| j&                  i|	j                  «       D ��ci c]  \  }}||j                  | «      “Œ c}}¥| _        yc c}}w c c}}w c c}}w )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Úitemsrw   r   r1   ÚsizevarsÚsimplify_with_rangesr   rf   rh   Úcloneri   rj   rm   ro   rl   r�   r2   Úpopr˜   )
r7   Úotherr?   r…   rf   Únamerv   ÚkÚvr2   s
             r*   r�   zLoopBody._init_with_copyµ   sl  € ð ×1Ñ1°$Ð8RÓSˆð
 -×2Ñ2Ó4÷	
ñ ��dð �$×1Ñ1Ü—‘× Ñ ×5Ñ5°d¸D¿O¹OÓLóñ ó
ˆÔð 8=·±×7LÑ7LÓ7N×O©t¨q°!˜!˜QŸW™W T›]Ñ*ÓOˆŒØ"×0Ñ0ˆÔØ#(×#<Ñ#<ˆÔ Ø!×.Ñ.ˆÔØŸ™ˆŒØ×*Ñ*×0Ñ0°Ó6ˆŒØ&+×&BÑ&BˆÔ#à)˜×(Ñ(Ð)ˆ
Ø�‰�{Ô#à˜Ÿ™ð
à,6×,<Ñ,<Ó,>×?¡D A qˆq�!—'‘'˜$“-ÑÓ?ð
ˆ�ùó!
ùó Pùó @s   ¦AFÂF Å3F&c                ó@   — | j                   j                  |d«      dkD  S )Nr   )ro   Úget©r7   r¥   s     r*   Úhas_opzLoopBody.has_opÑ   s   € Ø�~‰~×!Ñ! $¨Ó*¨QÑ.Ð.r)   c           	     óü  — | }| j                   }|j                  \  }}|\  }}g |j                  j                  «       ¢}t        j
                  j                  j                  ||t        |||«      «      \  }}	}
t        j
                  j                  j                  ||t        |||«      «      \  }}}
||k(  r||k(  r|S t        j                  ||d¬«      \  \  }}}t        | |	|«       ||«      g|||d¬«      }|S )zU
        Merge both iteration and reduction loops and return a new LoopBody.
        Úp)ÚprefixT©r…   )r|   Úvarsrf   rz   r   r1   r    Ú_simplify_loopsr   r   Úindex_vars_no_squeezere   )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_loopszLoopBody.merge_loopsÔ   s  € ð ˆØ—J‘Jˆ	Ø)1¯©Ñ&ˆ�Ø+4Ñ(ˆÐ(à9˜×/Ñ/×6Ñ6Ó8Ð9ˆä&'§g¡g×&6Ñ&6×&FÑ&FØØÜ$ [°-ÀÓPó'
Ñ#ˆ
�L !ô +,¯'©'×*:Ñ*:×*JÑ*JØØÜ$ [°/ÐCSÓTó+
Ñ'ˆ�n að ˜Ò'¨LÐ<LÒ,LØˆOô ×.Ñ.¨z¸<ÐPSÔTñ	
ñØØàäØÙ˜)Ó$¡n°[Ó&AÐBØØØØ'+ô
ˆð ˆr)   c                ó,  ‡‡‡‡‡— | Š| j                   }|\  ŠŠ‰‰   Št        ‰«      }||‰<   |‰f}t        j                  |ddiŽ\  \  }}}dˆˆˆˆˆfd„}	t	        |	||f|||«      }
t        j                  |ddiŽ\  \  }}}t	        |
||f|||«      }	|	S )z~
        Expand node on `dimension` to `new_range` and rely on index modular to avoid
        out-of-boundary access.
        r®   rœ   c                 ó  •— g t         j                  j                  | «      ¢}t        |«      t        ‰«      t        ‰	«      z   k(  sJ ‚|d t        ‰«       }|t        ‰«      d  }t	        |«      }t        |‰   ‰«      |‰<    ‰||«      S r$   )Ú	itertoolsÚchainÚfrom_iterabler{   Úlistr   )
ÚindicesÚindexÚiter_idxÚ
reduce_idxÚnew_iter_idxÚ	dimensionÚ	iter_sizer³   Úoriginal_rangeÚreduce_sizes
        €€€€€r*   r¿   z>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Ü&)¨(°9Ñ*=¸~Ó&NˆL˜Ñ#á˜L¨*Ó5Ð5r)   r­   ©rÇ   úSequence[sympy.Expr]rA   r   ©r|   rÆ   r   r²   re   )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_nodez,LoopBody.expand_dimension_for_pointwise_node   sÙ   ü€ ð ˆØ—J‘Jˆ	à!*Ñˆ	�;Ø" 9Ñ-ˆÜ˜Y›ˆØ#,ˆ�iÑ Ø" KÐ0ˆ	ä/;×/QÑ/QØð0
àñ0
Ñ,Ñ ˆ�K *÷
		6ñ 		6ô Ø�y +Ð.°
¸IÀ{ó
ˆ	ô
 3?×2TÑ2TØð3
àñ3
Ñ/Ñ"ˆ�\ Kô Ø˜
 LÐ1°;À
ÈLó
ˆð ˆr)   c                ó4  ‡‡‡— | Š| j                   d   Š| j                   d   }t        ‰«      t        |«      f}t        j                  |ddiŽ\  \  }}}dˆˆˆfd„}t	        |||f|||«      }t        j                  |ddiŽ\  \  }	}
}t	        ||	|
f||	|
«      S )a  
        Reindex iteration loops into a different factorization of the same
        total numel. For example, [1024, 8192] -> [65536, 128].

        The old iteration vars are expressed as functions of the new vars via
        FloorDiv and ModularIndexing on the flat index.
        r   r   r®   rœ   c                 óÒ   •— g t         j                  j                  | «      ¢}|d t        ‰«       }|t        ‰«      d  }t	        |‰«      }t        |‰«      } ‰|t        |«      «      S r$   )rÃ   rÄ   rÅ   r{   r   r   rÆ   )	rÇ   rÈ   rË   rÊ   ÚflatÚold_iter_idxÚnew_iter_sizesr³   r·   s	         €€€r*   r¿   z-LoopBody.reindex_iter_loops.<locals>.new_bodyB  sj   ø€ Ø=”i—o‘o×3Ñ3°GÓ<Ð=ˆEØ Ð!6¤3 ~Ó#6Ð7ˆLØœs >Ó2Ð4Ð5ˆJÜ  ¨~Ó>ˆDÜ*¨4°Ó@ˆLÙ˜L¬$¨zÓ*:Ó;Ð;r)   r­   rÐ   rÒ   )r7   rß   r½   rÕ   r}   r~   r   r¿   rÖ   r×   rØ   rÙ   r³   r·   s    `          @@r*   Úreindex_iter_loopszLoopBody.reindex_iter_loops/  sÈ   ú€ ð ˆØŸ™ A™ˆØ—z‘z !‘}ˆä˜.Ó)¬4°Ó+=Ð>ˆ	ä/;×/QÑ/QØð0
àñ0
Ñ,Ñ ˆ�K *÷
	<ô Ø�y +Ð.°
¸IÀ{ó
ˆ	ô 3?×2TÑ2TØð3
àñ3
Ñ/Ñ"ˆ�\ Kô ØØ˜Ð&ØØØó
ð 	
r)   c                ó¤  ‡‡‡‡— ddl m} | Š| j                  }t        |d   «      t        |«      k(  sJ ‚ ||«      }|\  ŠŠ |‰«      }|‰f}t	        j
                  |ddiŽ\  \  }}}	t        |«      D �
�ci c]  \  }
}||
“Œ
 c}}
Št        t        |«      «      D �cg c]  }‰|   ‘Œ	 c}Šdˆˆˆˆfd„}t        |||f|	||«      S c c}}
w c c}w )zD
        Reorder iteration loops and return a new LoopBody.
        r   )Úsame_reorderr   r®   r­   c                 ó  •— g t         j                  j                  | «      ¢}t        |«      t        ‰«      t        ‰«      z   k(  sJ ‚|d t        ‰«       }|t        ‰«      d  }‰D �cg c]  }||   ‘Œ	 }} ‰||d¬«      S c c}w )NTr¯   )rÃ   rÄ   rÅ   r{   )	rÇ   rÈ   rÉ   rÊ   ÚiÚinverse_orderrÍ   r³   rÏ   s	        €€€€r*   r¿   z-LoopBody.reorder_iter_loops.<locals>.new_bodyr  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 jÈTÔRÐRùò <s   Á(BrÐ   )	Úirrâ   r|   r{   r   r²   Ú	enumerateÚrangere   )r7   Ú	new_orderrâ   r´   Ú
reorder_fnrÔ   rÕ   r}   r~   r   ÚaÚbrä   r¿   rå   rÍ   r³   rÏ   s                 @@@@r*   Úreorder_iter_loopszLoopBody.reorder_iter_loopsZ  só   û€ õ 	%àˆØ—J‘Jˆ	Ü�9˜Q‘<Ó ¤C¨	£NÒ2Ð2Ð2Ù! )Ó,ˆ
à!*Ñˆ	�;Ù" 9Ó-ˆà" KÐ0ˆ	ä/;×/QÑ/QØð0
àñ0
Ñ,Ñ ˆ�K *ô
 +4°IÓ*>×?¡$ ! Q˜˜A™Ó?ˆÜ38¼¸Y»Ó3HÖI¨a˜ qÓ)ÒIˆ÷	Sð 	Sô ØØ˜Ð$ØØØó
ð 	
ùó @ùÚIs   Á7CÂCc                ój   — | j                   €J ‚| j                  €J ‚| j                   | j                  fS r$   )r}   r~   r–   s    r*   r°   zLoopBody.vars‚  s9   € à�~‰~Ð)Ð)Ð)Ø×ÑÐ+Ð+Ð+Ø�~‰~˜t×/Ñ/Ð/Ð/r)   c                óè   — t        j                  | j                  j                  fd„ | j                  j                  «       D «       «      }|D ��cg c]  }|j                  D ]  }|‘Œ Œ c}}S c c}}w )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr$   )r1   )Ú.0Úblocks     r*   ú	<genexpr>z%LoopBody.get_nodes.<locals>.<genexpr>Œ  s   è ø€ Ò>˜UˆU�[�[Ñ>ùs   ‚)rÃ   rÄ   rl   r1   rh   rz   Únodes)r7   Ú
all_graphsr1   r‘   s       r*   Ú	get_nodeszLoopBody.get_nodesˆ  s[   € ä—_‘_Ø�_‰_×"Ñ"Ð$Ù> d§n¡n×&;Ñ&;Ó&=Ô>ó
ˆ
ð #-×E˜¸¿¹ÒE°’ÐE�ÓEÐEùÓEs   ÁA.c                ó   — ddl m}  || «      S )Nr   )Ú	BoundVars)Úboundsrø   )r7   rø   s     r*   rù   zLoopBody.bounds�  s   € õ 	&á˜‹Ðr)   c                óÂ   — t        | j                  t        j                     «      D ],  }|j                  |k(  sŒ| j
                  |j                     c S  t        |«      ‚r$   )Úreversedrm   r\   r]   rX   rf   rV   ÚKeyError©r7   rX   Úentrys      r*   Úget_read_exprzLoopBody.get_read_expr—  sY   € ä˜d×/Ñ/´×0DÑ0DÑEÓFò 	=ˆEØ× Ñ  KÓ/Ø×*Ñ*¨5×+;Ñ+;Ñ<Ò<ð	=ô �{Ó#Ð#r)   c                ó  — t        j                  | j                  t        j                     | j                  t        j
                     «      D ],  }|j                  |k(  sŒ| j                  |j                     c S  t        |«      ‚r$   )
rÃ   rÄ   rm   r\   r_   r`   rX   rf   rV   rü   rý   s      r*   Úget_write_exprzLoopBody.get_write_exprž  sv   € Ü—_‘_Ø×Ñœo×3Ñ3Ñ4Ø×Ñœo×=Ñ=Ñ>ó
ò 	=ˆEð × Ñ  KÓ/Ø×*Ñ*¨5×+;Ñ+;Ñ<Ò<ð	=ô �{Ó#Ð#r)   c                ó�   — | j                   t        j                     D �cg c]  }| j                  |j                     ‘Œ c}S c c}w r$   )rm   r\   r]   rf   rV   ©r7   rþ   s     r*   Úget_read_exprszLoopBody.get_read_exprs§  sF   € ð ×*Ñ*¬?×+?Ñ+?Ñ@ö
àð ×Ñ × 0Ñ 0Ó1ò
ð 	
ùò 
s     Ac                óÐ   — g }t        | j                  t        j                     «      D ]:  }|j                  |k(  sŒ|j                  | j                  |j                     «       Œ< |S r$   )rû   rm   r\   r]   rX   Úappendrf   rV   ©r7   rX   Úoutrþ   s       r*   Úget_all_read_exprzLoopBody.get_all_read_expr­  s`   € àˆÜ˜d×/Ñ/´×0DÑ0DÑEÓFò 	BˆEØ× Ñ  KÓ/Ø—
‘
˜4×.Ñ.¨u×/?Ñ/?Ñ@ÕAð	Bð ˆ
r)   c                óî   — t        j                  | j                  t        j                     | j                  t        j
                     «      D �cg c]  }| j                  |j                     ‘Œ c}S c c}w r$   )rÃ   rÄ   rm   r\   r_   r`   rf   rV   r  s     r*   Úget_write_exprszLoopBody.get_write_exprsµ  sf   € ô #Ÿ™Ø×!Ñ!¤/×"7Ñ"7Ñ8Ø×!Ñ!¤/×"AÑ"AÑBóö
àð ×Ñ × 0Ñ 0Ó1ò
ð 	
ùò 
s   Á A2c                ó  — g }t        j                  | j                  t        j                     | j                  t        j
                     «      D ]:  }|j                  |k(  sŒ|j                  | j                  |j                     «       Œ< |S r$   )
rÃ   rÄ   rm   r\   r_   r`   rX   r  rf   rV   r  s       r*   Úget_all_write_exprzLoopBody.get_all_write_expr¾  s}   € ØˆÜ—_‘_Ø×Ñœo×3Ñ3Ñ4Ø×Ñœo×=Ñ=Ñ>ó
ò 	BˆEð × Ñ  KÓ/Ø—
‘
˜4×.Ñ.¨u×/?Ñ/?Ñ@ÕAð	Bð ˆ
r)   c           	     óÈ  — dt        | j                  «      › �g}|j                  | j                  j	                  «       D ��cg c]  \  }}|› d|› �‘Œ c}}«       |j                  t        j                  d| j                  fg| j                  j	                  «       «      D ��cg c]  \  }}|j                  |«      ‘Œ c}}«       dj                  |«      S c c}}w c c}}w )Nzvar_ranges = z = Úbodyú
)Údictr   Úextendrf   rŸ   rÃ   rÄ   rl   rh   Ú	debug_strÚjoin)r7   Úlinesr¥   Úvalrò   s        r*   r  zLoopBody.debug_strÈ  sÄ   € Ø ¤ d§o¡oÓ!6Ð 7Ð8Ð9ˆØ�‰¸×9LÑ9L×9RÑ9RÓ9T×U©I¨D°#˜˜˜c # Ò'ÓUÔVØ�‰ô $-§?¡?Ø˜dŸo™oÐ.Ð/°·±×1EÑ1EÓ1Gó$÷á�D˜%ð —‘ Õ%óô	
ð �y‰y˜ÓÐùó Vùós   ÁC
Â$C
c                ó  — t        | j                  t        j                     «      dk(  xr` t        | j                  t        j                     «      dk(  xr5 t        | j
                  «      dk(  xr | j                  j                  d«      S )zx
        True of this contains only a single loads and store.
        Note, this could involve a layout change.
        r   )ÚloadÚstore)r{   rm   r\   r]   r_   r2   rl   Úcontains_only_opsr–   s    r*   Úis_memory_copyz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                ó   — | j                  |«      }| j                  j                  |«      }|s6dt        | j                  «      › �}|| j                  |<   || j                  |<   | j
                  |   j                  t        |||«      «       |S )NrÈ   )rw   rp   r©   r{   rf   rm   r  rT   )r7   rv   ÚmtyperX   rY   r¥   s         r*   Úadd_index_exprzLoopBody.add_index_exprã  sŒ   € ð ×.Ñ.¨tÓ4ˆØ×'Ñ'×+Ñ+¨DÓ1ˆÙØœ3˜t×2Ñ2Ó3Ð4Ð5ˆDØ-1ˆD×$Ñ$ TÑ*Ø(,ˆD×Ñ Ñ%Ø×Ñ˜%Ñ ×'Ñ'¬°D¸+ÀtÓ(LÔMØˆr)   c                óž   — |d   j                  «       r|| j                  vr|}n|› t        | j                  «      › �}|| j                  |<   |S )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_submodulezLoopBody.add_submoduleó  sM   € à�"‰:×ÑÔ! f°D·O±OÑ&CØ‰Dà�Xœc $§/¡/Ó2Ð3Ð4ˆDØ %ˆ�‰˜ÑØˆr)   c                óÔ   — t        t        j                  t        | j                  «      «      }|| j
                  vsJ ‚| j                  j                  |«       || j
                  |<   |S r$   )r   r   ÚINDIRECTr{   ri   rj   r  )r7   ÚsizeÚvars      r*   Úadd_indirectzLoopBody.add_indirectü  sZ   € Ü,¬T¯]©]¼CÀ×@RÑ@RÓ<SÓTˆØ˜$×2Ñ2Ñ2Ð2Ð2Ø×Ñ×!Ñ! #Ô&Ø(,ˆ× Ñ  Ñ%Øˆ
r)   c           
     óÚ   — t        |«      t        |«      k(  ry| j                  €J ‚| j                  j                  «       D ��ci c]  \  }}|t        |||i«      “Œ c}}| _        yc c}}w )z,Swap in a variable used in indirect indexingN)rU   rƒ   rŸ   r   )r7   ÚoldÚnewr¦   r§   s        r*   Úreplace_indirectzLoopBody.replace_indirect  s[   € äˆs‹8”s˜3“xÒØØ�}‰}Ð(Ð(Ð(àBFÇ-Á-×BUÑBUÓBW×X¹$¸!¸Q˜œJ q¨3°¨*Ó5Ñ5ÓXˆ�ùÓXs   ÁA'c                ó<   — | j                   €J ‚| j                   |   S r$   )rƒ   rª   s     r*   r˜   zLoopBody.get_index  s!   € Ø�}‰}Ð(Ð(Ð(Ø�}‰}˜TÑ"Ð"r)   c           	     óÞ  ‡ — g t         j                  j                  |«      ¢}t        |«      t        ‰ j                  «      k(  sJ |‰ j                  f«       ‚|s+t        ˆ fd„|D «       «      sJ d‰ j                  ›d|›�«       ‚t        t        ‰ j                  j                  «       |«      «      }‰ j                  j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}S c c}}w )Nc              3  ó:   •K  — | ]  }|‰j                   v–— Œ y ­wr$   )r   )rñ   r§   r7   s     €r*   ró   z.LoopBody.indexing_from_args.<locals>.<genexpr>  s   øè ø€ ò 1
Ø)*ˆA�T—_‘_Ô$ñ1
ùó   ƒzself.var_ranges=z
, indices=)rÃ   rÄ   rÅ   r{   r   Úallr  ÚzipÚkeysrf   rŸ   r   )r7   rÇ   r…   rÈ   Úreplacementsr¥   rv   s   `      r*   rž   z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÷
á��dð ”*˜T <Ó0Ñ0ó
ð 	
ùó 
s   ÃC)r¯   c               ób   — | j                  ||«      | _        | j                  «       }d | _        |S r$   )rž   rƒ   rl   )r7   r…   rÇ   Úresults       r*   Ú__call__zLoopBody.__call__  s/   € Ø×/Ñ/°Ð9SÓTˆŒØ—‘Ó"ˆØˆŒØˆr)   c                ó|   ‡ ‡‡‡‡— ˆˆ ˆˆˆfd„}t        j                  t        j                  ‰‰‰‰¬«      |_        |S )Nc           	     ój   •— ‰j                  ‰t        j                  j                  | ‰‰‰«      «       y r$   )r*  r   r   Úindirect_indexing)Únew_varÚcheckr7   r$  r%  Úwrap_negs    €€€€€r*   Úset_indirectz5LoopBody.bind_set_indirect_shim.<locals>.set_indirect#  s+   ø€ Ø×!Ñ!Ø”Q—U‘U×,Ñ,¨W°d¸EÀ8ÓLõr)   )r%  r$  r:  r;  )rF   Úpartialre   Úbind_set_indirect_shimr¢   )r7   r%  r$  r:  r;  r<  s   ````` r*   r>  zLoopBody.bind_set_indirect_shim"  s?   ü€ ÷	ð 	ô
 '×.Ñ.Ü×+Ñ+ØØØØô
ˆÔð Ðr)   c                óf   ‡— ˆfd„}t        j                  t        j                  ‰¬«      |_        |S )Nc                óF   •— t         j                  j                  | ‰|«      S r$   )r   r   Úscan)Údtypesrz   Ú
combine_fns     €r*   Úshimz%LoopBody.bind_scan_shim.<locals>.shim2  s   ø€ Ü—5‘5—:‘:˜f j°&Ó9Ð9r)   )rC  )rF   r=  re   Úbind_scan_shimr¢   )r7   rC  rD  s    ` r*   rE  zLoopBody.bind_scan_shim1  s)   ø€ ô	:ô ×&Ñ&¤x×'>Ñ'>È:ÔVˆŒ
Øˆr)   c                ój   ‡ ‡— ˆˆ fd„}t        j                  t        j                  ‰¬«      |_        |S )Nc                ó`   •— t         j                  j                  | ‰j                  ‰   |«      S r$   )r   r   Úmaskedrh   )Úmaskr¤   r¥   r7   s     €€r*   rD  z'LoopBody.bind_masked_shim.<locals>.shim9  s#   ø€ Ü—5‘5—<‘<  d§n¡n°TÑ&:¸EÓBÐBr)   )r¥   )rF   r=  re   Úbind_masked_shimr¢   )r7   r¥   rD  s   `` r*   rJ  zLoopBody.bind_masked_shim8  s*   ù€ õ	Cô ×&Ñ&¤x×'@Ñ'@ÀtÔLˆŒ
Øˆr)   )F)rA   rs   )r¤   re   )r¥   rU   )rA   re   )rÌ   rs   rÓ   rs   rA   re   )rß   rÑ   rA   re   ©rA   r›   ©NN)rv   ú
sympy.Exprr  r\   rX   rW   rY   rW   )*rB   rC   rD   Ú__doc__rZ   rE   rw   r/   r“   r•   r‚   r�   r«   rÀ   rÚ   rà   rí   Úpropertyr°   r   rö   rù   rÿ   r  r  r	  r  r  r  r  Ú__repr__r  r!  r&  r*  r˜   rž   r5  r>  rE  rJ  rH   rI   s   @r*   re   re   ^   s{  ø… ñð
 *Ó)ØÓØ'Ó'Ø%Ó%Ø7Ó7ØÓØ:Ó:Ø'Ó'ð /Ó.àñó ðð $)õó8*òò%ó$
ó8/ó*ðX-Øð-Ø),ð-à	ó-ó^)
óV&
ðP ñ0ó ð0ð
 ñFó ðFð ñó ðò$ò$ò
òò
òò ó

ð €Hð #'Øðàðð ðð  ð	ð
 óò òòYò#ó
ð =Bô òòör)   re   c                  ó<   — e Zd ZdZd	d„Zd„ Zd„ Zd
d„Zdd„Zdd„Z	y)rk   a  
    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                óÆ  — || _         t        «       }|j                  dddi «      }ddlm} t        t        |||«      |j                  «      }t        j                  r2 ||| j                   j                  | j                   j                  «      }t        j                  |«      5  t        j                   ||Ž «       d d d «       |j                   | _        y # 1 sw Y   ŒxY w)NÚplaceholderr   r(   r   )ÚIndexPropagation)r  rK   Úcreate_proxyÚindex_propagationrT  ÚCountOpsÚCaptureIndexingro   r   Úconstant_and_index_propagationr   rj   r   Úset_ops_handlerr   Úoutputr1   )r7   r  r„   r?   ÚtracerÚ	proxy_opsrT  Úhandlers           r*   r/   zLoopBodyBlock.__init__H  sÁ   € ØˆŒ	ä“ˆØ×'Ñ'¨°u¸bÀ"ÓEˆ	å7äÜàØØó	ð �N‰Nó
ˆô ×0Ò0Ù&Ø˜Ÿ™×-Ñ-¨t¯y©y×/LÑ/LóˆGô ×Ñ˜wÓ'ñ 	"ô �J‰J‘r˜4�yÔ!÷	"ð —\‘\ˆ�
÷		"ð 	"ús   Â$CÃC c           	     ór  — d }d }| j                   j                  D ]-  }|j                  dk(  r|rJ ‚|}|j                  dk(  sŒ(|rJ ‚|}Œ/ |sJ ‚|sJ ‚|j                  d   }|j                  d   }|j                  d   }|j                  d   }dt	        | j
                  j                  «      i}| j                   j                  |«      5  | j                   j                  d|||||f«       d d d «       | j                   j                  |«       | j                   j                  |«       | S # 1 sw Y   ŒAxY w)	NÚ	reductionÚstore_reductionéþÿÿÿr�   r   r   rŽ   r‰   )
r1   rô   rŒ   r?   r{   r  r~   Úinserting_afterrˆ   Ú
erase_node)	r7   Úredr  r‘   Úreduction_typeÚred_argÚbufr   Ú
extra_metas	            r*   r•   z'LoopBodyBlock.extract_pw_from_reductiond  s.  € ØˆØˆØ—J‘J×$Ñ$ò 	ˆDØ�{‰{˜kÒ)Ù��wØ�Ø�{‰{Ð/Ó/Ù Ð �yØ‘ð	ñ ˆ
ˆsÙˆˆuØŸ™ "™ˆØ—(‘(˜2‘,ˆØ�j‰j˜‰mˆØ�j‰j˜‰mˆð !¤# d§i¡i×&;Ñ&;Ó"<ð
ˆ
ð �Z‰Z×'Ñ'¨Ó.ñ 	Ø�J‰J×"Ñ"Ø$ s¨C°ÀÈ*Ð&Uô÷	ð 	�
‰
×Ñ˜eÔ$Ø�
‰
×Ñ˜cÔ"Øˆ÷	ð 	ús   Ã"D-Ä-D6c                ó    — | j                   }| j                  j                  }t        ||«      j	                  t        j                  «       «      S r$   )r1   r  r2   r"   r>   r   Úget_ops_handler)r7   r1   r2   s      r*   r5  zLoopBodyBlock.__call__€  s;   € Ø—
‘
ˆØ—Y‘Y×)Ñ)ˆ
ä˜u jÓ1×5Ñ5´a×6GÑ6GÓ6IÓJÐJr)   c           
     ó  — t         j                  j                  | j                  j                  | j
                  «      j                  }t        j                  dd|j                  «       j                  dd|› d�«      «      S )Nz;[^\n]*rN   zdef forward(zdef ú()r%   r&   ÚGraphModuler  r2   r1   ÚcodeÚreÚsubÚstripÚreplace)r7   r¥   ro  s      r*   r  zLoopBodyBlock.debug_str†  sa   € Ü�x‰x×#Ñ# D§I¡I×$8Ñ$8¸$¿*¹*ÓE×JÑJˆÜ�v‰vàØØ�J‰J‹L× Ñ  °4¸°v¸Q°Ó@ó	
ð 	
r)   c                ó`   ‡— t        ˆfd„| j                  j                  d¬«      D «       «      S )Nc              3  ó:   •K  — | ]  }|j                   ‰v –— Œ y ­wr$   )rŒ   )rñ   r‘   Úallowed_opss     €r*   ró   z2LoopBodyBlock.contains_only_ops.<locals>.<genexpr>�  s"   øè ø€ ò 
àð �K‰K˜;Ô&ñ
ùr.  rˆ   )r‹   )r/  r1   r�   )r7   rv  s    `r*   r  zLoopBodyBlock.contains_only_ops�  s/   ø€ Üó 
àŸ
™
×-Ñ-°Ð-Ó?ô
ó 
ð 	
r)   c                óŽ   — t         j                  t         «      }|j                  j                  i | j                  ¥d|i¥«       |S )z'Shallow copy with a new parent LoopBodyr  )rk   Ú__new__Ú__dict__Úupdate)r7   r  Úcopys      r*   r¢   zLoopBodyBlock.clone•  s:   € ä×$Ñ$¤]Ó3ˆØ�‰×ÑÐ< §¡Ð<¨v°tÑ<Ô=Øˆr)   N)r  re   r„   úCallable[..., Any]r?   z	list[Any])rò   rK  )r  re   )
rB   rC   rD   rN  r/   r•   r5  r  r  r¢   r(   r)   r*   rk   rk   @  s&   „ ñó"ò8ò8Kó
ó
ôr)   rk   c                  ó   — e Zd Zdd„Zdd„Zy)rW  c                ó    — || _         || _        y r$   )Ú_innerÚ_counts)r7   ÚinnerÚcountss      r*   r/   zCountOps.__init__�  s   € ØˆŒØˆ�r)   c                óh   — | j                   |xx   dz  cc<    t        | j                  |«      |i |¤ŽS )Nr   )r€  Úgetattrr  )r7   r¥   r?   r@   s       r*   Ú_defaultzCountOps._default¡  s3   € Ø�‰�TÓ˜aÑÓØ)Œw�t—{‘{ DÓ)¨4Ð:°6Ñ:Ð:r)   N)r�  úOpsHandler[Any]r‚  rn   )r¥   rU   r?   ztuple[Any, ...]r@   rg   rA   r   )rB   rC   rD   r/   r…  r(   r)   r*   rW  rW  œ  s   „ óô;r)   rW  c                  óÐ   ‡ — e Zd Zd Z	 	 	 	 	 	 dˆ fd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Z	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Z	 	 dd„Zd„ Zd„ Zdd„Zd„ Zˆ xZS )rX  c                ó@   •— t         ‰| �  |«       || _        || _        y r$   )r.   r/   r  r\  )r7   r�  r  r\  r8   s       €r*   r/   zCaptureIndexing.__init__©  s    ø€ ô 	‰Ñ˜ÔØˆŒ	Øˆ�r)   c           	     óx   — | j                   j                  dd | j                  j                  ||fi |¤Žfi «      S )NÚcall_moduler˜   )r\  rU  r  r  )r7   rv   r  r@   s       r*   Ú
_add_indexzCaptureIndexing._add_index³  s@   € Ø�{‰{×'Ñ'ØØØ%ˆT�Y‰Y×%Ñ% d¨EÑ<°VÑ<Ð>Øó	
ð 	
r)   c                ó~   — t         j                  j                  j                  || j                  j
                  «      S r$   )r   r1   r    r¡   r  r   )r7   rv   s     r*   Ú	_simplifyzCaptureIndexing._simplify»  s)   € Ü�w‰w×Ñ×4Ñ4°T¸4¿9¹9×;OÑ;OÓPÐPr)   c                ó    — | j                  |«      }| j                  |t        j                  |¬«      }| j                  j                  ||«      S ©N©rX   )r�  r‹  r\   r]   r  r  ©r7   r¥   rÈ   s      r*   r  zCaptureIndexing.load¾  sA   € Ø—‘˜uÓ%ˆØ—‘ ¤×';Ñ';È�ÓNˆØ�{‰{×Ñ  eÓ,Ð,r)   c                óÜ   — t        |t        «      sJ ‚| j                  j                  t	        j
                  |«      t        j                  |¬«       | j                  j                  ||«      S r�  )
r€   rs   r  r  rt   ru   r\   r^   r  Ú	load_seedr‘  s      r*   r“  zCaptureIndexing.load_seedÃ  sX   € Ü˜%¤Ô%Ð%Ð%Ø�	‰	× Ñ Ü�M‰M˜%Ó ¤/×";Ñ";Èð 	!ô 	
ð �{‰{×$Ñ$ T¨5Ó1Ð1r)   c                ó¦   — | j                  |«      }| j                  |t        j                  ||¬«      }| j                  j                  ||||«      S )N)rX   rY   )r�  r‹  r\   r_   r  r  )r7   r¥   rÈ   ÚvaluerY   s        r*   r  zCaptureIndexing.storeÊ  sO   € Ø—‘˜uÓ%ˆØ—‘Ø”?×(Ñ(°dÀð  ó 
ˆð �{‰{× Ñ   u¨e°TÓ:Ð:r)   c                ó¢   — | j                  |«      }| j                  |t        j                  |¬«      }| j                  j                  |||«      S r�  )r�  r‹  r\   r`   r  ra  )r7   r¥   rÈ   r•  s       r*   ra  zCaptureIndexing.store_reductionÑ  sK   € Ø—‘˜uÓ%ˆØ—‘Ø”?×2Ñ2Àð  ó 
ˆð �{‰{×*Ñ*¨4°¸Ó>Ð>r)   c                óž   ‡— | j                   j                  ||||«      Št        |«      }|dkD  rt        ˆfd„t	        |«      D «       «      S ‰S )Nr   c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr$   r(   ©rñ   rä   r4  s     €r*   ró   z,CaptureIndexing.reduction.<locals>.<genexpr>Ü  s   øè ø€ Ò? q˜ �Ñ?ùó   ƒ)r  r`  r   ry   rè   )r7   ÚdtypeÚ	src_dtyperf  r•  Únum_outputsr4  s         @r*   r`  zCaptureIndexing.reductionØ  sI   ø€ Ø—‘×&Ñ& u¨i¸ÈÓOˆÜ+¨NÓ;ˆØ˜Š?ÜÓ?¬E°+Ó,>Ô?Ó?Ð?Øˆr)   c                ó&  — | j                  |«      }t        |t        t        j                  f«      r%| j
                  j                  t        |«      |«      S | j                  |t        j                  «      }| j
                  j                  ||«      S r$   )r�  r€   rs   rt   ru   r  Úconstantr‹  r\   ra   Ú
index_expr©r7   rÈ   r›  s      r*   r   zCaptureIndexing.index_exprß  ók   € Ø—‘˜uÓ%ˆÜ�eœc¤5§=¡=Ð1Ô2Ø—;‘;×'Ñ'¬¨E«
°EÓ:Ð:Ø—‘ ¤×'AÑ'AÓBˆØ�{‰{×%Ñ% e¨UÓ3Ð3r)   c                ó&  — | j                  |«      }t        |t        t        j                  f«      r%| j
                  j                  t        |«      |«      S | j                  |t        j                  «      }| j
                  j                  ||«      S r$   )r�  r€   rs   rt   ru   r  rŸ  r‹  r\   ra   Ú
value_exprr¡  s      r*   r¤  zCaptureIndexing.value_expræ  r¢  r)   c                ó  — | j                  |«      }| j                  |t        j                  «      }| j                  j                  |«      }| j                  |t        j                  «      }| j                  j                  ||||«      S r$   )r�  r‹  r\   rb   r  rw   r  Úcheck_bounds)r7   rÈ   r$  ÚlowerÚuppers        r*   r¦  zCaptureIndexing.check_boundsí  sk   € Ø—‘˜uÓ%ˆØ—‘ ¤×'CÑ'CÓDˆØ�y‰y×3Ñ3°DÓ9ˆØ�‰˜t¤_×%AÑ%AÓBˆØ�{‰{×'Ñ'¨¨t°U¸EÓBÐBr)   c           	     ó˜  — |d   | j                  |d   t        j                  |d   ¬«      | j                  |d   t        j                  |d   ¬«      | j                  |d   t        j                  |d   ¬«      f}|�-|d   | j                  |d   t        j                  |d   ¬«      f}| j                  j	                  |||||||«      S )z3
        See [Note: Inductor bucketize op]
        r   r   r�  é   é   )r‹  r\   rc   r  Ú	bucketize)r7   rz   Ú
boundariesÚboundary_indicesÚindexing_dtypeÚrightÚsorterÚsorter_indicess           r*   r¬  z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                ó:  — | j                   j                  dd«      }| j                   j                  |«      | j                   j                  |<   t	        | j                   |g «      | j                   j
                  |<   | j                  j                  d|||fi «      S )zR
        Recursively capture the masked out body in another LoopBodyBlock
        NÚmasked_subblockrŠ  )r  r!  rJ  r2   rk   rh   r\  rU  )r7   Ú
mask_proxyÚmasked_bodyÚother_proxyr¥   s        r*   rH  zCaptureIndexing.masked%  s„   € ð �y‰y×&Ñ& tÐ->Ó?ˆØ%)§Y¡Y×%?Ñ%?ÀÓ%Eˆ�	‰	×Ñ˜TÑ"Ü$1°$·)±)¸[È"Ó$Mˆ�	‰	×Ñ˜DÑ!Ø�{‰{×'Ñ'Ø˜4 *¨kÐ!:¸Bó
ð 	
r)   c                óþ   ‡— | j                   j                  |«      }| j                   j                  |d«      }| j                  j	                  d|||fi «      Št        ˆfd„t        t        |«      «      D «       «      S )NrA  rŠ  c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr$   r(   r™  s     €r*   ró   z'CaptureIndexing.scan.<locals>.<genexpr>?  s   øè ø€ Ò@ 1�V˜A•YÑ@ùrš  )r  rE  r!  r\  rU  ry   rè   r{   )r7   Údtype_proxyrC  Úvalue_proxyrD  r¥   r4  s         @r*   rA  zCaptureIndexing.scan0  sq   ø€ ð �y‰y×'Ñ'¨
Ó3ˆØ�y‰y×&Ñ& t¨VÓ4ˆØ—‘×)Ñ)ØØØ˜+Ð&Øó	
ˆô Ó@¬¬c°+Ó.>Ó(?Ô@Ó@Ð@r)   c                óŒ   ‡— | j                   j                  ||||«      Št        ˆfd„t        t	        |«      «      D «       «      S )Nc              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr$   r(   r™  s     €r*   ró   z'CaptureIndexing.sort.<locals>.<genexpr>D  s   øè ø€ Ò; 1�V˜A•YÑ;ùrš  )r  Úsortry   rè   r{   )r7   rB  rz   ÚstableÚ
descendingr4  s        @r*   r¾  zCaptureIndexing.sortA  s7   ø€ Ø—‘×!Ñ! &¨&°&¸*ÓEˆäÓ;¬¬c°&«kÓ(:Ô;Ó;Ð;r)   c                óL   — | j                   j                  |«      }|d   |d   fS )Nr   r   )r  Úfrexp)r7   r»  r4  s      r*   rÂ  zCaptureIndexing.frexpF  s)   € Ø—‘×"Ñ" ;Ó/ˆà�q‘	˜6 !™9Ð%Ð%r)   c                óð   — | j                   j                  |«      }| j                   j                  ||||«      }| j                  j	                  d| j                   j                  |d|› �«      |fi «       |S )zx
        Flow data from tensors into indexing formulas.
        Introduce a call_module to update the indexing.
        rŠ  Úset_)r  r&  r>  r\  rU  r!  )r7   Úindex_proxyr$  r:  r;  r%  r<  s          r*   r8  z!CaptureIndexing.indirect_indexingK  sp   € ð �i‰i×$Ñ$ TÓ*ˆØ—y‘y×7Ñ7¸¸TÀ5È(ÓSˆØ�‰× Ñ ØØ�I‰I×#Ñ# L°D¸¸°,Ó?ØˆNØô		
ð ˆ
r)   c                ó@   — | j                   j                  dd|i «       y )Nr[  )r\  rU  )r7   r4  s     r*   r[  zCaptureIndexing.output[  s   € Ø�‰× Ñ  ¨8°V¸RÕ@r)   )r�  r†  r  re   r\  rK   )rv   rM  r  r\   r@   r   )rv   rM  rA   rM  )r¥   rU   rÈ   rM  )r¥   rU   rÈ   rs   r$   rL  )rz   r    r­  z.tuple[str, sympy.Expr, sympy.Expr, sympy.Expr]r®  r    r¯  ztorch.dtyper°  r›   r±  ztuple[str, sympy.Expr] | Noner²  zT | NonerA   r    )r¶  r|  )rC  z=Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]])TT)rB   rC   rD   r¥   r/   r‹  r�  r  r“  r  ra  r`  r   r¤  r¦  r¬  rH  rA  r¾  rÂ  r8  r[  rH   rI   s   @r*   rX  rX  ¦  sæ   ø„ Ø€Dðàðð ðð õ	ó
óQó-ó
2ó;ò?òò4ò4òCð 15Ø#'ð/
àð/
ð Cð/
ð ð	/
ð
 $ð/
ð ð/
ð .ð/
ð !ð/
ð 
ó/
ób	
ðAð RóAò"<ò
&ó
ö Ar)   rX  );Ú
__future__r   r™   rF   rÃ   rp  Úenumr   r   Útypingr   r   r   r	   rt   Útorch.fxr%   Útorch._dynamo.utilsr
   Útorch.fx.proxyr   r   Útorch.utils._sympy.functionsr   Útorch.utils._sympy.symbolr   rN   r   r   Úcodegen.commonr   Úops_handlerr   r   r   Úutilsr   r   r   r   r   r   Úvirtualizedr   r   Úcollections.abcr   r   r    r&   ÚInterpreterr"   rK   rT   r\   re   rk   rW  rX  r(   r)   r*   ú<module>rÕ     sÍ   ðå "ã Û Û Û 	ß ß :Ó :ã ã Ý (ß ,Ý ,Ý *ç "Ý 4ß CÑ C÷÷ ÷  ñ ß2ñ ˆCƒL€ô0�e—h‘h×*Ñ*ô 0ô8%�*ô %ô�*ô ô�dô ÷_ñ _÷DYñ Yôx;ˆ~ô ;ôvA�nõ vAr)   