
    ǄgS                        d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
mZmZ d dlmZ er
d dlZd dlmZ g dZe j&                   G d d             Ze j&                   G d	 d
             Ze j&                   G d d             Ze j&                   G d d             Ze j&                   G d d             Zeeeeeef   Z G d de      Ze j&                   G d d             Z G d de      Ze j&                   G d d             Ze j&                   G d d             Ze j&                   G d d             Zd Z defdZ!d d!d"d#d$e
e"   ddfd%Z#y)&    N)autoEnum)
CollectionDictListMappingOptionalSetTYPE_CHECKINGUnionFakeScriptObject)GraphSignature)
ConstantArgumentCustomObjArgumentExportBackwardSignatureExportGraphSignature	InputKind	InputSpec
OutputKind
OutputSpecSymIntArgumentTensorArgumentc                       e Zd ZU eed<   y)r   nameN__name__
__module____qualname__str__annotations__     d/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/export/graph_signature.pyr   r          
Ir#   r   c                       e Zd ZU eed<   y)TokenArgumentr   Nr   r"   r#   r$   r'   r'       r%   r#   r'   c                       e Zd ZU eed<   y)r   r   Nr   r"   r#   r$   r   r   %   r%   r#   r   c                   6    e Zd ZU eed<   eed<   dZee   ed<   y)r   r   	class_fqnNfake_val)r   r   r   r    r!   r+   r	   r   r"   r#   r$   r   r   *   s    
IN+/Hh'(/r#   r   c                   2    e Zd ZU eed<   eeeeedf   ed<   y)r   r   Nvalue)	r   r   r   r    r!   r   intfloatboolr"   r#   r$   r   r   1   s    
IeT3,--r#   r   c                   `    e Zd Z e       Z e       Z e       Z e       Z e       Z e       Z	y)r   N)
r   r   r   r   
USER_INPUT	PARAMETERBUFFERCONSTANT_TENSOR
CUSTOM_OBJTOKENr"   r#   r$   r   r   @   s,    JIVFfOJFEr#   r   c                   L    e Zd ZU eed<   eed<   ee   ed<   dZee	   ed<   d Z
y)r   kindargtargetN
persistentc                     | j                   t        j                  k(  r| j                  J d       t	        | j
                  t        t        t        t        t        f      sJ dt        | j
                                y )Nz,Failed to specify persistent flag on BUFFER.zgot )r9   r   r4   r<   
isinstancer:   r   r   r   r   r'   typeselfs    r$   __post_init__zInputSpec.__post_init__P   su    99	(((+>=>+HH !	
 		# $txx.!"		# 	
r#   )r   r   r   r   r!   ArgumentSpecr	   r    r<   r0   rB   r"   r#   r$   r   r   I   s*    
O	SM!%J%#r#   r   c                   n    e Zd Z e       Z e       Z e       Z e       Z e       Z e       Z	 e       Z
y)r   N)r   r   r   r   USER_OUTPUTLOSS_OUTPUTBUFFER_MUTATIONGRADIENT_TO_PARAMETERGRADIENT_TO_USER_INPUTUSER_INPUT_MUTATIONr7   r"   r#   r$   r   r   a   s6    &K&KfO F!V&FEr#   r   c                   8    e Zd ZU eed<   eed<   ee   ed<   d Zy)r   r9   r:   r;   c                     t        | j                  t        t        t        t
        t        f      sJ | j                         y N)r>   r:   r   r   r   r'   r   r@   s    r$   rB   zOutputSpec.__post_init__q   s=    HH !	
 		 88		 	
r#   N)	r   r   r   r   r!   rC   r	   r    rB   r"   r#   r$   r   r   k   s    
	SM
r#   r   c                   @    e Zd ZU eeef   ed<   eeef   ed<   eed<   y)r   gradients_to_parametersgradients_to_user_inputsloss_outputN)r   r   r   r   r    r!   r"   r#   r$   r   r   ~   s$    !#s(^+"38n,r#   r   c            	       n   e Zd ZU dZee   ed<   ee   ed<   ede	e
   fd       Zede	e
   fd       Zede	e
   fd       Zede	e
   fd       Zede	e
   fd	       Zede	eeeed
e
f      fd       Zede	eeeed
e
f      fd       Zedee
e
f   fd       Zedee
e
f   fd       Zedee
e
f   fd       Zedee
e
f   fd       Zedee
e
f   fd       Zedee
e
f   fd       Zedee   fd       Zedeeee
f      fd       Z ede	e
   fd       Z!ede	e
   fd       Z"ddZ#de
de
fdZ$d Z%y
)r   a  
    :class:`ExportGraphSignature` models the input/output signature of Export Graph,
    which is a fx.Graph with stronger invariants gurantees.

    Export Graph is functional and does not access "states" like parameters
    or buffers within the graph via ``getattr`` nodes. Instead, :func:`export`
    gurantees that parameters, buffers, and constant tensors are lifted out of
    the graph as inputs.  Similarly, any mutations to buffers are not included
    in the graph either, instead the updated values of mutated buffers are
    modeled as additional outputs of Export Graph.

    The ordering of all inputs and outputs are::

        Inputs = [*parameters_buffers_constant_tensors, *flattened_user_inputs]
        Outputs = [*mutated_inputs, *flattened_user_outputs]

    e.g. If following module is exported::

        class CustomModule(nn.Module):
            def __init__(self) -> None:
                super(CustomModule, self).__init__()

                # Define a parameter
                self.my_parameter = nn.Parameter(torch.tensor(2.0))

                # Define two buffers
                self.register_buffer('my_buffer1', torch.tensor(3.0))
                self.register_buffer('my_buffer2', torch.tensor(4.0))

            def forward(self, x1, x2):
                # Use the parameter, buffers, and both inputs in the forward method
                output = (x1 + self.my_parameter) * self.my_buffer1 + x2 * self.my_buffer2

                # Mutate one of the buffers (e.g., increment it by 1)
                self.my_buffer2.add_(1.0) # In-place addition

                return output

    Resulting Graph would be::

        graph():
            %arg0_1 := placeholder[target=arg0_1]
            %arg1_1 := placeholder[target=arg1_1]
            %arg2_1 := placeholder[target=arg2_1]
            %arg3_1 := placeholder[target=arg3_1]
            %arg4_1 := placeholder[target=arg4_1]
            %add_tensor := call_function[target=torch.ops.aten.add.Tensor](args = (%arg3_1, %arg0_1), kwargs = {})
            %mul_tensor := call_function[target=torch.ops.aten.mul.Tensor](args = (%add_tensor, %arg1_1), kwargs = {})
            %mul_tensor_1 := call_function[target=torch.ops.aten.mul.Tensor](args = (%arg4_1, %arg2_1), kwargs = {})
            %add_tensor_1 := call_function[target=torch.ops.aten.add.Tensor](args = (%mul_tensor, %mul_tensor_1), kwargs = {})
            %add_tensor_2 := call_function[target=torch.ops.aten.add.Tensor](args = (%arg2_1, 1.0), kwargs = {})
            return (add_tensor_2, add_tensor_1)

    Resulting ExportGraphSignature would be::

        ExportGraphSignature(
            input_specs=[
                InputSpec(kind=<InputKind.PARAMETER: 2>, arg=TensorArgument(name='arg0_1'), target='my_parameter'),
                InputSpec(kind=<InputKind.BUFFER: 3>, arg=TensorArgument(name='arg1_1'), target='my_buffer1'),
                InputSpec(kind=<InputKind.BUFFER: 3>, arg=TensorArgument(name='arg2_1'), target='my_buffer2'),
                InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='arg3_1'), target=None),
                InputSpec(kind=<InputKind.USER_INPUT: 1>, arg=TensorArgument(name='arg4_1'), target=None)
            ],
            output_specs=[
                OutputSpec(kind=<OutputKind.BUFFER_MUTATION: 3>, arg=TensorArgument(name='add_2'), target='my_buffer2'),
                OutputSpec(kind=<OutputKind.USER_OUTPUT: 1>, arg=TensorArgument(name='add_1'), target=None)
            ]
        )
    input_specsoutput_specsreturnc                 :    t        d | j                  D              S )Nc              3      K   | ]G  }|j                   t        j                  k(  r(t        |j                  t
              r|j                   I y wrM   )r9   r   r3   r>   r;   r    .0ss     r$   	<genexpr>z2ExportGraphSignature.parameters.<locals>.<genexpr>   s<      
vv,,,!((C( HH
   AAtuplerS   r@   s    r$   
parameterszExportGraphSignature.parameters   "     
%%
 
 	
r#   c                 :    t        d | j                  D              S )Nc              3      K   | ]G  }|j                   t        j                  k(  r(t        |j                  t
              r|j                   I y wrM   )r9   r   r4   r>   r;   r    rX   s     r$   r[   z/ExportGraphSignature.buffers.<locals>.<genexpr>   s<      
vv)))!((C( HH
r\   r]   r@   s    r$   bufferszExportGraphSignature.buffers   r`   r#   c                 :    t        d | j                  D              S )Nc              3      K   | ]U  }|j                   t        j                  k(  r6|j                  d u r(t	        |j
                  t              r|j
                   W yw)FN)r9   r   r4   r<   r>   r;   r    rX   s     r$   r[   z>ExportGraphSignature.non_persistent_buffers.<locals>.<genexpr>   sH      
vv)))||u$!((C(	 HH
s   AAr]   r@   s    r$   non_persistent_buffersz+ExportGraphSignature.non_persistent_buffers   s"     
%%
 
 	
r#   c                 :    t        d | j                  D              S )Nc              3      K   | ]G  }|j                   t        j                  k(  r(t        |j                  t
              r|j                   I y wrM   )r9   r   r5   r>   r;   r    rX   s     r$   r[   z?ExportGraphSignature.lifted_tensor_constants.<locals>.<genexpr>   s<      
vv222!((C( HH
r\   r]   r@   s    r$   lifted_tensor_constantsz,ExportGraphSignature.lifted_tensor_constants   r`   r#   c                 :    t        d | j                  D              S )Nc              3      K   | ]G  }|j                   t        j                  k(  r(t        |j                  t
              r|j                   I y wrM   )r9   r   r6   r>   r;   r    rX   s     r$   r[   z:ExportGraphSignature.lifted_custom_objs.<locals>.<genexpr>   s<      
vv---!((C( HH
r\   r]   r@   s    r$   lifted_custom_objsz'ExportGraphSignature.lifted_custom_objs   r`   r#   Nc                    g }| j                   D ]  }|j                  t        j                  k7  r!t	        |j
                  t        t        t        f      r&|j                  |j
                  j                         lt	        |j
                  t              r&|j                  |j
                  j                         t        |j
                   d       t        |      S )Nz is not a valid user inputs)rS   r9   r   r2   r>   r:   r   r   r   appendr   r   r-   RuntimeErrorr^   )rA   user_inputsrZ   s      r$   rp   z ExportGraphSignature.user_inputs  s    @B!! 		JAvv---!%%..BS!TU""155::.AEE#34""155;;/"aeeW,G#HII		J [!!r#   c                 4   g }| j                   D ]  }|j                  t        j                  k7  r!t	        |j
                  t        t        f      r&|j                  |j
                  j                         gt	        |j
                  t              r&|j                  |j
                  j                         t	        |j
                  t              r&|j                  |j
                  j                         t        |j
                   d       t        |      S )Nz is not a valid user output)rT   r9   r   rE   r>   r:   r   r   rn   r   r   r-   r   ro   r^   )rA   user_outputsrZ   s      r$   rr   z!ExportGraphSignature.user_outputs  s    AC"" 	JAvv///!%%..!AB##AEEJJ/AEE#34##AEEKK0AEE#45##AEEJJ/"aeeW,G#HII	J \""r#   c                 :    t        d | j                  D              S )Nc              3     K   | ]w  }|j                   t        j                  k(  rXt        |j                  t
              r>t        |j                  t              r$|j                  j                  |j                  f y y wrM   )	r9   r   r3   r>   r:   r   r;   r    r   rX   s     r$   r[   z<ExportGraphSignature.inputs_to_parameters.<locals>.<genexpr>'  sW      
vv,,,155.1188S)	 UUZZ"
   A=A?_immutable_dictrS   r@   s    r$   inputs_to_parametersz)ExportGraphSignature.inputs_to_parameters%  "     
%%
 
 	
r#   c                 :    t        d | j                  D              S )Nc              3     K   | ]w  }|j                   t        j                  k(  rXt        |j                  t
              r>t        |j                  t              r$|j                  j                  |j                  f y y wrM   )	r9   r   r4   r>   r:   r   r;   r    r   rX   s     r$   r[   z9ExportGraphSignature.inputs_to_buffers.<locals>.<genexpr>3  sW      
vv)))155.1188S)	 UUZZ"
ru   rv   r@   s    r$   inputs_to_buffersz&ExportGraphSignature.inputs_to_buffers1  ry   r#   c                 :    t        d | j                  D              S )Nc              3     K   | ]w  }|j                   t        j                  k(  rXt        |j                  t
              r>t        |j                  t              r$|j                  j                  |j                  f y y wrM   )	r9   r   rG   r>   r:   r   r;   r    r   rX   s     r$   r[   z9ExportGraphSignature.buffers_to_mutate.<locals>.<genexpr>?  sW      
vv333155.1188S)	 UUZZ"
ru   rw   rT   r@   s    r$   buffers_to_mutatez&ExportGraphSignature.buffers_to_mutate=  "     
&&
 
 	
r#   c                 :    t        d | j                  D              S )Nc              3     K   | ]w  }|j                   t        j                  k(  rXt        |j                  t
              r>t        |j                  t              r$|j                  j                  |j                  f y y wrM   )	r9   r   rJ   r>   r:   r   r;   r    r   rX   s     r$   r[   z=ExportGraphSignature.user_inputs_to_mutate.<locals>.<genexpr>I  sW      
vv777155.1188S)	 UUZZ"
ru   r   r@   s    r$   user_inputs_to_mutatez*ExportGraphSignature.user_inputs_to_mutateG  r   r#   c                 :    t        d | j                  D              S )Nc              3     K   | ]w  }|j                   t        j                  k(  rXt        |j                  t
              r>t        |j                  t              r$|j                  j                  |j                  f y y wrM   )	r9   r   r5   r>   r:   r   r;   r    r   rX   s     r$   r[   zIExportGraphSignature.inputs_to_lifted_tensor_constants.<locals>.<genexpr>T  sW      
vv222155.1188S)	 UUZZ"
ru   rv   r@   s    r$   !inputs_to_lifted_tensor_constantsz6ExportGraphSignature.inputs_to_lifted_tensor_constantsR  ry   r#   c                 :    t        d | j                  D              S )Nc              3     K   | ]w  }|j                   t        j                  k(  rXt        |j                  t
              r>t        |j                  t              r$|j                  j                  |j                  f y y wrM   )	r9   r   r6   r>   r:   r   r;   r    r   rX   s     r$   r[   zDExportGraphSignature.inputs_to_lifted_custom_objs.<locals>.<genexpr>^  sX      
vv---155"34188S)	 UUZZ"
ru   rv   r@   s    r$   inputs_to_lifted_custom_objsz1ExportGraphSignature.inputs_to_lifted_custom_objs\  ry   r#   c                    d }i }i }| j                   D ]I  }|j                  t        j                  k(  r7|J t	        |j
                  t              sJ |j
                  j                  }X|j                  t        j                  k(  r\t	        |j                  t              sJ t	        |j
                  t              sJ |j                  ||j
                  j                  <   |j                  t        j                  k(  st	        |j                  t              sJ t	        |j
                  t              sJ |j                  ||j
                  j                  <   L |y t        |||      S )N)rQ   rO   rP   )rT   r9   r   rF   r>   r:   r   r   rH   r;   r    rI   r   )rA   rQ   rO   rP   specs        r$   backward_signaturez'ExportGraphSignature.backward_signaturef  s,   2435 %% 	FDyyJ222"***!$((N;;;"hhmmj>>>!$++s333!$((N;;;9='6j???!$++s333!$((N;;;:>++(7	F &#$;%=
 	
r#   c                      y rM   r"   r@   s    r$   assertion_dep_tokenz(ExportGraphSignature.assertion_dep_token  s    r#   c                     g }| j                   D ]a  }|j                  t        j                  k(  s!t	        |j
                  t              sJ |j                  |j
                  j                         c t        |      S rM   )
rS   r9   r   r7   r>   r:   r'   rn   r   r^   )rA   input_tokensrZ   s      r$   r   z!ExportGraphSignature.input_tokens  sc    !! 	0Avv(!!%%777##AEEJJ/	0 \""r#   c                     g }| j                   D ]a  }|j                  t        j                  k(  s!t	        |j
                  t              sJ |j                  |j
                  j                         c t        |      S rM   )
rT   r9   r   r7   r>   r:   r'   rn   r   r^   )rA   output_tokensrZ   s      r$   r   z"ExportGraphSignature.output_tokens  se    "" 	1Avv)))!!%%777$$QUUZZ0	1 ]##r#   c                     | j                   }|y t        |      dk(  sJ t        t        |j	                                     }t        | j
                        t        | j                        z   |k(  sJ y )N   )r   lennextiterkeysrr   r   )rA   r   assertion_dep_token_indexs      r$   rB   z"ExportGraphSignature.__post_init__  su    "66&&'1,,,$(.A.F.F.H)I$J!!!"S)?)?%@@()	
)r#   oldnewc                    t        |t              sJ t        |t              sJ t        t        t        t
        f}| j                  D ]D  }t        |j                  |      s|j                  j                  |k(  s4||j                  _        F | j                  D ]D  }t        |j                  |      s|j                  j                  |k(  s4||j                  _        F y)zR
        Replace all uses of the old name with new name in the signature.
        N)
r>   r    r   r   r   r'   rT   r:   r   rS   )rA   r   r   	arg_typesois         r$   replace_all_usesz%ExportGraphSignature.replace_all_uses  s     #s####s####^5FV	"" 	%A!%%+55::$!$AEEJ	% !! 	%A!%%+55::$!$AEEJ	%r#   c                       fd}|S )Nc                 \    |j                   dv rj                  | j                  |       y y )N)outputinput)opr   r   )r   r   userrA   s      r$   _z0ExportGraphSignature.get_replace_hook.<locals>._  s)    ww--%%chh4 .r#   r"   )rA   r   s   ` r$   get_replace_hookz%ExportGraphSignature.get_replace_hook  s    	5 r#   )rU   N)&r   r   r   __doc__r   r   r!   r   propertyr   r    r_   rc   rf   ri   rl   r   r.   r/   r0   rp   rr   r   rx   r|   r   r   r   r   r	   r   r   r   r   r   rB   r   r   r"   r#   r$   r   r      s   DL i z"" 
JsO 
 
 
C 
 
 

3 
 
 
C 
 
 
JsO 
 
 "Zc5$c.I(JK " " #jsE4s/J)KL # #$ 
gc3h&7 
 
 
738#4 
 
 
738#4 
 
 
wsCx'8 
 
 
7383D 
 
 
gc3h.? 
 
 
H-D$E 
 
< Xgc3h.?%@   #jo # # $z# $ $	
%C %c % r#   r   c                 0    ddl m}  |t        |             S )z
    Creates a mapping where items cannot be added, deleted, or updated.
    NOTE: The immutability is shallow (like tuple is an immutable collection).
    r   )MappingProxyType)typesr   dict)itemsr   s     r$   rw   rw     s    
 'DK((r#   rU   c           
      B   ddl m}m} ddlm} ddlm} t        | t        t        t        t        d       t        f      rt        d|       S d| j                  v s
J |  d       | j                  d   }| j                  |v rt!        | j                  	      S t        ||      rt#        | j                  	      S t        ||      rt%        | j                  	      S t        ||      r3t'        | j                  |j)                         j+                         
      S t        ||      r"t'        | j                  |j,                  |      S t        |t        t        t        t        t        d       f      rt        | j                  |      S t/        dt        |       d      )Nr   )ScriptObjectSymIntr   )
FakeTensor )r   r-   valz8 is not a constant or a node with a 'val' metadata field)r   )r   r*   )r   r*   r+   z*Encountered an unsupported object of type z0 while writing the metadata for exported program)torchr   r   "torch._library.fake_class_registryr   torch._subclasses.fake_tensorr   r>   r.   r0   r/   r?   r    r   metar   r'   r   r   r   _typequalified_namescript_class_nameAssertionError)nodetoken_namesr   r   r   r   r   s          r$   _make_argument_specr     sV   *C8$dE4:s;<Rt44 	I
GHI
))E
CyyK$)),,	C	$499--	C	 499--	C	& dii399;;U;U;WXX	C)	* c&;&;c
 	
 
C#tS%d<	=TYYc::8c D> ?
 	
r#   graph_signaturer   gmztorch.fx.GraphModulerf   c           	         ddl m} | j                  d u}t        | j                        | j
                  | j                  t        | j                        | j                  | j                  |r| j                  j                  ni |r| j                  j                  ni |r| j                  j                  nd | j                  }| j                  |j                  j                   D cg c]  }|j"                  dk(  rt%        ||       }}|j'                  t)        t+        t-        |j                  j                                     j.                        D cg c]  }t%        |       }}dt0        dt2        ffd}	dt4        dt0        dt6        ffd	}
|D cg c]
  } |	|       }}t9        |      D cg c]  \  }} |
||       }}}t;        ||
      S c c}w c c}w c c}w c c}}w )Nr   )_pytreeplaceholderinprU   c                    t        | t              rt        t        j                  | d       S t        | t
              st        t        j                  | d       S | j                  }|v rt        t        j                  | d       S |v rt        t        j                  | |         S |v r%t        t        j                  | |   |   v      S t        d|       )Nr9   r:   r;   )r9   r:   r;   r<   zUnknown tensor input kind: )r>   r'   r   r   r7   r   r2   r   r3   r4   r   )r   r   r|   rx   rf   rp   s     r$   to_input_specz9_convert_to_export_graph_signature.<locals>.to_input_spec
  s    c=))//s4HH#~.)"6"6CMMxx;)"6"6CMM))((+D1 
 &&%%(.-d3;QQ	  !#>tf!EFFr#   idxr   c                    t        |t              rt        t        j                  |d       S t        |t
              st        t        j                  |d       S |j                  }| t              t              z   t              z   k  rT|v rt        t        j                  ||         S |v rt        t        j                  ||         S t        d|       |	v rt        t        j                  |d       S |v rt        t        j                  ||         S |v rt        t        j                  ||         S |k(  rt        t        j                  |d       S t        d|       )Nr   zUnknown tensor mutation kind: zUnknown tensor output kind: )r>   r'   r   r   r7   r   rE   r   r   rG   rJ   r   rH   rI   rF   )
r   r   r   buffer_mutationsgrad_paramsgrad_user_inputsrQ   r   user_input_mutationsrr   s
      r$   to_output_specz:_convert_to_export_graph_signature.<locals>.to_output_spec#  s~   a':#3#34HH!^,:#9#9qNNvv%&-A)BBSEWWW''!#33+D1 
 --!#77/5  %'EdV%LMM|#!z'='=1TRR$!#99&t, 
 ))!#::+D1 
 $!z'='=1TRR %'CD6%JKKr#   )rS   rT   )torch.utilsr   r   setrp   rx   r|   rr   r   r   gradients_to_parameterrP   rQ   r   r   graphnodesr   r   tree_leavesr   r   reversedargsrC   r   r.   r   	enumerater   )r   r   rf   pytreeis_jointr   r   inputsoutputsr   r   r   rS   r   r   rT   r   r   r   r|   rx   rQ   r   r   rp   rr   s     `             @@@@@@@@@@r$   "_convert_to_export_graph_signaturer     s   
 .11=H o112K*??'99334L&88*@@OW/44KK]_KV^99RRdfDL/44@@RVK"//L#11M HHNN77m# 	D,/F  &&tD"((..1I,J'K'P'PQ 	D-0G 
G< GI G G2*LC *LL *LZ *L *LX 288#=%8K89B79KLvsAN3*LLLKlSSc
T 9Ls   8"G6(G;4H H)$dataclassesenumr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   &torch._functorch._aot_autograd.schemasr   __all__	dataclassr   r'   r   r   r   rC   r   r   r   r   r   r   rw   r   r    r   r"   r#   r$   <module>r      s     W W W ? E          0 0 0 . . .
 	  # # #.    $    u u up	)
l 
DgT%gTgT  HgT 	gTr#   