
    ȅii                       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        S/home/james-whalen/.local/lib/python3.13/site-packages/torch/_inductor/loop_body.py	_dummy_gmInterpreterShim._dummy_gm&   s     xx&&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$ )LightTracerA   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    XX^^t~~^>
2t_
"$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)	MemoryEntryJ   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)MemoryUsageTypeP   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    6DIFEfOJ6L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 

 yy}())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&*#$*:*::jjmdjjm3UW=
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 ,;<OqUO<$,,.'$7&*oo&;&;&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ooNN4
 8=7L7L7NO7Ntq!WWT]*7NO"00#(#<#< !..**006&+&B&B#)(()
{#
,6,<,<,>?,>DAq''$-,>?

 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  pn
[        R
                  R                  R                  UU[        XtU5      5      u  pn
X:X  a  X:X  a  U$ [        R                  " XS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
    JJ	)1&+4(9//6689&'gg&6&6&F&F$[P'
#
! +,''*:*:*J*J$[CST+
'a 'L,LO ..zPS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	[	        XU4XU5      n
[        R                  " USS06u  u  pn[	        XU4XU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    =ioo33G<=Eu:Y#k2B!BBBB-s9~.Hs9~/0J>L&.y&9N&JL#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     JJ	!*	;"9-Y#,i "K0	/;/Q/Q0
0
, *
		6 		6 +.
{
	
 3?2T2T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  pX_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    =ioo33G<=Eu:Y#k2B!BBBB-s9~.Hs9~/0J-:;]]H;HT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     	%JJ	9Q< C	N222!),
!*	;"9-"K0	/;/Q/Q0
0
, *
 +4I*>?*>$!*>?38Y3HI3Ha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    ____""$>dnn&;&;&=>

 #-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//0D0DEFE  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//0D0DEFE  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     doo!6 7899L9L9R9R9TU9TIDc#'9TUV $-??doo./1E1E1G$$KD %$	
 yy 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8A= ED%%o&;&;<=BEDOO$)E 112C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3t22345D-1$$T*(,%% ''Dt(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    ":!!fOO&CDXc$//234D %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]    s8s3x}}(((BF--BUBUBWXBW$!Jq*55BW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__$es   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5zS11KE4??3KK1)S 1
.31
 .
 .
 	-doo{',	- 
 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_indirect5LoopBody.bind_set_indirect_shim.<locals>.set_indirect  s+    !!QUU,,WdE8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    55::fj&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#    55<<dnnT&: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    	''ub"E	7IV4NN
 00&--tyy/L/LG w' JJr4y! ( \\
	 ('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_reductionr   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   JJ$$D{{k)w{{//  y % 
su"((2,jjmjjm !#dii&;&;"<

 ZZ''.JJ""$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    

YY))
u155a6G6G6I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    xx##DII$8$8$**EJJvvJJL  4vQ@	
 	
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!      
? KK;&?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<<vt<=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<    {{''YY%%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'    ww44T99;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    %%%%%		  MM% /";"; 	! 	
 {{$$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%ec5==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     qMOO1))&qM  
 OO1))&qM  
 OO1))&qM  

$ q	1I88fQi   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     yy&&t->?%)YY%?%?%E		T"$1$))["$M		D!{{''4k!: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     @(?1VAY(?r  )r  ra  r4  r}  rv  r|   r   r~   )r7   dtype_proxyr^  value_proxyr_  r   rL  s         @r)   r\  CaptureIndexing.scan  so     yy''
3yy&&tV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     ;(:1VAY(: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     ii$$T*yy775S  II##LD,?N		
 
r(   c                @    U R                   R                  SSU0 5        g )Nr|  )r}  rv  )r7   rL  s     r)   r|  CaptureIndexing.output  s      8VR@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 CL0ehh** 08%* %* d h hVT Tn;~ ;nAn nAr(   