Ë
    g^(hF\  ã                  óä  — 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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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' ddl(m)Z)m*Z* erd dl+m,Z,  ed«      Z- G d„ dej\                  j^                  «      Z0 G d„ de«      Z1 G d„ de«      Z2 G d„ de«      Z3 G d„ d«      Z4 G d„ d«      Z5 G d„ de «      Z6 G d„ de"«      Z7y) é    )ÚannotationsN)ÚautoÚEnum)ÚAnyÚCallableÚ
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)ÚSequenceÚTc                  ón   ‡ — e Zd Ze ej
                  d«      d„ «       «       Zˆ fd„Zdˆ fd„Zˆ fd„Z	ˆ xZ
S )ÚInterpreterShimNc                 óH   — t         j                  j                  t        «      S ©N)ÚtorchÚfxÚsymbolic_tracer   © ó    úW/var/www/skyplay_api_hub/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)Úselfr/   r0   Ú	__class__s      €r(   r-   zInterpreterShim.__init__+   sP   ø€ ô 	‰Ñ˜Ÿ™Ó)À%ÐÔHØˆŒØˆŒ
Ø$ˆŒØ$ˆÔØ$×0Ñ0ˆŒØ ˆÕr'   c                ó0   •— || _         t        ‰| �	  |«      S r"   )r4   r,   Úrun_node)r5   Únr6   s     €r(   r8   zInterpreterShim.run_node6   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)r5   ÚargsÚkwargsr6   s      €r(   r<   zInterpreterShim.run:   s7   ø€ Ü×&Ñ& tÓ,ñ 	0Ü‘7‘; Ð/¨Ñ/÷	0÷ 	0ò 	0ús   —0°9)r9   ztorch.fx.NodeÚreturnr   )Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚ	functoolsÚ	lru_cacher)   r-   r8   r<   Ú__classcell__©r6   s   @r(   r    r    %   s>   ø„ ØØ€Y×Ñ˜Óñ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$   ÚGraphr6   r/   r   ÚscopeÚmodule_stackÚnode_name_to_scope)r5   r6   s    €r(   r-   zLightTracer.__init__A   sE   ø€ Ü‰ÑÔÜ—X‘X—^‘^¨t¯~©~�^Ó>ˆŒ
Ü˜2˜t“_ˆŒ
ØˆÔØ"$ˆÕr'   )r@   rA   rB   r-   rF   rG   s   @r(   rI   rI   @   s   ø„ ÷%ð %r'   rI   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)ÚMemoryEntryÚstrÚ
index_nameúOptional[str]Úbuffer_nameÚmodeN)r@   rA   rB   Ú__annotations__r&   r'   r(   rR   rR   I   s   … ØƒOØÓØ
Ôr'   rR   c                  ón   — e Zd Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z	 e«       Z
y)ÚMemoryUsageTypeN)r@   rA   rB   r   ÚLOADÚ	LOAD_SEEDÚSTOREÚSTORE_REDUCTIONÚ
INDEX_EXPRÚCHECK_BOUNDSÚ	BUCKETIZEr&   r'   r(   rZ   rZ   O   s3   „ á‹6€DÙ“€IÙ‹F€EÙ“f€OÙ“€JÙ“6€LÙ“�Ir'   rZ   c                  óP  ‡ — 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<   ˆ fd„Zd„ 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d0d"„ZeZ	 	 d1	 	 	 	 	 	 	 d2d#„Zd$„ Zd%„ Zd&„ Zd'„ Zd(„ Zd)„ Zd*„ Zd+„ Zd,„ Z ˆ xZ!S )3Ú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_exprszdict[sympy.Expr, str]Úindexing_exprs_nameúdict[str, Any]r0   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_countsc                óF  •— 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Ú
isinstancerc   Ú_init_with_copyÚ_init_with_tracingÚindexing)r5   Úfnr=   rv   rt   ru   Ú_flat_sizesr6   s          €r(   r-   zLoopBody.__init__j   sœ   ø€ Ü‰ÑÔä˜J×-Ñ-Ó/Ó0ˆàÐ(œ#˜i›.Ð)Øœ˜I›Ð(Ð)ð
ˆŒ
ð
 #ˆŒØ&ˆÔØ$ˆŒä�bœ(Ô#Ø× Ñ   TÔ*ð ˆ�ð ×#Ñ# B¨Ô-àˆ�r'   c                ó  — i | _         i | _        d| j                  i| _        i | _        g | _        i | _        t        D �ci c]  }|g “Œ c}| _        t        j                  «       | _        t        | ||«      | _        | `yc c}w )z9Do an FX trace of an arbitrary callable to construct selfÚ	get_indexN)rd   re   r~   r0   rg   rh   ri   rZ   rl   ÚcollectionsÚCounterrn   rj   rk   )r5   r{   r=   Úts       r(   ry   zLoopBody._init_with_tracing~   s{   € à ˆÔØ#%ˆÔ Ø&¨¯©Ð7ˆŒØˆŒØˆÔØCEˆÔ Ü,;Ö< q˜Q ™UÒ<ˆÔÜ$×,Ñ,Ó.ˆŒÜ'¨¨b°$Ó7ˆŒØÑ$ùò =s   ¿
A?c           	     ó  — |j                  |«      }|j                  «       D ��ci c]:  \  }}|t        j                  j                  j                  || j                  «      “Œ< c}}| _        |j                  j                  «       D ��ci c]  \  }}||j                  | «      “Œ c}}| _        |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Úitemsr   r/   ÚsizevarsÚsimplify_with_rangesrv   rd   rg   Úclonerh   ri   rl   rn   rk   r0   Úpopr~   )	r5   Úotherr=   rd   ÚnameÚexprÚkÚvr0   s	            r(   rx   zLoopBody._init_with_copy‹   sI  € ð ×1Ñ1°$Ó7ˆð -×2Ñ2Ó4÷
á��dð ”!—'‘'×"Ñ"×7Ñ7¸¸d¿o¹oÓNÑNó
ˆÔð 8=·±×7LÑ7LÓ7N×O©t¨q°!˜!˜QŸW™W T›]Ñ*ÓOˆŒØ"×0Ñ0ˆÔØ#(×#<Ñ#<ˆÔ Ø!×.Ñ.ˆÔØŸ™ˆŒØ×*Ñ*×0Ñ0°Ó6ˆŒà)˜×(Ñ(Ð)ˆ
Ø�‰�{Ô#à˜Ÿ™ð
à,6×,<Ñ,<Ó,>×?¡D A qˆq�!—'‘'˜$“-ÑÓ?ð
ˆ�ùó
ùó Pùó @s   ¥?E9Â
E?ÅFc                ó@   — | j                   j                  |d«      dkD  S )Nr   )rn   Úget©r5   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        |||«      «      \  }}}
t        j                  ||d¬«      \  \  }}}t        | |	|«       ||«      g|||«      }t        j                  ||d¬«      \  \  }}}t        |||f|||«      }|S )zU
        Merge both iteration and reduction loops and return a new LoopBody.
        r�   )ÚprefixÚp)rs   Úvarsrd   rq   r   r/   r…   Ú_simplify_loopsr   r   Úindex_vars_no_squeezerc   )r5   Ú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_reindexrt   ru   rv   Únew_bodyÚ
iter_vars2Úreduce_vars2Úvar_ranges2Ú	new_body2s                        r(   Úmerge_loopszLoopBody.merge_loops§   sD  € ð ˆØ—J‘Jˆ	Ø)1¯©Ñ&ˆ�Ø+4Ñ(ˆÐ(à9˜×/Ñ/×6Ñ6Ó8Ð9ˆä&'§g¡g×&6Ñ&6×&FÑ&FØØÜ$ [°-ÀÓPó'
Ñ#ˆ
�L !ô +,¯'©'×*:Ñ*:×*JÑ*JØØÜ$ [°/ÐCSÓTó+
Ñ'ˆ�n aô. ×.Ñ.¨z¸<ÐPSÔTñ	
ñØØàäØÙ˜)Ó$¡n°[Ó&AÐBØØØó
ˆô 3?×2TÑ2TØ˜¨Sô3
Ñ/Ñ"ˆ�\ Kô Ø�z <Ð0°+¸zÈ<ó
ˆ	ð Ð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|	||«      }t	        j
                  |ddiŽ\  \  }}}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]  }||   ‘Œ	 }} ‰||«      S c c}w r"   )Ú	itertoolsÚchainÚfrom_iterablerr   )	ÚindicesÚindexÚiter_idxÚ
reduce_idxÚiÚinverse_orderÚ	iter_sizer˜   Úreduce_sizes	        €€€€r(   r¤   z-LoopBody.reorder_iter_loops.<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Ø-:Ö;¨˜ ›Ð;ˆHÐ;Ù˜H jÓ1Ð1ùò <s   Á(A?r”   )r°   zSequence[sympy.Expr]r?   r   )	Úirr«   rs   rr   r   r—   Ú	enumerateÚrangerc   )r5   Ú	new_orderr«   r™   Ú
reorder_fnÚnew_iter_sizeÚ	new_sizesrt   ru   rv   ÚaÚbr´   r¤   Ú	loop_bodyr¥   r¦   r§   rµ   r¶   r˜   r·   s                     @@@@r(   Úreorder_iter_loopszLoopBody.reorder_iter_loopsâ   s4  û€ õ 	%àˆØ—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ˆ÷	2ð 	2ô Ø�y +Ð.°
¸IÀ{ó
ˆ	ô
 3?×2TÑ2TØð3
àñ3
Ñ/Ñ"ˆ�\ Kô Ø˜
 LÐ1°;À
ÈLó
ˆð ˆùó/ @ùÚIs   Á7C5ÂC;c                ój   — | j                   €J ‚| j                  €J ‚| j                   | j                  fS r"   )rt   ru   ©r5   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"   )r/   )Ú.0Úblocks     r(   ú	<genexpr>z%LoopBody.get_nodes.<locals>.<genexpr>  s   è ø€ Ò>˜UˆU�[�[Ñ>ùs   ‚)r­   r®   rk   r/   rg   rq   Únodes)r5   Ú
all_graphsr/   Únodes       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Ï   )r5   rÏ   s     r(   rÐ   zLoopBody.bounds  s   € õ 	&á˜‹Ðr'   c                óÂ   — t        | j                  t        j                     «      D ],  }|j                  |k(  sŒ| j
                  |j                     c S  t        |«      ‚r"   )Úreversedrl   rZ   r[   rV   rd   rT   ÚKeyError©r5   rV   Ú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®   rl   rZ   r]   r^   rV   rd   rT   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"   )rl   rZ   r[   rd   rT   ©r5   rÕ   s     r(   Úget_read_exprszLoopBody.get_read_exprs5  sF   € ð ×*Ñ*¬?×+?Ñ+?Ñ@ö
àð ×Ñ × 0Ñ 0Ó1ò
ð 	
ùò 
s     Ac                óî   — t        j                  | j                  t        j                     | j                  t        j
                     «      D �cg c]  }| j                  |j                     ‘Œ c}S c c}w r"   )r­   r®   rl   rZ   r]   r^   rd   rT   rÚ   s     r(   Úget_write_exprszLoopBody.get_write_exprs;  sf   € ô #Ÿ™Ø×!Ñ!¤/×"7Ñ"7Ñ8Ø×!Ñ!¤/×"AÑ"AÑBóö
àð ×Ñ × 0Ñ 0Ó1ò
ð 	
ùò 
s   Á A2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ú
)Údictrv   Úextendrd   r„   r­   r®   rk   rg   Ú	debug_strÚjoin)r5   ÚlinesrŠ   ÚvalrÈ   s        r(   rã   zLoopBody.debug_strD  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)rr   rl   rZ   r[   r]   r0   rk   Úcontains_only_opsrÄ   s    r(   Úis_memory_copyzLoopBody.is_memory_copyQ  s}   € ô �×!Ñ!¤/×"6Ñ"6Ñ7Ó8¸AÑ=ò EÜ�D×%Ñ%¤o×&;Ñ&;Ñ<Ó=ÀÑBòEä�D—O‘OÓ$¨Ñ)òEð —‘×1Ñ1Ð2CÓDð		
r'   c                óþ   — | j                   j                  |«      }|s6dt        | j                  «      › �}|| j                   |<   || j                  |<   | j                  |   j                  t        |||«      «       |S )Nr±   )re   r�   rr   rd   rl   ÚappendrR   )r5   r‹   ÚmtyperV   rW   rŠ   s         r(   Úadd_index_exprzLoopBody.add_index_expr_  s|   € ð ×'Ñ'×+Ñ+¨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 opcodeséÿÿÿÿ)Ú	isnumericr0   rr   )r5   rÈ   r“   rŠ   s       r(   Úadd_submodulezLoopBody.add_submodulen  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   ÚINDIRECTrr   rh   ri   rí   )r5   ÚsizeÚvars      r(   Úadd_indirectzLoopBody.add_indirectw  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)rS   rz   r„   r   )r5   Ú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"   )rz   r�   s     r(   r~   zLoopBody.get_index…  s!   € Ø�}‰}Ð(Ð(Ð(Ø�}‰}˜TÑ"Ð"r'   c           	     óÚ  ‡ — g t         j                  j                  |«      ¢}t        |«      t        ‰ j                  «      k(  sJ |‰ j                  f«       ‚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"   )rv   )rÇ   r�   r5   s     €r(   rÉ   z.LoopBody.indexing_from_args.<locals>.<genexpr>Œ  s   øè ø€ Ò;°�1˜DŸO™OÔ+Ñ;ùó   ƒzself.var_ranges=z
, indices=)r­   r®   r¯   rr   rv   Úallrá   ÚzipÚkeysrd   r„   r   )r5   r°   r±   ÚreplacementsrŠ   r‹   s   `     r(   rƒ   zLoopBody.indexing_from_args‰  sÖ   ø€ Ø9”)—/‘/×/Ñ/°Ó8Ð9ˆÜ�5‹zœS §¡Ó1Ò1ÐK°E¸4¿?¹?Ð3KÓKÐ1ÜÓ;°UÔ;Ô;ð 	
Øˆt�‰Ð   7 *Ð-ó	
Ð;ô œC §¡× 4Ñ 4Ó 6¸Ó>Ó?ˆð #×1Ñ1×7Ñ7Ó9÷
á��dð ”*˜T <Ó0Ñ0ó
ð 	
ùó 
s   ÃC'c                ó`   — | j                  |«      | _        | j                  «       }d | _        |S r"   )rƒ   rz   rk   )r5   r°   Úresults      r(   Ú__call__zLoopBody.__call__•  s,   € Ø×/Ñ/°Ó8ˆŒØ—‘Ó"ˆØˆŒØˆr'   c                ó|   ‡ ‡‡‡‡— ˆˆ ˆˆˆfd„}t        j                  t        j                  ‰‰‰‰¬«      |_        |S )Nc           	     ój   •— ‰j                  ‰t        j                  j                  | ‰‰‰«      «       y r"   )rü   r   r   Úindirect_indexing)Únew_varÚcheckr5   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  )rD   Úpartialrc   Úbind_set_indirect_shimr‡   )r5   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)Údtypesrq   Ú
combine_fns     €r(   Úshimz%LoopBody.bind_scan_shim.<locals>.shim«  s   ø€ Ü—5‘5—:‘:˜f j°&Ó9Ð9r'   )r  )rD   r  rc   Úbind_scan_shimr‡   )r5   r  r  s    ` r(   r  zLoopBody.bind_scan_shimª  s)   ø€ ô	:ô ×&Ñ&¤x×'>Ñ'>È:ÔVˆŒ
Øˆr'   c                ój   ‡ ‡— ˆˆ fd„}t        j                  t        j                  ‰¬«      |_        |S )Nc                ó`   •— t         j                  j                  | ‰j                  ‰   |«      S r"   )r   r   Úmaskedrg   )Úmaskr‰   rŠ   r5   s     €€r(   r  z'LoopBody.bind_masked_shim.<locals>.shim²  s#   ø€ Ü—5‘5—<‘<  d§n¡n°TÑ&:¸EÓBÐBr'   )rŠ   )rD   r  rc   Úbind_masked_shimr‡   )r5   rŠ   r  s   `` r(   r  zLoopBody.bind_masked_shim±  s*   ù€ õ	Cô ×&Ñ&¤x×'@Ñ'@ÀtÔLˆŒ
Øˆr'   )r‰   rc   )rŠ   rS   )r?   rc   ©r?   Úbool©NN)r‹   ú
sympy.Exprrî   rZ   rV   rU   rW   rU   )"r@   rA   rB   Ú__doc__rX   r-   ry   rx   r‘   r©   rÂ   Úpropertyr•   r   rÍ   rÐ   rÖ   rØ   rÛ   rÝ   rã   rë   Ú__repr__rï   ró   rø   rü   r~   rƒ   r  r  r  r  rF   rG   s   @r(   rc   rc   Z   s$  ø… ñð
 *Ó)Ø.Ó.ØÓØ'Ó'Ø%Ó%Ø7Ó7ØÓØ:Ó:Ø'Ó'ôò(%ó
ó2/ó9óv,ð\ ñ0ó ð0ð
 ñFó ðFð ñó ðò$ò$ò
ò
ò ó

ð €Hð &*Ø"ðàðð ðð #ð	ð
 óòòòYò#ò

òòòör'   rc   c                  ó6   — e Zd ZdZdd„Zd„ Zd	d„Zd
d„Zdd„Zy)rj   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, hower 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ß   rI   Úcreate_proxyÚindex_propagationr'  ÚCountOpsÚCaptureIndexingrn   r   Úconstant_and_index_propagationrv   ri   r   Úset_ops_handlerr   Úoutputr/   )r5   rß   r{   r=   ÚtracerÚ	proxy_opsr'  Úhandlers           r(   r-   zLoopBodyBlock.__init__Á  sº   € ØˆŒ	ä“ˆØ×'Ñ'¨°u¸bÀ"ÓEˆ	å7äÜ˜I t¨VÓ4Ø�N‰Nó
ˆô ×0Ò0Ù&Ø˜Ÿ™×-Ñ-¨t¯y©y×/LÑ/LóˆGô ×Ñ˜wÓ'ñ 	"ô �J‰J‘r˜4�yÔ!÷	"ð —\‘\ˆ�
÷		"ð 	"ús   Â$CÃC c                ó    — | j                   }| j                  j                  }t        ||«      j	                  t        j                  «       «      S r"   )r/   rß   r0   r    r<   r   Úget_ops_handler)r5   r/   r0   s      r(   r  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]*rL   zdef forward(zdef ú()r#   r$   ÚGraphModulerß   r0   r/   ÚcodeÚreÚsubÚstripÚreplace)r5   rŠ   r7  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"   )Útarget)rÇ   rÌ   Úallowed_opss     €r(   rÉ   z2LoopBodyBlock.contains_only_ops.<locals>.<genexpr>è  s"   øè ø€ ò 
àð �K‰K˜;Ô&ñ
ùr   Úcall_method)Úop)r  r/   Ú
find_nodes)r5   r?  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ß   )rj   Ú__new__Ú__dict__Úupdate)r5   rß   Úcopys      r(   r‡   zLoopBodyBlock.cloneí  s:   € ä×$Ñ$¤]Ó3ˆØ�‰×ÑÐ< §¡Ð<¨v°tÑ<Ô=Øˆr'   N)rß   rc   r{   úCallable[..., Any]r=   z	list[Any])rÈ   r  )rß   rc   )	r@   rA   rB   r!  r-   r  rã   rê   r‡   r&   r'   r(   rj   rj   ¹  s!   „ ñó"ò.Kó
ó
ôr'   rj   c                  ó   — e Zd Zdd„Zdd„Zy)r*  c                ó    — || _         || _        y r"   )Ú_innerÚ_counts)r5   ÚinnerÚcountss      r(   r-   zCountOps.__init__õ  s   € ØˆŒØˆ�r'   c                óh   — | j                   |xx   dz  cc<    t        | j                  |«      |i |¤ŽS )Nr   )rL  ÚgetattrrK  )r5   rŠ   r=   r>   s       r(   Ú_defaultzCountOps._defaultù  s3   € Ø�‰�TÓ˜aÑÓØ)Œw�t—{‘{ DÓ)¨4Ð:°6Ñ:Ð:r'   N)rM  úOpsHandler[Any]rN  rm   )rŠ   rS   r=   ztuple[Any, ...]r>   rf   r?   r   )r@   rA   rB   r-   rQ  r&   r'   r(   r*  r*  ô  s   „ óô;r'   r*  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	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Z	 	 dd„Zd„ Zd„ Zdd„Zd„ Zˆ xZS )r+  c                ó@   •— t         ‰| �  |«       || _        || _        y r"   )r,   r-   rß   r/  )r5   rM  rß   r/  r6   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/  r(  rß   rï   )r5   r‹   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   r/   r…   r†   rß   rv   )r5   r‹   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©rV   )rY  rW  rZ   r[   rK  rè   ©r5   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[  )
rw   Úintrß   rï   ÚsympyÚIntegerrZ   r\   rK  Ú	load_seedr]  s      r(   rb  zCaptureIndexing.load_seed  sX   € Ü˜%¤Ô%Ð%Ð%Ø�	‰	× Ñ Ü�M‰M˜%Ó ¤/×";Ñ";Èð 	!ô 	
ð �{‰{×$Ñ$ T¨5Ó1Ð1r'   c                ó¦   — | j                  |«      }| j                  |t        j                  ||¬«      }| j                  j                  ||||«      S )N)rV   rW   )rY  rW  rZ   r]   rK  ré   )r5   rŠ   r±   ÚvaluerW   s        r(   ré   zCaptureIndexing.store"  sO   € Ø—‘˜uÓ%ˆØ—‘Ø”?×(Ñ(°dÀð  ó 
ˆð �{‰{× Ñ   u¨e°TÓ:Ð:r'   c                ó¢   — | j                  |«      }| j                  |t        j                  |¬«      }| j                  j                  |||«      S r[  )rY  rW  rZ   r^   rK  Ústore_reduction)r5   rŠ   r±   rd  s       r(   rf  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´   r  s     €r(   rÉ   z,CaptureIndexing.reduction.<locals>.<genexpr>4  s   øè ø€ Ò? q˜ �Ñ?ùó   ƒ)rK  Ú	reductionr   rp   rº   )r5   ÚdtypeÚ	src_dtypeÚreduction_typerd  Únum_outputsr  s         @r(   rk  zCaptureIndexing.reduction0  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"   )rY  rw   r_  r`  ra  rK  ÚconstantrW  rZ   r_   Ú
index_expr)r5   r±   rl  s      r(   rr  zCaptureIndexing.index_expr7  sk   € Ø—‘˜uÓ%ˆÜ�eœc¤5§=¡=Ð1Ô2Ø—;‘;×'Ñ'¬¨E«
°EÓ:Ð:Ø—‘ ¤×'AÑ'AÓBˆØ�{‰{×%Ñ% e¨UÓ3Ð3r'   c                óà   — | j                  |«      }| j                  |t        j                  «      }| j                  |t        j                  «      }| j                  j                  ||||«      S r"   )rY  rW  rZ   r`   rK  Úcheck_bounds)r5   r±   rö   ÚlowerÚuppers        r(   rt  zCaptureIndexing.check_bounds>  sW   € Ø—‘˜uÓ%ˆØ—‘ ¤×'CÑ'CÓDˆØ�‰˜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\  é   é   )rW  rZ   ra   rK  Ú	bucketize)r5   rq   Ú
boundariesÚboundary_indicesÚindexing_dtypeÚrightÚsorterÚsorter_indicess           r(   rz  zCaptureIndexing.bucketizeD  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_subblockrV  )rß   ró   r  r0   rj   rg   r/  r(  )r5   Ú
mask_proxyÚmasked_bodyÚother_proxyrŠ   s        r(   r  zCaptureIndexing.maskedu  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 )Nr  rV  c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr"   r&   ri  s     €r(   rÉ   z'CaptureIndexing.scan.<locals>.<genexpr>�  s   øè ø€ Ò@ 1�V˜A•YÑ@ùrj  )rß   r  ró   r/  r(  rp   rº   rr   )r5   Údtype_proxyr  Úvalue_proxyr  rŠ   r  s         @r(   r  zCaptureIndexing.scan€  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&   ri  s     €r(   rÉ   z'CaptureIndexing.sort.<locals>.<genexpr>”  s   øè ø€ Ò; 1�V˜A•YÑ;ùrj  )rK  Úsortrp   rº   rr   )r5   r  rq   ÚstableÚ
descendingr  s        @r(   rŒ  zCaptureIndexing.sort‘  s7   ø€ Ø—‘×!Ñ! &¨&°&¸*ÓEˆäÓ;¬¬c°&«kÓ(:Ô;Ó;Ð;r'   c                óL   — | j                   j                  |«      }|d   |d   fS )Nr   r   )rK  Úfrexp)r5   r‰  r  s      r(   r�  zCaptureIndexing.frexp–  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.
        rV  Úset_)rß   rø   r  r/  r(  ró   )r5   Úindex_proxyrö   r  r  r÷   r  s          r(   r
  z!CaptureIndexing.indirect_indexing›  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/  r(  )r5   r  s     r(   r.  zCaptureIndexing.output«  s   € Ø�‰× Ñ  ¨8°V¸RÕ@r'   )rM  rR  rß   rc   r/  rI   )r‹   r   rî   rZ   r>   r   )r‹   r   r?   r   )rŠ   rS   r±   r   )rŠ   rS   r±   r_  r"   r  )rq   r   r{  z.tuple[str, sympy.Expr, sympy.Expr, sympy.Expr]r|  r   r}  ztorch.dtyper~  r  r  z Optional[tuple[str, sympy.Expr]]r€  zOptional[T]r?   r   )r„  rH  )r  z=Callable[[tuple[Any, ...], tuple[Any, ...]], tuple[Any, ...]])TT)r@   rA   rB   rŠ   r-   rW  rY  rè   rb  ré   rf  rk  rr  rt  rz  r  r  rŒ  r�  r
  r.  rF   rG   s   @r(   r+  r+  þ  sá   ø„ Ø€Dðàðð ðð õ	ó
óQó-ó
2ó;ò?òò4òCð 48Ø&*ð/
àð/
ð Cð/
ð ð	/
ð
 $ð/
ð ð/
ð 1ð/
ð $ð/
ð 
ó/
ób	
ðAð RóAò"<ò
&ó
ö Ar'   r+  )8Ú
__future__r   r   rD   r­   r8  Úenumr   r   Útypingr   r   r   r	   r
   r   r`  Útorch.fxr#   Útorch._dynamo.utilsr   Útorch.fx.proxyr   r   Útorch.utils._sympy.symbolr   rL   r   r   Úcodegen.commonr   Úops_handlerr   r   r   Úutilsr   r   r   r   Úvirtualizedr   r   Úcollections.abcr   r   r$   ÚInterpreterr    rI   rR   rZ   rc   rj   r*  r+  r&   r'   r(   ú<module>r¢     sÈ   ðå "ã Û Û Û 	ß ß N× Nã ã Ý (ß ,Ý *ç "Ý 4ß CÑ C÷ó ÷  ñ Ý(ñ ˆCƒL€ô0�e—h‘h×*Ñ*ô 0ô6%�*ô %ô�*ô ô�dô ÷\ñ \÷~
8ñ 8ôv;ˆ~ô ;ônA�nõ nAr'   