
    sh                        S r SSK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
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JrJr  \" S5      r\" S5      r\R@                  RB                  r!\"\\!\#4   \S\
4   4   r$\\S\
4   \#4   r% " S S\RL                  RN                  5      r(\ " S S5      5       r) " S S\5      r*S\RV                  S\,\)   S\\\
4   4S jr-g)z?Utilities for lowering subgraphs used by higher order operators    N)	Generator)contextmanager)	dataclass)AnyCallableOptionalTypeVarUnion)	ParamSpec)
OrderedSet   )ir)SubgraphLoweringException)SimpleCSEHandler)opsVWrapperHandlerT_P.c                   x  ^  \ rS rSr% Sr\\\R                        \	S'   \
R                  R                  R                  \	S'   \\   \	S'   \\\      \	S'   \\   \	S'   \\R$                     \	S'   \\   \	S	'     S!S\
R(                  R*                  S\
R                  R                  R                  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        u/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/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_mutatorG   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.)r2   r   addr   r   r'   r4   s     r)   mark_buffer_mutated-PointwiseSubgraphLowering.mark_buffer_mutatedM   sM    !!##  $$T*+>t?O?O>P Q^ ^ r+   F)set_namebufferr:   c                    U R                  5       (       aD  U R                  S[        U R                  5       35      nU R                  R	                  U5        U$ [        S5      e)NbufzBuffers 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.)r2   qualify_namelenr   appendr   )r'   r;   r:   r4   s       r)   register_buffer)PointwiseSubgraphLowering.register_bufferW   s\    !!##$$s3t||+<*=%>?DLL'K+p r+   c                 .    [        U R                  U5      $ r$   )getattrr   r7   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))loweringrK   r/   operatorgetitem
isinstancelisttupledictr%   call_functionr   
OpOverloadr   )r'   rG   rH   rI   rK   r(   s        r)   rS   '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   )r?   r   )r'   rG   rH   rI   s       r)   output PointwiseSubgraphLowering.output   s    4yA~~!!Wr+   )r   r   r   r   r   r   r   )NN)&__name__
__module____qualname____firstlineno____doc__r   rP   r   IRNode__annotations__torch	_inductorgraphGraphLowering
TargetTyper   rT   LoweringDictBufferstrfxGraphModuler&   r   r   r/   boolr2   r8   rA   r   rE   rR   rS   rQ   rW   __static_attributes____classcell__r(   s   @r)   r   r      s   
 DO,,%%333*%%
: 677"<00"))__$ ?C7;HH   #__22@@ $Jz$:;	
 '|4 
 $ (j (Y7G-H ( (
4 
   FK 
bii 
d 
s 
. . .66 6 S#X	6
 
62%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)	rY   rZ   r[   r\   r`   rq   r_   rr   rk   rs   r+   r)   ro   ro      s    ;;LLr+   ro   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   rs   input)create_proxyr%   r&   rw   rangeplaceholders)r'   rw   rx   parentir(   s        r)   r&   TracingOpsHandler.__init__   sr    $$]E2rB  :&
& KK$$]eA3KRH&
 
s   +A,idxc                      U R                   U   $ r$   )r~   )r'   r   s     r)   rz   TracingOpsHandler.placeholder   s      %%r+   rH   c                 j   ^  T R                   R                  SS[        U 4S jU 5       5      40 5        g )NrW   c              3   Z   >#    U  H   nTR                   R                  U5      v   M"     g 7fr$   )rw   
create_arg).0ar'   s     r)   	<genexpr>+TracingOpsHandler.output.<locals>.<genexpr>   s#     &O$Qt{{'='=a'@'@$s   (+)rw   create_noderQ   )r'   rH   s   ` r)   rW   TracingOpsHandler.output   s-    h&O$&O!O QSU	
r+   )r~   rw   )rY   rZ   r[   r\   r`   rh   Tracerintr&   Proxyrz   rQ   objectrW   rk   rl   rm   s   @r)   ru   ru      s\    
uxx 
C 
D 
&s &uxx~~ &
E&M 
d 
 
r+   ru   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   rz   )r   r   s     r)   fake_inner_fn/lower_pointwise_subgraph.<locals>.fake_inner_fn   s     y))r+   )r   )rr   rq   inner_fnranges)r!   )
tracer_clsrs   rH   rI   c                  B   > T" [         R                  " 5       /U Q70 UD6$ r$   )r   get_ops_handler)rH   rI   
lowered_gms     r)   r   *lower_pointwise_subgraph.<locals>.inner_fn   s!    !++-????r+   )*r   r
   r   Expr	TensorBox	enumerate	Pointwisecreaterr   rq   	functoolspartialgraph_moduler   r   rb   set_graph_handlerrunr`   rh   r   Graphr(   r   ru   r?   r   set_ops_handlerrO   typeget_sizedata
StorageBoxr   r@   r   rW   ri   r   rH   rI   r   )r   r   r   r   descgraph_inputsr    pw_subgraphrw   	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).r]   r   rM   collections.abcr   
contextlibr   dataclassesr   typingr   r   r   r	   r
   typing_extensionsr   r`   torch.utils._ordered_setr    r   excr   ops_handlerr   virtualizedr   r   r   r   r   _opsrT   rR   rg   re   rd   rh   Interpreterr   ro   ru   SubgraphrP   r   rs   r+   r)   <module>r      s    E   % % ! : : '  /  * ) / / CLt_ZZ""
E*c/*HS#X,>>?8CH%s*+
e% 4 4 e%P   

 
(3kk3#'#83b#g3r+   