
    Vh1                    n    d dl mZ d dlmZ d dlZd dlmZmZ erd dlm	Z	  G d dej                        Zy)    )annotations)TYPE_CHECKINGN)_passdiagnostics)Sequencec                  P     e Zd ZdZ	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 ddZddZ xZS )RestoreParameterAndBufferNamesad  Restore parameter and buffer names from original nn.module.

    This pass is useful for readability of the exported ONNX graph. It restores the
    parameter and buffer names from the original nn.module. For example, if the original
    nn.module has a parameter named `root.linear.0.weight`, and the parameter is renamed to
    `_param_constant9` by FX, this pass will rename it back.

    This pass must be run after `Decompose` pass. Because this pass is expected to be called on
    `fx.GraphModule` produced by `proxy_tensor.make_fx`, where all parameters and buffers
    are registered at root level.
    c                4    t         |   ||       || _        y )N)super__init__original_nn_module)selfdiagnostic_context	fx_moduler   	__class__s       Z/home/dcms/DCMS/lib/python3.12/site-packages/torch/onnx/_internal/fx/passes/readability.pyr   z'RestoreParameterAndBufferNames.__init__   s     	+Y7"4    c                   t        |      dkD  sJ d       t        |D ch c]  }|j                   c}      dk(  sJ d       |d   j                  }t        |t              sJ d| d       |j	                  dd      }t        | j                  |      }t        | j                  ||       t        | j                  |       |D ]  }| j                  j                  j                  |      5  | j                  j                  j                  |      }|j                  |_        |j                  |       | j                  j                  j                  |       d	d	d	        |j                  d
|||       y	c c}w # 1 sw Y   xY w)z]Rename the parameter/buffer and replace corresponding nodes with new nodes of updated target.r   z`nodes` cannot be empty   z#`nodes` must all have same `target`Expected str, got type()./NzMRenamed 'self.%s' to 'self.%s', normalized from original parameter name '%s'.)lentarget
isinstancestrreplacegetattrmodulesetattrdelattrgraphinserting_beforeget_attrmetareplace_all_uses_with
erase_nodeinfo)	r   
diagnosticnodesnew_namenodeold_namenormalized_name
attr_valuenew_nodes	            r   _rename_param_and_bufferz7RestoreParameterAndBufferNames._rename_param_and_buffer$   sa    5zA~888~E2DDKK23q8 	
1	
8 8??(C(O,CH:Q*OO("**34T[[(3
_j9X& 	3D""33D9 3;;,,55oF $		**84!!,,T2	3 3	3 	<	
! 33 3s   E8,A-E==F	c                   t        |      dk(  sJ d       t        |      dk(  sJ d       i }|j                  | j                  j                         D ci c]  \  }}||
 c}}       |j                  | j                  j	                         D ci c]  \  }}||
 c}}       | j
                  j                         }i }| j                  j                  j                  D ]  }|j                  dk(  st        |j                  t              sJ d|j                   d       |j                  j                  d      dk7  rt        d	|j                   d
      |j                  |v r"||j                     d   j!                  |       t#        | j                  |j                        }	t        |	t$        j&                  j(                  t$        j*                  f      r|	|v r||	   }
|g|
f||j                  <   |j-                  d|j                  t/        |	             t        |	t$        j&                  j(                        r!t0        j2                  j4                  |_        t0        j2                  j8                  |_         |j;                         D ]  \  }}| j=                  |||        | j                  S c c}}w c c}}w )a  Restore parameter and buffer names from original module.

        For each `get_attr` node, if the target is a str representing a parameter or buffer
        under `self.module`, we rename the parameter or buffer to its original name.
        The parameters and buffers between `self.module` and `self.original_nn_module` refer
        to the same objects, allowing us to use it as key to retrieve the original name.
        r   z5RestoreParameterAndBufferNames does not take any argsz7RestoreParameterAndBufferNames does not take any kwargsr%   r   r   r   zUnexpected target z~ in get_attr, found '.' in target. All parameters and buffers are expected to be registered at root level, i.e., self.module. zACannot find readable name for self.%s: %s. The name is unchanged.)r   updater   named_parametersnamed_buffersr   inflight_diagnosticr    r#   r+   opr   r   r   findRuntimeErrorappendr   torchnn	ParameterTensorr)   typer   levelsWARNINGlevelNONEvaluesr2   )r   argskwargsstate_to_readable_namekvr*   old_name_to_nodesr-   r0   readable_namer+   r,   s                r   _runz#RestoreParameterAndBufferNames._runD   s    4yA~VVV~6{a 	
E	

 PR%%"55FFHIdaQTI	
 	%%"55CCEFdaQTF	
 ,,@@B

 IKKK%%++ !	?Dww*$!$++s3 -dkk]!<3 ;;##C(B.&,T[[M :. / 
 ;;"33%dkk215<<TB$T[[$++>
zEHH,>,>+MN"&<<$::$FM7;fm5L%dkk2WKK$
 j%((*<*<='2'9'9'A'AJ$'2'9'9'>'>J$C!	?F  1779 	GOE8))*eXF	G {{e J Gs   K
K
)r   zdiagnostics.DiagnosticContextr   torch.fx.GraphModuler   ztorch.nn.Module)r*   zdiagnostics.Diagnosticr+   zSequence[torch.fx.Node]r,   r   returnNone)rP   rO   )__name__
__module____qualname____doc__r   r2   rN   __classcell__)r   s   @r   r	   r	      s[    
595 (5 ,	5
*
 '
 	

 

@Br   r	   )
__future__r   typingr   r=   torch.onnx._internal.fxr   r   collections.abcr   	Transformr	    r   r   <module>r]      s+    "    6 (xU__ xr   