U
    yhG                     @   s  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dddd	d
dddg
Ze jG dd dZe jG dd dZe jG dd dZe jG dd dZe jG dd dZeeeeeef ZG dd deZe jG dd	 d	ZG dd
 d
eZe jG dd dZe
e eeef eeef e
e eeef eeef eeef eeef e	e ee ee ee ee eee ee f dddZe jG dd dZe jG dd dZdS )    N)autoEnum)
CollectionDictListMappingOptionalSetTupleUnionConstantArgumentCustomObjArgumentExportBackwardSignatureExportGraphSignature	InputKind	InputSpec
OutputKind
OutputSpecSymIntArgumentTensorArgumentc                   @   s   e Zd ZU eed< dS )r   nameN__name__
__module____qualname__str__annotations__ r   r   N/var/www/html/venv/lib/python3.8/site-packages/torch/export/graph_signature.pyr      s   
c                   @   s   e Zd ZU eed< dS )TokenArgumentr   Nr   r   r   r   r   r      s   
r   c                   @   s   e Zd ZU eed< dS )r   r   Nr   r   r   r   r   r      s   
c                   @   s   e Zd ZU eed< eed< dS )r   r   Z	class_fqnNr   r   r   r   r   r   $   s   
c                   @   s,   e Zd ZU eed< eeeeedf ed< dS )r   r   Nvalue)	r   r   r   r   r   r   intfloatboolr   r   r   r   r   *   s   
c                   @   s0   e Zd Ze Ze Ze Ze Ze Ze Z	dS )r   N)
r   r   r   r   
USER_INPUT	PARAMETERBUFFERCONSTANT_TENSOR
CUSTOM_OBJTOKENr   r   r   r   r   9   s   c                   @   sB   e Zd ZU eed< eed< ee ed< dZee	 ed< dd Z
dS )r   kindargtargetN
persistentc                 C   sL   | j tjkr| jd k	stdt| jttt	t
tfsHtdt| j d S )Nz,Failed to specify persistent flag on BUFFER.zgot )r*   r   r&   r-   AssertionError
isinstancer+   r   r   r   r   r   typeselfr   r   r   __post_init__I   s     	zInputSpec.__post_init__)r   r   r   r   r   ArgumentSpecr   r   r-   r#   r3   r   r   r   r   r   B   s
   
c                   @   s6   e Zd Ze Ze Ze Ze Ze Ze Z	e Z
dS )r   N)r   r   r   r   USER_OUTPUTLOSS_OUTPUTBUFFER_MUTATIONGRADIENT_TO_PARAMETERGRADIENT_TO_USER_INPUTUSER_INPUT_MUTATIONr)   r   r   r   r   r   Z   s   c                   @   s2   e Zd ZU eed< eed< ee ed< dd ZdS )r   r*   r+   r,   c                 C   s   t | jttttfstd S N)r/   r+   r   r   r   r   r.   r1   r   r   r   r3   j   s     
zOutputSpec.__post_init__N)	r   r   r   r   r   r4   r   r   r3   r   r   r   r   r   d   s   
)user_inputsinputs_to_parametersinputs_to_buffersuser_outputsbuffer_mutationsuser_input_mutationsgrad_paramsgrad_user_inputsloss_outputinputsoutputsinput_tokensoutput_tokensreturnc                    sj   t td
fddtt td 	fddfdd|	D }fd	dt|
D }||fS )
N)inprI   c                    s   t | trttj| d dS t | ts4ttj| d dS | j}|krRttj| d dS |krnttj| | dS | krttj	|  | ddS t
d| d S )Nr*   r+   r,   T)r*   r+   r,   r-   zUnknown tensor input kind: )r/   r   r   r   r)   r   r$   r   r%   r&   r.   )rJ   r   )r>   r=   r<   r   r   to_input_spec   s*    

z$_sig_to_specs.<locals>.to_input_spec)idxorI   c                    s  t |trttj|d dS t |ts4ttj|d dS |j}| t t t k r| krrttj	| | dS |krttj
|| dS td| nx|krttj|d dS |krttj|| dS |krttj|| dS |krttj|d dS td| d S )NrK   zUnknown tensor mutation kind: zUnknown tensor output kind: )r/   r   r   r   r)   r   r5   r   lenr7   r:   r.   r8   r9   r6   )rM   rN   r   )r@   rB   rC   rD   rH   rA   r?   r   r   to_output_spec   sH    


z%_sig_to_specs.<locals>.to_output_specc                    s   g | ]} |qS r   r   ).0rJ   )rL   r   r   
<listcomp>   s     z!_sig_to_specs.<locals>.<listcomp>c                    s   g | ]\}} ||qS r   r   )rQ   rM   rN   )rP   r   r   rR      s     )r4   r   r!   r   	enumerate)r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   input_specsoutput_specsr   )r@   rB   rC   r>   r=   rD   rH   rL   rP   rA   r<   r?   r   _sig_to_specsp   s
    ",rV   c                   @   s6   e Zd ZU eeef ed< eeef ed< eed< dS )r   gradients_to_parametersgradients_to_user_inputsrD   N)r   r   r   r   r   r   r   r   r   r   r      s   
c                   @   s  e Zd ZU dZee ed< ee ed< ee	e
 dddZee	e
 dddZee	e
 dd	d
Zee	e
 dddZee	e
 dddZee	eeeede
f  dddZee	eeeede
f  dddZeee
e
f dddZeee
e
f dddZeee
e
f dddZeee
e
f dddZeee
e
f dddZeee
e
f dddZeee dd d!Zeeeee
f  dd"d#Z eee
 dd$d%Z!eee
 dd&d'Z"ddd(d)Z#e
e
d*d+d,Z$d-d. Z%dS )/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):
                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)
            ]
        )
    rT   rU   )rI   c                 C   s   dd | j D S )Nc                 S   s*   g | ]"}|j tjkrt|jtr|jqS r   )r*   r   r%   r/   r,   r   rQ   sr   r   r   rR   $  s   z3ExportGraphSignature.parameters.<locals>.<listcomp>rT   r1   r   r   r   
parameters!  s    zExportGraphSignature.parametersc                 C   s   dd | j D S )Nc                 S   s*   g | ]"}|j tjkrt|jtr|jqS r   )r*   r   r&   r/   r,   r   rY   r   r   r   rR   /  s   z0ExportGraphSignature.buffers.<locals>.<listcomp>r[   r1   r   r   r   buffers,  s    zExportGraphSignature.buffersc                 C   s   dd | j D S )Nc                 S   s4   g | ],}|j tjkr|jd krt|jtr|jqS )F)r*   r   r&   r-   r/   r,   r   rY   r   r   r   rR   8  s
   
z?ExportGraphSignature.non_persistent_buffers.<locals>.<listcomp>r[   r1   r   r   r   non_persistent_buffers6  s    z+ExportGraphSignature.non_persistent_buffersc                 C   s   dd | j D S )Nc                 S   s*   g | ]"}|j tjkrt|jtr|jqS r   )r*   r   r'   r/   r,   r   rY   r   r   r   rR   D  s   z@ExportGraphSignature.lifted_tensor_constants.<locals>.<listcomp>r[   r1   r   r   r   lifted_tensor_constantsA  s    z,ExportGraphSignature.lifted_tensor_constantsc                 C   s   dd | j D S )Nc                 S   s*   g | ]"}|j tjkrt|jtr|jqS r   )r*   r   r(   r/   r,   r   rY   r   r   r   rR   N  s   z;ExportGraphSignature.lifted_custom_objs.<locals>.<listcomp>r[   r1   r   r   r   lifted_custom_objsK  s    z'ExportGraphSignature.lifted_custom_objsNc                 C   st   g }| j D ]`}|jtjkrq
t|jtttfr>|	|jj
 q
t|jtrZ|	|jj q
t|j dq
t|S )Nz is not a valid user inputs)rT   r*   r   r$   r/   r+   r   r   r   appendr   r   r    RuntimeErrortuple)r2   r<   rZ   r   r   r   r<   V  s    
z ExportGraphSignature.user_inputsc                 C   sr   g }| j D ]^}|jtjkrq
t|jttfr<||jj	 q
t|jt
rX||jj q
t|j dq
t|S )Nz is not a valid user output)rU   r*   r   r5   r/   r+   r   r   ra   r   r   r    rb   rc   )r2   r?   rZ   r   r   r   r?   f  s    
z!ExportGraphSignature.user_outputsc                 C   s   dd | j D S )Nc                 S   s<   i | ]4}|j tjkrt|jtrt|jtr|jj|jqS r   )	r*   r   r%   r/   r+   r   r,   r   r   rY   r   r   r   
<dictcomp>y  s    z=ExportGraphSignature.inputs_to_parameters.<locals>.<dictcomp>r[   r1   r   r   r   r=   w  s    z)ExportGraphSignature.inputs_to_parametersc                 C   s   dd | j D S )Nc                 S   s<   i | ]4}|j tjkrt|jtrt|jtr|jj|jqS r   )	r*   r   r&   r/   r+   r   r,   r   r   rY   r   r   r   rd     s    z:ExportGraphSignature.inputs_to_buffers.<locals>.<dictcomp>r[   r1   r   r   r   r>     s    z&ExportGraphSignature.inputs_to_buffersc                 C   s   dd | j D S )Nc                 S   s<   i | ]4}|j tjkrt|jtrt|jtr|jj|jqS r   )	r*   r   r7   r/   r+   r   r,   r   r   rY   r   r   r   rd     s    z:ExportGraphSignature.buffers_to_mutate.<locals>.<dictcomp>rU   r1   r   r   r   buffers_to_mutate  s    z&ExportGraphSignature.buffers_to_mutatec                 C   s   dd | j D S )Nc                 S   s<   i | ]4}|j tjkrt|jtrt|jtr|jj|jqS r   )	r*   r   r:   r/   r+   r   r,   r   r   rY   r   r   r   rd     s    z>ExportGraphSignature.user_inputs_to_mutate.<locals>.<dictcomp>re   r1   r   r   r   user_inputs_to_mutate  s    z*ExportGraphSignature.user_inputs_to_mutatec                 C   s   dd | j D S )Nc                 S   s<   i | ]4}|j tjkrt|jtrt|jtr|jj|jqS r   )	r*   r   r'   r/   r+   r   r,   r   r   rY   r   r   r   rd     s    zJExportGraphSignature.inputs_to_lifted_tensor_constants.<locals>.<dictcomp>r[   r1   r   r   r   !inputs_to_lifted_tensor_constants  s    z6ExportGraphSignature.inputs_to_lifted_tensor_constantsc                 C   s   dd | j D S )Nc                 S   s<   i | ]4}|j tjkrt|jtrt|jtr|jj|jqS r   )	r*   r   r(   r/   r+   r   r,   r   r   rY   r   r   r   rd     s    zEExportGraphSignature.inputs_to_lifted_custom_objs.<locals>.<dictcomp>r[   r1   r   r   r   inputs_to_lifted_custom_objs  s    z1ExportGraphSignature.inputs_to_lifted_custom_objsc                 C   s   d }i }i }| j D ]}|jtjkrH|d ks.tt|jts>t|jj}q|jtj	krt|j
tsdtt|jtstt|j
||jj< q|jtjkrt|j
tstt|jtst|j
||jj< q|d krd S t|||dS )N)rD   rW   rX   )rU   r*   r   r6   r.   r/   r+   r   r   r8   r,   r   r9   r   )r2   rD   rW   rX   specr   r   r   backward_signature  s.    

z'ExportGraphSignature.backward_signaturec                 C   s   d S r;   r   r1   r   r   r   assertion_dep_token  s    z(ExportGraphSignature.assertion_dep_tokenc                 C   s>   g }| j D ].}|jtjkr
t|jts*t||jj	 q
|S r;   )
rT   r*   r   r)   r/   r+   r   r.   ra   r   )r2   rG   rZ   r   r   r   rG     s    
z!ExportGraphSignature.input_tokensc                 C   s>   g }| j D ].}|jtjkr
t|jts*t||jj	 q
|S r;   )
rU   r*   r   r)   r/   r+   r   r.   ra   r   )r2   rH   rZ   r   r   r   rH     s    
z"ExportGraphSignature.output_tokensc                 C   sR   | j }|d krd S t|dks"ttt| }t| jt| j |ksNtd S )N   )rl   rO   r.   nextiterkeysr?   rf   )r2   rl   Zassertion_dep_token_indexr   r   r   r3     s    z"ExportGraphSignature.__post_init__)oldnewc                 C   s   t |tstt |tsttttf}| jD ]$}t |j|r,|jj|kr,||j_q,| j	D ]$}t |j|rX|jj|krX||j_qXdS )zR
        Replace all uses of the old name with new name in the signature.
        N)
r/   r   r.   r   r   r   rU   r+   r   rT   )r2   rq   rr   Z	arg_typesrN   ir   r   r   replace_all_uses  s    



z%ExportGraphSignature.replace_all_usesc                    s    fdd}|S )Nc                    s   |j dkr | j| d S )N)outputinput)oprt   r   )rq   rr   userr1   r   r   _	  s    
z0ExportGraphSignature.get_replace_hook.<locals>._r   )r2   ry   r   r1   r   get_replace_hook  s    z%ExportGraphSignature.get_replace_hook)&r   r   r   __doc__r   r   r   r   propertyr   r   r\   r]   r^   r_   r`   r   r!   r"   r#   r<   r?   r   r=   r>   rf   rg   rh   ri   r   r   rk   rl   rG   rH   r3   rt   rz   r   r   r   r   r      sP   
F
	
	
""	
		)dataclassesenumr   r   typingr   r   r   r   r   r	   r
   r   __all__	dataclassr   r   r   r   r   r4   r   r   r   r   r   rV   r   r   r   r   r   r   <module>   sp   (		






^