
    7h^                       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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,  \" 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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                  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/var/www/fran/franai/venv/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$ )LightTracer@   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__A   sE    XX^^t~~^>
2t_
"$r(   )r1   rW   rX   rV   )rE   rF   rG   rH   r/   rL   rM   rN   s   @r)   rP   rP   @   s    % %r(   rP   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg)	MemoryEntryI   str
index_nameOptional[str]buffer_namemoder'   N)rE   rF   rG   rH   __annotations__rL   r'   r(   r)   r[   r[   I   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)MemoryUsageTypeO   r'   N)rE   rF   rG   rH   r   LOAD	LOAD_SEEDSTORESTORE_REDUCTION
INDEX_EXPRCHECK_BOUNDS	BUCKETIZErL   r'   r(   r)   rd   rd   O   s3    6DIFEfOJ6LIr(   rd   c                  t  ^  \ 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'   U 4S jrS rS1S jrS2S jr	S3S jr
S3S 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S4S% jr\r  S5       S6S& jjrS' rS( rS) rS* rS+ rS, r S- r!S. r"S/ r#S0r$U =r%$ )7LoopBodyZ   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_exprszdict[sympy.Expr, str]indexing_exprs_name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_countsc                8  > [         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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   _flat_sizesr8   s          r)   r/   LoopBody.__init__j   s    J--/0(#i.)I()


 #&$b(##  *##B-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 ?gs  snf )z9Do an FX trace of an arbitrary callable to construct self	get_indexN)rp   rq   r   r2   rs   rt   ru   rd   rx   collectionsCounterrz   rv   rw   )r7   r   rA   ts       r)   r   LoopBody._init_with_tracing~   s{     #% &7CE ,;<OqUO<$,,.'$7$ =s   Bc           	        UR                  U5      nUR                  5        VVs0 s H9  u  pEU[        R                  R                  R                  XPR                  5      _M;     snnU l        UR                  R                  5        VVs0 s H  u  pgXgR                  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        0 UR                  EnUR!                  S5        SU R"                  0UR                  5        VVs0 s H  u  pgXgR                  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   rs   clonert   ru   rx   rz   rw   r2   popr   )	r7   otherrA   rp   nameexprkvr2   s	            r)   r   LoopBody._init_with_copy   sN    11$7 -224
4
 !''""77ooNN4
 8=7L7L7NO7Ntq!WWT]*7NO"00#(#<#< !..**006)(()
{#
,6,<,<,>?,>DAq''$-,>?

 P @s   A E<FFc                @    U R                   R                  US5      S:  $ )Nr   )rz   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
[        R                  " XSS9u  u  nnn[        UU	" U5      U" U5      /UUU5      n[        R                  " XSS9u  u  nnn[        UUU4UUU5      nU$ )zE
Merge both iteration and reduction loops and return a new LoopBody.
r   )prefixp)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_body
iter_vars2reduce_vars2var_ranges2	new_body2s                        r)   merge_loopsLoopBody.merge_loops   s3    JJ	)1&+4(9//6689&'gg&6&6&F&F$[P'
#
! +,''*:*:*J*J$[CST+
'a. ..zPST	
)$n[&AB
 3?2T2TS3
/"\K z<0+z<
	 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[        XU4XU5      n[        R
                  " USS06u  u  nnn[        XU4UUU5      nU$ 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#5      $ s  snf r#   )	itertoolschainfrom_iterabler~   )	indicesindexiter_idx
reduce_idxiinverse_order	iter_sizer   reduce_sizes	        r)   r   -LoopBody.reorder_iter_loops.<locals>.new_body   s    =ioo33G<=Eu:Y#k2B!BBBB-s9~.Hs9~/0J-:;]]H;H11 <s   )Br   )r   zSequence[sympy.Expr]rD   r   )	irr   r   r~   r   r   	enumeraterangern   )r7   	new_orderr   r   
reorder_fnnew_iter_size	new_sizesr   r   r   abr   r   	loop_bodyr   r   r   r   r   r   r   s                     @@@@r)   reorder_iter_loopsLoopBody.reorder_iter_loops   s4    	%JJ	9Q< C	N222!),
!*	;"9-"K0	/;/Q/Q0
0
, *
 +4I*>?*>$!*>?38Y3HI3Haq)3HI	2 	2 +.
{
	
 3?2T2T3
3
/"\K L1;
L
 / @Is   8C: D c                n    U R                   c   eU R                  c   eU R                   U R                  4$ r#   )r   r   r7   s    r)   r   LoopBody.vars  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     >&=U[[&=s   )r   r   rw   r1   rs   r}   nodes)r7   
all_graphsr1   nodes       r)   	get_nodesLoopBody.get_nodes  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.bounds  s     	&r(   c                    [        U R                  [        R                     5       H.  nUR                  U:X  d  M  U R
                  UR                     s  $    [        U5      er#   )reversedrx   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   rx   rd   rh   ri   r`   rp   r^   r   r   s      r)   get_write_exprLoopBody.get_write_expr,  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#   )rx   rd   rf   rp   r^   r7   r   s     r)   get_read_exprsLoopBody.get_read_exprs5  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   rx   rd   rf   r`   appendrp   r^   r7   r`   outr   s       r)   get_all_read_exprLoopBody.get_all_read_expr;  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   rx   rd   rh   ri   rp   r^   r   s     r)   get_write_exprsLoopBody.get_write_exprsC  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   rx   rd   rh   ri   r`   r   rp   r^   r   s       r)   get_all_write_exprLoopBody.get_all_write_exprL  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   rw   rs   	debug_strjoin)r7   linesr   valr   s        r)   r  LoopBody.debug_strV  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~   rx   rd   rf   rh   r2   rw   contains_only_opsr   s    r)   is_memory_copyLoopBody.is_memory_copyc  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   )rq   r   r~   rp   rx   r   r[   )r7   r   mtyper`   ra   r   s         r)   add_index_exprLoopBody.add_index_exprq  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 opcodes)	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~   rt   ru   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 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  pEU[        XS5      _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     ;UDOO+Us   zself.var_ranges=z
, indices=)r   r   r   r~   r   allr  zipkeysrp   r   r   )r7   r   r   replacementsr   r   s   `     r)   r   LoopBody.indexing_from_args  s    9)////895zS11KE4??3KK1;U;;; 	
t 7*-	
; C 4 4 6>? #11779
9
 *T009
 	
 
s   C1c                `    U R                  U5      U l        U R                  5       nS U l        U$ r#   )r   r   rw   )r7   r   results      r)   __call__LoopBody.__call__  s,    //8"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   r  r  wrap_negs    r)   set_indirect5LoopBody.bind_set_indirect_shim.<locals>.set_indirect  s+    !!QUU,,WdE8Lr(   )r  r  r8  r9  )rJ   partialrn   bind_set_indirect_shimr   )r7   r  r  r8  r9  r:  s   ````` r)   r=  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(   )rC  )rJ   r<  rn   bind_scan_shimr   )r7   rC  rD  s    ` r)   rF  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   maskedrs   )maskr   r   r7   s     r)   rD  'LoopBody.bind_masked_shim.<locals>.shim  s#    55<<dnnT&:EBBr(   )r   )rJ   r<  rn   bind_masked_shimr   )r7   r   rD  s   `` r)   rM  LoopBody.bind_masked_shim  s*    	C &&x'@'@tL
r(   )r   rp   rq   ru   rt   r   rx   rz   r   rw   r   rs   r2   r   )r   rn   )r   r]   )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   propertyr   r   r   r   r   r   r   r   r   r   r  r  __repr__r  r  r  r$  r   r   r2  r=  rF  rM  rL   rM   rN   s   @r)   rn   rn   Z   s3   
 *)..''%%77::''(%
2/9v,\ 0 0
 F F  $$

 

 H &*"  #	
 Y#

 r(   rn   c                  F    \ rS rSrSrS
S jrS rSS jrSS jrSS jr	Sr
g	)rv   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_propagationrY  CountOpsCaptureIndexingrz   r   constant_and_index_propagationr   ru   r   set_ops_handlerr   outputr1   )r7   r  r   rA   tracer	proxy_opsrY  handlers           r)   r/   LoopBodyBlock.__init__  s    	''ub"E	7IV4NN
 00&--tyy/L/LG w' JJr4y! ( \\
	 ('s   'C
C)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)   r2  LoopBodyBlock.__call__  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   rk  s      r)   r  LoopBodyBlock.debug_str  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#   )target)r   r   allowed_opss     r)   r   2LoopBodyBlock.contains_only_ops.<locals>.<genexpr>  s!      
? KK;&?s   call_method)op)r+  r1   
find_nodes)r7   rt  s    `r)   r  LoopBodyBlock.contains_only_ops  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  )rv   __new____dict__update)r7   r  copys      r)   r   LoopBodyBlock.clone  s:    $$]3<<vt<=r(   )r  r1   N)r  rn   r   Callable[..., Any]rA   z	list[Any])r   rO  )r  rn   )rE   rF   rG   rH   rS  r/   r2  r  r  r   rL   r'   r(   r)   rv   rv     s!    ".K

r(   rv   c                  (    \ rS rSrSS jrSS jrSrg)r\  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._default  s1    Tat{{D)4:6::r(   )r  r  N)r  OpsHandler[Any]r  ry   )r   r]   rA   ztuple[Any, ...]rB   rr   rD   r   )rE   rF   rG   rH   r/   r  rL   r'   r(   r)   r\  r\    s    ;r(   r\  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$ )r]  i  c                <   > [         TU ]  U5        X l        X0l        g r#   )r.   r/   r  ra  )r7   r  r  ra  r8   s       r)   r/   CaptureIndexing.__init__  s     		r(   c           	     v    U R                   R                  SSU R                  R                  " X40 UD640 5      $ )Ncall_moduler   )ra  rZ  r  r  )r7   r   r  rB   s       r)   
_add_indexCaptureIndexing._add_index  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   intr  r  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.store4  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  store_reduction)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   r1  s     r)   r   ,CaptureIndexing.reduction.<locals>.<genexpr>F  s     ?,>q,>   )r  	reductionr   r|   r   )r7   dtype	src_dtypereduction_typer  num_outputsr1  s         @r)   r  CaptureIndexing.reductionB  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   r  r  r  r  constantr  rd   rj   
index_expr)r7   r   r  s      r)   r  CaptureIndexing.index_exprI  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   r  loweruppers        r)   r  CaptureIndexing.check_boundsP  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.bucketizeV  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  r  rM  r2   rv   rs   ra  rZ  )r7   
mask_proxymasked_bodyother_proxyr   s        r)   rJ  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      $ )NrA  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  rF  r  ra  rZ  r|   r   r~   )r7   dtype_proxyrC  value_proxyrD  r   r1  s         @r)   rA  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   rB  r}   stable
descendingr1  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  r1  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  r=  ra  rZ  r  )r7   index_proxyr  r8  r9  r  r:  s          r)   r6  !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`  )ra  rZ  )r7   r1  s     r)   r`  CaptureIndexing.output  s      8VR@r(   )r  ra  )r  r  r  rn   ra  rP   )r   rR  r  rd   rB   r   )r   rR  rD   rR  )r   r]   r   rR  )r   r]   r   r  r#   rQ  )r}   r   r  z.tuple[str, sympy.Expr, sympy.Expr, sympy.Expr]r  r   r  ztorch.dtyper  rP  r  z Optional[tuple[str, sympy.Expr]]r  zOptional[T]rD   r   )r  r  )rC  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  rJ  rA  r  r  r6  r`  rL   rM   rN   s   @r)   r]  r]    s    D  	
Q-
2;?4C 48&*/
/
 C/
 	/

 $/
 /
 1/
 $/
 
/
b	
A RA"<
&
 A Ar(   r]  )8
__future__r   r   rJ   r   rl  enumr   r   typingr   r   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%   Interpreterr    rP   r[   rd   rn   rv   r\  r]  r'   r(   r)   <module>r     s    "    	  N N   ( , * " 4 C C    ( CL0ehh** 06%* %* d n nb8 8v;~ ;nAn nAr(   