o
    #iG                     @   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 g 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 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de
e deeef deeef de
e deeef deeef deeef deeef de	e d ee d!ee d"ee d#ee d$eee ee f f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                   @      e Zd ZU eed< dS )r   nameN__name__
__module____qualname__str__annotations__ r   r   Z/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/export/graph_signature.pyr         
 r   c                   @   r   )TokenArgumentr   Nr   r   r   r   r   r!      r    r!   c                   @   r   )r   r   Nr   r   r   r   r   r      r    r   c                   @   s   e Zd ZU eed< eed< dS )r   r   	class_fqnNr   r   r   r   r   r   $   s   
 r   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   
 r   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    
r   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 usJ dt| jtttt	t
fs$J dt| j d S )Nz,Failed to specify persistent flag on BUFFER.zgot )r-   r   r)   r0   
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   r0   r&   r5   r   r   r   r   r   B   s   
 r   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    
r   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J d S N)r1   r.   r   r   r   r!   r3   r   r   r   r5   j   s   zOutputSpec.__post_init__N)	r   r   r   r   r   r6   r   r   r5   r   r   r   r   r   d   s
   
 r   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                    sp   dt dtf
fdddtdt dtf 	fddfd	d
|	D }fdd
t|
D }||fS )NinprK   c                    s   t | trttj| d dS t | tsttj| d dS | j}|v r)ttj| d dS |v r7ttj| | dS | v rFttj	|  | ddS t
d| )Nr-   r.   r/   T)r-   r.   r/   r0   zUnknown tensor input kind: )r1   r!   r   r   r,   r   r'   r   r(   r)   AssertionError)rL   r   )r@   r?   r>   r   r   to_input_spec   s*   

z$_sig_to_specs.<locals>.to_input_specidxoc                    s  t |trttj|d dS t |tsttj|d dS |j}| t t t k rN| v r9ttj	| | dS |v rGttj
|| dS td| |v rZttj|d dS |v rhttj|| dS |v rvttj|| dS |krttj|d dS td| )NrM   zUnknown tensor mutation kind: zUnknown tensor output kind: )r1   r!   r   r   r,   r   r7   r   lenr9   r<   rN   r:   r;   r8   )rP   rQ   r   )rB   rD   rE   rF   rJ   rC   rA   r   r   to_output_spec   sH   

z%_sig_to_specs.<locals>.to_output_specc                    s   g | ]} |qS r   r   ).0rL   )rO   r   r   
<listcomp>   s    z!_sig_to_specs.<locals>.<listcomp>c                    s   g | ]	\}} ||qS r   r   )rT   rP   rQ   )rS   r   r   rU      s    )r6   r   r$   r   	enumerate)r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   input_specsoutput_specsr   )rB   rD   rE   r@   r?   rF   rJ   rO   rS   rC   r>   rA   r   _sig_to_specsp   s
   &,rY   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_inputsrF   N)r   r   r   r   r   r   r   r   r   r   r      s   
 r   c                	   @   s   e Zd ZU dZee ed< ee ed< ede	e
 fddZede	e
 fddZede	e
 fd	d
Zede	e
 fddZede	e
 fddZede	eeeede
f  fddZede	eeeede
f  fddZedee
e
f fddZedee
e
f fddZedee
e
f fddZedee
e
f fddZedee
e
f fddZedee
e
f fddZedee fd d!Zedeeee
f  fd"d#Z edee
 fd$d%Z!edee
 fd&d'Z"d0d(d)Z#d*e
d+e
fd,d-Z$d.d/ Z%dS )1r   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)
            ]
        )
    rW   rX   rK   c                 C      dd | j D S )Nc                 S   *   g | ]}|j tjkrt|jtr|jqS r   )r-   r   r(   r1   r/   r   rT   sr   r   r   rU   $      
z3ExportGraphSignature.parameters.<locals>.<listcomp>rW   r3   r   r   r   
parameters!     zExportGraphSignature.parametersc                 C   r\   )Nc                 S   r]   r   )r-   r   r)   r1   r/   r   r^   r   r   r   rU   /  r`   z0ExportGraphSignature.buffers.<locals>.<listcomp>ra   r3   r   r   r   buffers,  rc   zExportGraphSignature.buffersc                 C   r\   )Nc                 S   s4   g | ]}|j tjkr|jd u rt|jtr|jqS )F)r-   r   r)   r0   r1   r/   r   r^   r   r   r   rU   8  s    

z?ExportGraphSignature.non_persistent_buffers.<locals>.<listcomp>ra   r3   r   r   r   non_persistent_buffers6     z+ExportGraphSignature.non_persistent_buffersc                 C   r\   )Nc                 S   r]   r   )r-   r   r*   r1   r/   r   r^   r   r   r   rU   D  r`   z@ExportGraphSignature.lifted_tensor_constants.<locals>.<listcomp>ra   r3   r   r   r   lifted_tensor_constantsA  rc   z,ExportGraphSignature.lifted_tensor_constantsc                 C   r\   )Nc                 S   r]   r   )r-   r   r+   r1   r/   r   r^   r   r   r   rU   N  r`   z;ExportGraphSignature.lifted_custom_objs.<locals>.<listcomp>ra   r3   r   r   r   lifted_custom_objsK  rc   z'ExportGraphSignature.lifted_custom_objsNc                 C   sr   g }| j D ]/}|jtjkrqt|jtttfr|	|jj
 qt|jtr-|	|jj qt|j dt|S )Nz is not a valid user inputs)rW   r-   r   r'   r1   r.   r   r   r   appendr   r   r#   RuntimeErrortuple)r4   r>   r_   r   r   r   r>   V  s   
z ExportGraphSignature.user_inputsc                 C   sp   g }| j D ].}|jtjkrqt|jttfr||jj	 qt|jt
r,||jj qt|j dt|S )Nz is not a valid user output)rX   r-   r   r7   r1   r.   r   r   ri   r   r   r#   rj   rk   )r4   rA   r_   r   r   r   rA   f  s   
z!ExportGraphSignature.user_outputsc                 C   r\   )Nc                 S   <   i | ]}|j tjkrt|jtrt|jtr|jj|jqS r   )	r-   r   r(   r1   r.   r   r/   r   r   r^   r   r   r   
<dictcomp>y      


z=ExportGraphSignature.inputs_to_parameters.<locals>.<dictcomp>ra   r3   r   r   r   r?   w  rf   z)ExportGraphSignature.inputs_to_parametersc                 C   r\   )Nc                 S   rl   r   )	r-   r   r)   r1   r.   r   r/   r   r   r^   r   r   r   rm     rn   z:ExportGraphSignature.inputs_to_buffers.<locals>.<dictcomp>ra   r3   r   r   r   r@     rf   z&ExportGraphSignature.inputs_to_buffersc                 C   r\   )Nc                 S   rl   r   )	r-   r   r9   r1   r.   r   r/   r   r   r^   r   r   r   rm     rn   z:ExportGraphSignature.buffers_to_mutate.<locals>.<dictcomp>rX   r3   r   r   r   buffers_to_mutate  rf   z&ExportGraphSignature.buffers_to_mutatec                 C   r\   )Nc                 S   rl   r   )	r-   r   r<   r1   r.   r   r/   r   r   r^   r   r   r   rm     rn   z>ExportGraphSignature.user_inputs_to_mutate.<locals>.<dictcomp>ro   r3   r   r   r   user_inputs_to_mutate  rf   z*ExportGraphSignature.user_inputs_to_mutatec                 C   r\   )Nc                 S   rl   r   )	r-   r   r*   r1   r.   r   r/   r   r   r^   r   r   r   rm     rn   zJExportGraphSignature.inputs_to_lifted_tensor_constants.<locals>.<dictcomp>ra   r3   r   r   r   !inputs_to_lifted_tensor_constants  rf   z6ExportGraphSignature.inputs_to_lifted_tensor_constantsc                 C   r\   )Nc                 S   rl   r   )	r-   r   r+   r1   r.   r   r/   r   r   r^   r   r   r   rm     rn   zEExportGraphSignature.inputs_to_lifted_custom_objs.<locals>.<dictcomp>ra   r3   r   r   r   inputs_to_lifted_custom_objs  rf   z1ExportGraphSignature.inputs_to_lifted_custom_objsc                 C   s   d }i }i }| j D ]V}|jtjkr$|d u sJ t|jtsJ |jj}q	|jtjkrBt|j	t
s2J t|jts:J |j	||jj< q	|jtjkr_t|j	t
sPJ t|jtsXJ |j	||jj< q	|d u rfd S t|||dS )N)rF   rZ   r[   )rX   r-   r   r8   r1   r.   r   r   r:   r/   r   r;   r   )r4   rF   rZ   r[   specr   r   r   backward_signature  s0   

z'ExportGraphSignature.backward_signaturec                 C   s   d S r=   r   r3   r   r   r   assertion_dep_token  s   z(ExportGraphSignature.assertion_dep_tokenc                 C   >   g }| j D ]}|jtjkrt|jtsJ ||jj q|S r=   )	rW   r-   r   r,   r1   r.   r!   ri   r   )r4   rI   r_   r   r   r   rI        
z!ExportGraphSignature.input_tokensc                 C   rw   r=   )	rX   r-   r   r,   r1   r.   r!   ri   r   )r4   rJ   r_   r   r   r   rJ     rx   z"ExportGraphSignature.output_tokensc                 C   sR   | j }|d u r	d S t|dksJ tt| }t| jt| j |ks'J d S )N   )rv   rR   nextiterkeysrA   rp   )r4   rv   assertion_dep_token_indexr   r   r   r5     s   z"ExportGraphSignature.__post_init__oldnewc                 C   s   t |tsJ t |tsJ tttf}| jD ]}t |j|r(|jj|kr(||j_q| jD ]}t |j|r>|jj|kr>||j_q,dS )zR
        Replace all uses of the old name with new name in the signature.
        N)	r1   r   r   r   r   rX   r.   r   rW   )r4   r~   r   	arg_typesrQ   ir   r   r   replace_all_uses  s   


z%ExportGraphSignature.replace_all_usesc                    s    fdd}|S )Nc                    s    |j dv r | j| d S d S )N)outputinput)opr   r   )r~   r   userr3   r   r   _	  s   
z0ExportGraphSignature.get_replace_hook.<locals>._r   )r4   r   r   r3   r   get_replace_hook  s   z%ExportGraphSignature.get_replace_hook)rK   N)&r   r   r   __doc__r   r   r   r   propertyr   r   rb   rd   re   rg   rh   r   r$   r%   r&   r>   rA   r   r?   r@   rp   rq   rr   rs   r   r   ru   rv   rI   rJ   r5   r   r   r   r   r   r   r      sR   
 F
	
	
""	
		
r   )dataclassesenumr   r   typingr   r   r   r   r   r	   r
   r   __all__	dataclassr   r!   r   r   r   r6   r   r   r   r   r   rY   r   r   r   r   r   r   <module>   sz   (		






	

^