
    ȅi                        S r SSKrSSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
JrJrJrJr  SSKJr  SSKrSSKJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJr  S	SKJrJrJr  \" S5      r \" S5      r!\RD                  RF                  r#\$\\#\%4   \S\4   4   r&\\S\4   \%4   r' " S S\RP                  RR                  5      r*\	 " S S5      5       r+ " S S\5      r,S\RZ                  S\.\+   S\\!\4   4S jr/g)z?Utilities for lowering subgraphs used by higher order operators    N)Callable	Generator)contextmanager)	dataclass)AnyOptionalTypeVarUnion)	ParamSpec)
OrderedSet   )ir)SubgraphLoweringException)GraphLowering)SimpleCSEHandler)opsVWrapperHandlerT_P.c                      ^  \ rS rSr% Sr\\\R                        \	S'   \
\	S'   \\   \	S'   \\\      \	S'   \\   \	S'   \\R                     \	S'   \\   \	S	'     S!S\R$                  R&                  S\
S\\\      S\\   SS
4
U 4S jjjr\S\S\S   4S j5       rS\4S jrS\SS
4S jrSS.S\R                  S\S\4S jjrS\S\4S jrS\S\S\\\4   S\4U 4S jjrS\S\ \   S\\\4   SS
4S jr!S r"U =r#$ )"PointwiseSubgraphLowering   z
Lowers a pointwise subgraph to a single set of buffers with a separate
lowering object. Errors if buffers are created unexpectedly
graph_outputs
root_graph_current_opallowed_mutationsadditional_loweringsbuffersmutated_buffersNgmroot_graph_loweringreturnc                    > [         TU ]  U5        S U l        X l        X0l        X@l        S U l        [        5       U l        / U l	        g N)
super__init__r   r   r   r   r   r   r    r   )selfr!   r"   r   r   	__class__s        [/home/james-whalen/.local/lib/python3.13/site-packages/torch/_inductor/subgraph_lowering.pyr'   "PointwiseSubgraphLowering.__init__,   sF     	!-!2$8!  *|    op)NNNc              #   \   #    U R                   nXl          Sv   X l         g! X l         f = f7f)zQSet which op is being processed in call function to know if we can mutate buffersN)r   )r(   r-   previouss      r*   _op_context%PointwiseSubgraphLowering._op_context>   s,      ##	('xs   ,! ,),c                 ^    U R                   S L=(       a    U R                  U R                   ;   $ r%   )r   r   )r(   s    r*   _approved_mutator+PointwiseSubgraphLowering._approved_mutatorH   s.    ""$. ;  D$:$::	
r,   namec                     U R                  5       (       a  U R                  R                  U5        g [        SU R                   S35      e)Nz,Buffer mutation detected during lowering of z. Buffer mutations are only allowed in approved mutation ops. This is an error in the lowering of the subgraph, please file a bug report.)r3   r    addr   r   r(   r5   s     r*   mark_buffer_mutated-PointwiseSubgraphLowering.mark_buffer_mutatedN   sM    !!##  $$T*+>t?O?O>P Q^ ^ r,   Fset_namebufferr<   c                x    U R                  5       (       a  U R                  R                  XS9nU$ [        S5      e)Nr;   zBuffers cannot be created while lowering a pointwise subgraph. This could be for a good reason (e.g. you're calling an op we can't codegen as a pointwise op), but it could also be a bug. Please file a bug report if you think this should be supportable.)r3   r   register_bufferr   )r(   r=   r<   r5   s       r*   r?   )PointwiseSubgraphLowering.register_bufferX   s@    !!##??2262MDK+p r,   c                 .    [        U R                  U5      $ r%   )getattrr   r8   s     r*   __getattr__%PointwiseSubgraphLowering.__getattr__c   s    t--r,   targetargskwargsc                   > SSK Jn  U R                  U5         U[        R                  L a<  [        US   [        [        [        45      (       a  [        TU ])  XU5      sS S S 5        $ U R                  bD  XR                  ;   a5  [        U[        5      (       d   eU R                  U   " U0 UD6sS S S 5        $ X;  a  [        U S35      eXA   " U0 UD6sS S S 5        $ ! , (       d  f       g = f)Nr   )	loweringsr   z. not supported in subgraph, (missing lowering))loweringrI   r0   operatorgetitem
isinstancelisttupledictr&   call_functionr   
OpOverloadr   )r(   rE   rF   rG   rI   r)   s        r*   rQ   'PointwiseSubgraphLowering.call_functionf   s     	(f%)))ja4PTBU.V.Vw,V6B &%
 ((4666%fj999944V<dMfM &% &/hLM  $d5f5 &%%s   AC )AC :C  
C.c                 :    [        U5      S:X  d   eUS   U l        g )Nr   r   )lenr   )r(   rE   rF   rG   s       r*   output PointwiseSubgraphLowering.output~   s    4yA~~!!Wr,   )r   r   r   r   r   r    r   )NN)$__name__
__module____qualname____firstlineno____doc__r   rN   r   IRNode__annotations__r   
TargetTyper   rR   LoweringDictBufferstrtorchfxGraphModuler'   r   r   r0   boolr3   r9   r?   r   rC   rP   rQ   rO   rV   __static_attributes____classcell__r)   s   @r*   r   r      s   
 DO,,*%%
: 677"<00"))__$ ?C7;HH   + $Jz$:;	
 '|4 
 $ (j (Y7G-H ( (
4 
   FK 	bii 	d 	s 	. . .66 6 S#X	6
 
60%S %c
 %DcN %t % %r,   r   c                   R    \ rS rSr% \R
                  \S'   \R                  \S'   Srg)InputDescriptor   dtypedevice N)	rX   rY   rZ   r[   rc   rm   r^   rn   rg   ro   r,   r*   rk   rk      s    ;;LLr,   rk   c                      ^  \ rS rSrS\R
                  R                  S\SS4U 4S jjrS\S\R
                  R                  4S jr
S	\\   SS4S
 jrSrU =r$ )TracingOpsHandler   tracer
num_inputsr#   Nc           	         > UR                  SSS0 5      n[        TU ]	  U5        Xl        [	        U5       Vs/ s H$  nU R                  R                  SSU 3S0 5      PM&     snU l        g s  snf )Nplaceholderr   ro   input)create_proxyr&   r'   rs   rangeplaceholders)r(   rs   rt   parentir)   s        r*   r'   TracingOpsHandler.__init__   sr    $$]E2rB  :&
& KK$$]eA3KRH&
 
s   +A,idxc                      U R                   U   $ r%   )rz   )r(   r~   s     r*   rv   TracingOpsHandler.placeholder   s      %%r,   rF   c                 j   ^  T R                   R                  SS[        U 4S jU 5       5      40 5        g )NrV   c              3   Z   >#    U  H   nTR                   R                  U5      v   M"     g 7fr%   )rs   
create_arg).0ar(   s     r*   	<genexpr>+TracingOpsHandler.output.<locals>.<genexpr>   s#     &O$Qt{{'='=a'@'@$s   (+)rs   create_noderO   )r(   rF   s   ` r*   rV   TracingOpsHandler.output   s-    h&O$&O!O QSU	
r,   )rz   rs   )rX   rY   rZ   r[   rc   rd   Tracerintr'   Proxyrv   rO   objectrV   rg   rh   ri   s   @r*   rq   rq      s\    
uxx 
C 
D 
&s &uxx~~ &
E&M 
d 
 
r,   rq   subgraphinputsr#   c                   ^ S[         S[         S[        [        R                  [        R                  S 4   4S jn[        U5       VVs/ s HK  u  p4[        R                  R                  UR                  UR                  [        R                  " X#S9/ S9PMM     nnnU R                  n[        U[        R                  S9n[        R                   " U5         UR"                  " U6   S S S 5        [$        R&                  R)                  5       n[$        R&                  R+                  UR,                  S9Ul        [/        [1        U[3        U5      5      5      n	UR4                  c   e[        R6                  " U	5         / n
UR4                   H  n[9        U[        R                  5      (       d   [;        U5      5       eUR=                  5       / :X  d   e[9        UR>                  [        R@                  5      (       d   e[9        UR>                  R>                  [        R                  5      (       d   eS	nUR>                  R>                  RC                  U5      nU
RE                  U5        M     [F        RH                  " U
6   S S S 5        [$        R&                  RK                  0 UR                  5      mS
[L        RN                  S[L        RP                  S[R        4U4S jjnU$ s  snnf ! , (       d  f       GN
= f! , (       d  f       N= f)Nloop_idx	input_idxr#   c                 .    [         R                  " U5      $ r%   )r   rv   )r   r   s     r*   fake_inner_fn/lower_pointwise_subgraph.<locals>.fake_inner_fn   s     y))r,   )r   )rn   rm   inner_fnranges)r"   )
tracer_clsro   rF   rG   c                  B   > T" [         R                  " 5       /U Q70 UD6$ r%   )r   get_ops_handler)rF   rG   
lowered_gms     r*   r   *lower_pointwise_subgraph.<locals>.inner_fn   s!    !++-????r,   )*r   r
   r   Expr	TensorBox	enumerate	Pointwisecreatern   rm   	functoolspartialgraph_moduler   r   graphset_graph_handlerrunrc   rd   r   Graphr)   r   rq   rU   r   set_ops_handlerrM   typeget_sizedata
StorageBoxr   appendr   rV   re   r   rF   rG   r   )r   r   r   r|   descgraph_inputsr!   pw_subgraphrs   	trace_ops
output_irsout_varr~   ir_outr   r   s                  @r*   lower_pointwise_subgraphr      s]   **"%*	rwwd*	+* !( )GA 	;;**&&}B	 	 	
 )   
		B+BAGGLK	
		[	)& 
*
 XX__F88>>V-=-=>>FL !263v;!GHI$$000	
		9	%
"00Ggr||44Cd7mC4##%+++gllBMM::::gll//>>>>C\\&&//4Ff% 1 	

J 
&  %%b&,,7J@ @299 @ @ OU 
*	) 
&	%s    	AK%K+=DK=+
K:=
L)0r\   r   rK   collections.abcr   r   
contextlibr   dataclassesr   typingr   r   r	   r
   typing_extensionsr   rc   torch.utils._ordered_setr    r   excr   r   r   ops_handlerr   virtualizedr   r   r   r   r   _opsrR   rP   rb   r`   r_   rd   Interpreterr   rk   rq   SubgraphrN   r   ro   r,   r*   <module>r      s   E   / % ! 0 0 '  /  *   ) / / CLt_ZZ""
E*c/*HS#X,>>?8CH%s*+
c% 4 4 c%L   

 
(3kk3#'#83b#g3r,   