o
    Zh$                    @   s  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dl Z d dl!Z!d dl"m#  m$Z% d dl&m'Z' d d	l(m)Z) d d
l*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0 d dl1m2Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z; d dl<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZr ddlsmtZt g dZue	vewZxG dd deyZzde{eef fddZ|ee-e}e!jje~e!jhee!jde%jEf ZdZdZi e!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeaje!jeajZe|eZe!jeUje!jeUje!jeUje!jeUje!jeUje!jeUje!jeUjiZe|eZe!jeWje!jeWje!jeWje!jeWjiZe|eZejejejejejejejeje
je!jejejejejejeje!je!je!je!je!je!jejejhZedd eD r0J eG d d! d!ZeG d"d# d#ZdeFd$e!jfd%d&Zd'ee!jje!jde!jhe jf fd(d)Zd'ee}e!jjf d$ejfd*d+Zd'ee~e!jhf d$ehfd,d-Zd'eee!jdf d$edfd.d/Zd0e!jd$emfd1d2Zdaed3 ed4< d5e-fd6d7Zd8ed9ed$e-fd:d;Zefd<ee d=e}d$efd>d?Zd@ee{eef eedAf ef fdBdCZdDe jdEed$ee} fdFdGZdDee} d$e jfdHdIZdJe jdKe;fdLdMZdNe{e je=f d$e{ee`f fdOdPZdQdR ZeG dSdT dTZG dUdV dVeZeG dWdX dXedYZeG dZd[ d[edYZeG d\d3 d3edYZeG d]d^ d^edYZG d_d` d`ejZdadb Zdced$efdddeZdefdfe%jGdgee{ee}f  d=e}d$efdhdiZdjdk Z	ddldmd<ednee{ee}f  d$e%jGfdodpZd$eeJe{eef f fdqdrZddseGdtee e  d$eGfdudvZG dwdx dxZdyee dzee fd{d|Zd}d~ Zi Ze{ee ee f ed< i Ze{eee f ed< dS )    N)OrderedDict
namedtuple)contextmanager)	dataclassfield)Enum)	AnnotatedAnyCallablecastfinalOptionalUnion)Iteratorload_verifier)&_enable_graph_inputs_of_type_nn_module)FakeScriptObject)
FakeTensorFakeTensorMode)symbolic_shapes)_pytree)treespec_dumpstreespec_loads)int_oo)
prefix_strSymT)ValueRanges   )remove_proxy_from_state_dict   )2ArgumentArgumentKindBufferMutationSpecConstantValueCustomObjArgumentDeviceExportedProgramGradientToParameterSpecGradientToUserInputSpecGraphGraphArgumentGraphModuleGraphSignature	InputSpecInputToBufferSpecInputToConstantInputSpecInputToCustomObjSpecInputTokenSpecInputToParameterSpecInputToTensorConstantSpecLayoutLossOutputSpecMemoryFormatModuleCallEntryModuleCallSignatureNamedArgumentNamedTupleDefNodeOptionalTensorArgument
OutputSpecOutputTokenSpecRangeConstraint
ScalarTypeSCHEMA_VERSIONSchemaVersionSymBoolSymBoolArgumentSymExprSymExprHintSymFloatSymFloatArgumentSymIntSymIntArgumentTensorArgument
TensorMetaTokenArgumentTREESPEC_VERSIONUserInputMutationSpecUserInputSpecUserOutputSpec)_Union)	serializeGraphModuleSerializerExportedProgramSerializerGraphModuleDeserializerExportedProgramDeserializerc                   @   s   e Zd ZdS )SerializeErrorN)__name__
__module____qualname__ r]   r]   L/var/www/auris/lib/python3.10/site-packages/torch/_export/serde/serialize.pyrY   r   s    rY   dc                 C      dd |   D S )Nc                 S   s   i | ]\}}|j |qS r]   )value.0kvr]   r]   r^   
<dictcomp>w       z _reverse_map.<locals>.<dictcomp>itemsr_   r]   r]   r^   _reverse_mapv      rk   ;c                 c       | ]
}t |tjjV  qd S N)
isinstancetorch_ops
OpOverload)rc   opr]   r]   r^   	<genexpr>       ru   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )SerializedArtifactexported_program
state_dict	constantsexample_inputsN)rZ   r[   r\   bytes__annotations__r]   r]   r]   r^   rw      
   
 rw   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )_SerializedProgramrx   ry   rz   r{   N)rZ   r[   r\   r'   r}   r|   r]   r]   r]   r^   r      r~   r   returnc                 C   s*   | j d u rtj| jdS tj| j| j dS )Ntyper   index)r   rq   devicer   rj   r]   r]   r^   deserialize_device   s   
r   sc                 C   s,   t | tjtjtjfr| jj} tjj	
| S ro   )rp   rq   rJ   rD   rH   nodeexprsympyZprintingreprZsreprr   r]   r]   r^   _print_sympy   s   r   c                 C      t | tjtjtfrDt| rtjt| dS t | tjtjfs"J | j	j
d u r2tjtt| dS tjtt| tj| j	j
dddS td|  dt|  d)Nas_intas_exprhintz,SymInt should be either symbol or int, got `` of type ``)rp   rq   rJ   r   Symbolintr   Zis_concrete_intcreater   r   rF   r   rG   rY   r   r   r]   r]   r^   serialize_sym_int      
r   c                 C   r   )Nas_floatr   r   z0SymFloat should be either symbol or float, got `r   r   )rp   rq   rH   r   r   floatr   Zis_concrete_floatr   r   r   rF   r   rG   rY   r   r   r]   r]   r^   serialize_sym_float   r   r   c                 C   sZ   t | tjtfr t| rtjt| dS tjtt| ddS t	d|  dt
|  d)Nas_bool)expr_strr   z.SymBool should be either symbol or bool, got `r   r   )rp   rq   rD   boolr   Zis_concrete_boolr   rF   r   rY   r   r   r]   r]   r^   serialize_sym_bool  s   
r   tc              	   C   sR   t t| j dd | jD | jt| jj| jjddd | 	 D t
dt| j dS )z.
    Extract a TensorMeta describing `t`.
    c                 S      g | ]}t |qS r]   r   rc   r   r]   r]   r^   
<listcomp>'      z)serialize_tensor_meta.<locals>.<listcomp>r   c                 S   r   r]   r   r   r]   r]   r^   r   *  r   r   )dtypesizesrequires_gradr   stridesZstorage_offsetlayout)rM   _TORCH_TO_SERIALIZE_DTYPEr   shaper   r&   r   r   r   Zstrider   _TORCH_TO_SERIALIZE_LAYOUTr   )r   r]   r]   r^   serialize_tensor_meta!  s   r   rW   _CURRENT_DESERIALIZERfake_tensorc                 C   s:   t | tjj}t| }tjt|td	d}t
||ffS )Nclsutf-8)rp   rq   nn	Parameterr   jsondumps_dataclass_to_dictEnumEncoderencode_reconstruct_fake_tensor)r   is_parametertensor_metaZtensor_meta_bytesr]   r]   r^   _reduce_fake_tensor3  s   r   serialized_tensor_metar   c                 C   sH   t | d}tt|}td usJ dt|}|r"tj	|}|S )Nr   z)Need access to current deserializer state)
r   loadsdecode_dict_to_dataclassrM   r   deserialize_tensor_metarq   r   r   )r   r   Zjson_tensor_metar   r   r]   r]   r^   r   <  s   


r   artifactpickle_protocolc                 C   s`   | d u rdS t tjvsJ dztt t t }tj| ||d |	 W tjt = S tjt = w )N    z0Refusing to stomp on existing FakeTensor reducer)r   )
r   copyregdispatch_tablepickler   ioBytesIOrq   savegetvalue)r   r   bufferr]   r]   r^   serialize_torch_artifactL  s   r   
serialized.c                 C   sZ   t | ttfr	| S t| dkri S t| }|d tj|dd}t |ttfs+J |S )Nr   F)Zweights_only)	rp   dicttuplelenr   r   seekrq   load)r   r   r   r]   r]   r^   deserialize_torch_artifactb  s   

r   valadjustc                 C   s   | t jtfv r	d S | t j t fv rd S t| t jrt| S tdt| | | |dkr1t	
| S |dkr:t	| S td| )NztExport constraints cannot be non-integer expressions. Found type %s, and value %s. We will attempt to %s this value.floorceilzGot invalid adjustment )r   Zoor   rp   Integerr   logwarningr   mathr   r   RuntimeError)r   r   r]   r]   r^   _sympy_int_to_into  s   


r   c                 C   s6   | d u r|S | t jkrtS | t j krt S t| S ro   )r   infr   r   r   )r   defaultr]   r]   r^   _int_to_sympy_int  s   

r   symsym_typec                 C   s   t t| tt| d  S ro   )r   strr   r   )r   r   r]   r]   r^   _symbol_index  s   r   range_constraintsc                 C   r`   )Nc                 S   s0   i | ]\}}t |tt|jd t|jdqS )r   r   )r   r@   r   lowerupperrb   r]   r]   r^   rf     s    

z/serialize_range_constraints.<locals>.<dictcomp>rh   )r   r]   r]   r^   serialize_range_constraints  s   r   c                 C   sD   t | tjjr
| jS t| tv rtt|  | S tdt|  )NzCannot find schema for )	rp   rq   rr   rs   _schemar   _serialization_registry	op_schemar   )targetr]   r]   r^   _get_schema_from_target  s
   r   c                   @   s   e Zd ZU eedZee ed< eedZee ed< eedZ	ee
 ed< eedZeeef ed< eedZeeef ed< eedZeeef ed< eedZeeef ed< d	Zeed
< eedZeeef ed< dS )
GraphState)default_factoryinputsoutputsnodestensor_valuessym_int_valuessym_bool_valuessym_float_valuesFis_single_tensor_returncustom_obj_valuesN)rZ   r[   r\   r   listr   r!   r}   r   r   r<   r   r   r   rM   r   rJ   r   rD   r   rH   r   r   r   r%   r]   r]   r]   r^   r     s   
 r   c                   @   s   e Zd Zdd ZdS )Finalc                 C   s:   |D ]}t |trtd|j dqt| ||t|S )Nztype 'z ' is not an acceptable base type)rp   r  	TypeErrorrZ   r   __new__r   )metaclsnamebases	classdictbr]   r]   r^   r    s
   
zFinal.__new__N)rZ   r[   r\   r  r]   r]   r]   r^   r    s    r  c                   @   s  e Zd Zdejdeej fddZedd Z	de
jjfdd	Zde
jjfd
dZdefddZde
jjfddZdd Zdee
jj fddZdefddZde
jjdeeef fddZdejdefddZdee fddZ	d[dedee fd d!Zdee fd"d#Zdefd$d%Z defd&d'Z!defd(d)Z"defd*d+Z#	d[d,ee de$fd-d.Z%de&fd/d0Z'de(fd1d2Z)de*fd3d4Z+de(fd5d6Z,d7ej-de-fd8d9Z.d7ej/de/fd:d;Z0d<ejde1fd=d>Z2d?ej3de$fd@dAZ4dBdC Z5dDej6de6fdEdFZ7deej dee fdGdHZ8de
jjdee$ fdIdJZ9de
jjdee$ fdKdLZ:dMedNede$fdOdPZ;de
jjdee& fdQdRZ<dSe
jj=de>fdTdUZ?dVeeef fdWdXZ@dSe
jj=de=fdYdZZAdS )\rU   graph_signaturemodule_call_graphc                 C   s*   t  | _|| _|| _i | _i | _i | _d S ro   )r   graph_stater
  r  custom_objsduplicate_getitem_nodestreespec_namedtuple_fields)selfr
  r  r]   r]   r^   __init__  s   
zGraphModuleSerializer.__init__c                 c   s,    | j }t | _ z	d V  W || _ d S || _ w ro   )r  r   r  savedr]   r]   r^   save_graph_state  s   z&GraphModuleSerializer.save_graph_stater   c                 C   s  |j dksJ |jd }td|j| t|tjr&tj	| 
|j|d}nWt|tjr8tj	| |j|d}nEt|tjrBtdt|tttttd frT| |}n)t|tjrs|j}tj	t|j|dd}| || jj|j< n
td	|jd  | jj| d S )
Nplaceholderr   z[handle_placeholder] %s: %s	as_tensor
as_sym_intz,SymFloat graph input is not implemented yet.r  	class_fqnas_custom_objz Unimplemented graph input type: )rt   metar   debugr  rp   rq   Tensorr!   r   serialize_tensor_outputrJ   serialize_sym_int_outputrH   AssertionErrorr   r   r   r   r   serialize_inputepr%   r  serialize_script_obj_metar  r   r   append)r  r   r   Zgraph_inputr  r]   r]   r^   handle_placeholder  s(   
z(GraphModuleSerializer.handle_placeholderc                    s   |j dksJ t|jdksJ d|jd }td|j| t|tjj	r4d j
_ |g j
_d S t|ttfs=J  fdd|D  j
_d S )	Noutputr    z"FX.Node's args should have one argr   z[handle_output] %s: %sTc                       g | ]}  |qS r]   )r$  rc   argr  r]   r^   r         z7GraphModuleSerializer.handle_output.<locals>.<listcomp>)rt   r   argsr   r  r  rp   rq   fxr<   r  r   r$  r   r   r  )r  r   Z	node_argsr]   r-  r^   handle_output  s   
z#GraphModuleSerializer.handle_outputr   c                 C   sJ   t |tr|S |jdr|jdd}| d|j S |j d|j S )Nz
torch._opsz	torch.ops.)rp   r   r[   
startswithreplacerZ   )r  r   moduler]   r]   r^   serialize_operator  s   
z(GraphModuleSerializer.serialize_operatorc                    s  |j dksJ |jd}td|j|j|j|j| |jt	j
u r#d S |jtv s7|d ur]t|tjtjtjfr]t|jdks@J t |j |j|j |j|g |d}nt|jtjjrt |j |j|j|j | |d}nt|jtjjrdtfdd}|jtjju rt|j}|jd j}t |j!j"|sJ t#|j!j"|}|j$|d< d |d	<  fd
d}t |j %||j|| |dd}nt |j %|j|j &| |||d}nkt'|jt(v rVt'|jt(v sJ t'|j dt(t'|j }	|	) }
|	*|j}t|
t+r+t|t+s-J d|
vr7d|vs9J td|
 d|  |j|j|j | |d}n	t,d|j d j-j./| d S )Ncall_functionr   z-[handle_call_function] %s: %s(%s, {%s}) -> %sr   )r   r   r   metadatar   c                 S   s6   t | jtjjs
J | jdd }|d uot |tjS )Nr   )rp   r   rq   rr   HigherOrderOperatorr  getr   )r   meta_valr]   r]   r^   _is_hop_single_tensor_return'  s   zPGraphModuleSerializer.handle_call_function.<locals>._is_hop_single_tensor_returnr    c                    sP   | j dd }g }t|D ]\}} | |}| || qtj|dgS )Nr   
as_tensors)r  r:  	enumerate_output_node_name_at_indexr'  r!  r!   r   )r   r;  tensor_argsidxr  r  r-  r]   r^   serialize_tensor_list_output;  s   zPGraphModuleSerializer.handle_call_function.<locals>.serialize_tensor_list_outputF)r   r   r   r8  is_hop_single_tensor_returnz* is not supported in export serialization.:#zSerializing z is not supported)0rt   r  r:  r   r  r  r   r/  kwargsoperatorgetitem_SYM_OPSrp   rq   rJ   rD   rH   r   r<   r6  serialize_sym_op_inputsserialize_outputserialize_metadatarr   rs   serialize_inputsserialize_outputsr9  r   _higher_order_opsZaoti_call_delegater  hasattrgraphowning_modulegetattrZ	aoti_pathserialize_hoo_inputsserialize_hoo_outputsr   r   	namespace
to_op_namer   rY   r  r   r'  )r  r   r;  Zex_noder<  Zserializable_argsZlowered_module_nameZlowered_modulerC  handlerrW  op_namer]   r-  r^   handle_call_function
  sx   





	

$z*GraphModuleSerializer.handle_call_functionc                 C   s   t d|j d S )Nz[handle_get_attr] %s)r   r  r  )r  r   r]   r]   r^   handle_get_attrg  rl   z%GraphModuleSerializer.handle_get_attrc                 C   sX   d }|j D ]$}|jtju sJ | d||jd kr)|d u r"|}q|j| j|j< q|S )Nz is not a getitem noder    )usersr   rH  rI  r/  r  r  )r  r   r   	user_nodeuserr]   r]   r^   _output_node_at_indexj  s   
z+GraphModuleSerializer._output_node_at_indexc                 C   s*   |  ||}|d u r|j d| S |jS )N_unused_)r`  r  )r  r   r   r^  r]   r]   r^   r@  w  s   z0GraphModuleSerializer._output_node_name_at_indexc              
      s  i }|j d }r||d< |j d }r,dd   fdd| D }t||d< |j d }rDfdd|D }t||d< |j d	 }rUtt||d	< |j d
 }	rz
t|	|d
< W |S  ty }
 zt	d|j
 d|
 |
d }
~
ww |S )Nstack_tracenn_module_stackc                 S   sJ   t | trt| dksJ | \}}t |tsJ t |tsJ |d | S )Nr   ,)rp   r   r   r   )r   pathtyr]   r]   r^   export_nn_module_stack  s
   zHGraphModuleSerializer.serialize_metadata.<locals>.export_nn_module_stackc                    s"   g | ]\}}| d  | qS )rd  r]   rb   )rg  r]   r^   r     s    z<GraphModuleSerializer.serialize_metadata.<locals>.<listcomp>source_fn_stackc                    s(   g | ]}|d   d  |d  qS )r   rd  r    )r6  )rc   Z	source_fnr-  r]   r^   r     s    torch_fncustomz-Failed to serialize custom metadata for node z with error )r  r:  ri   ST_DELIMITERjoinr  r   r   	ExceptionrY   r  )r  r   retrb  rc  Znn_module_listsource_fn_stZsource_fn_listri  rj  er]   )rg  r  r^   rM  ~  s:   


z(GraphModuleSerializer.serialize_metadatascript_obj_metac                 C   s   t d| t|j|jdS )Nz[serialize_script_obj_meta] %sr  )r   r  r%   r  r  r  rq  r]   r]   r^   r&    s
   z/GraphModuleSerializer.serialize_script_obj_metac                 C   sz   t |tjjrdd |jjD }n|tv sJ tt	|j
 }g }t||D ]\}}|t|| |tjd q(|S )Nc                 S      g | ]}|j qS r]   r  r+  r]   r]   r^   r         zAGraphModuleSerializer.serialize_sym_op_inputs.<locals>.<listcomp>r  r,  kind)rp   rq   rr   rs   r   	argumentsrJ  r  inspect	signature
parameterskeyszipr'  r:   r$  r"   
POSITIONAL)r  rt   r/  Z
args_namesserialized_argsZ	args_namer,  r]   r]   r^   rK    s   z-GraphModuleSerializer.serialize_sym_op_inputsNr   c           
   	   C   s   d }g }t |tjjjr|d }|d }|||}nt |tjjgt R s)J t	|}|d us3J |p6i }t
|jD ]<\}}	|	j|v rZ|t|	j| ||	j |	jtjd q<|	jsw|t|k rw|t|	j| || |	jtjd q<	 q<|S )Nr   r    rv  )rp   rq   rP  Z	torchbindZCallTorchBindschemarr   rs   _registered_extension_typesr   r?  rx  r  r'  r:   r$  r   r"   KEYWORD
kwarg_onlyr   r~  )
r  r   r/  rG  r  r  objmethodi
schema_argr]   r]   r^   rN    s:   

z&GraphModuleSerializer.serialize_inputsc                    s2    fdd|D }|  fdd| D  |S )zM
        For serializing HOO inputs since HOOs do not have a schema.
        c                    s"   g | ]}t d  |tjdqS ) rv  )r:   r$  r"   r~  rc   ar-  r]   r^   r     s    z>GraphModuleSerializer.serialize_hoo_inputs.<locals>.<listcomp>c                    s&   g | ]\}}t | |tjd qS )rv  )r:   r$  r"   r  )rc   r  r  r-  r]   r^   r     s    )extendri   )r  r/  rG  r   r]   r-  r^   rU    s   


z*GraphModuleSerializer.serialize_hoo_inputsc                 C   s   t |tu pt|tjS ro   )r   r   rp   rq   rJ   r  r,  r]   r]   r^   is_inductor_sym_int_arg  s   z-GraphModuleSerializer.is_inductor_sym_int_argc                 C   s(   t |tu pt|tjjo|j| jjv S ro   )	r   r   rp   rq   r0  r<   r  r  r   r  r]   r]   r^   is_sym_int_arg  s   z$GraphModuleSerializer.is_sym_int_argc                 C   &   t |tpt |tjjo|j| jjv S ro   )rp   r   rq   r0  r<   r  r  r   r  r]   r]   r^   is_sym_float_arg     
z&GraphModuleSerializer.is_sym_float_argc                 C   r  ro   )rp   r   rq   r0  r<   r  r  r   r  r]   r]   r^   is_sym_bool_arg  r  z%GraphModuleSerializer.is_sym_bool_argarg_typec                    s  dd l m  m} |j|jf t|tjjr|j	dkrmt|j
ts#J t|jj|j
}t|tjr5tdt|tjjr`  |}W d    n1 sPw   Y  tjt|j
|ddS td|j
 dt| |r}tjtj|jdd	S |rtjtj|jdd
S |rtjtj|jddS t|jd t j!rtjt!|j|jd j"ddS |jj#v rʈj#|j }tjt$|ddS tjt$|jddS t| r|% }|d usJ dtjt$|ddS t||j&r|% }|d usJ d|' }|( ) }	|j*|< tjt!||	dS t|tj+r-tjtjt|dd	S t|tj,r@tjtjt|dd
S t|t-u rMtj|dS t|tu rZtj|dS t|t.u rgtj|dS t|t/u rttj|dS |d u rtjddS t|t0t1frt2|dkr
|d urt|tj3r|4 }t|tj5sJ |4 }
t|
tj3r|
4 }
t|
tj6rtjg dS t|
tj7rtjg dS t|
tj8rtjg dS t|
tj9rtjg dS t|
tj:rtjg dS td|
 dt;<d tjg dS t=d d! |D rtjt0|dS t=d"d! |D r.tjt0|dS t=d#d! |D r@tjt0|dS t=d$d! |D rRtjt0|dS t=fd%d!|D rg }|D ]'}t|tj+rx|>tjt|d qbt|t.u r|>tj|d qbtj|d&S t=d'd! |D rtjd(d) |D d*S t=fd+d!|D rg }|D ]'}t|tjjr|>tj|jd qt|t.u r|>tj|d qtj|d&S t=fd,d!|D r g }|D ]&}t|tjjr	|>tj|jd qt|t/r|>tj|d qtj|d*S t=fd-d!|D r]g }|D ]&}t|tjjrF|>tj|jd q0t|t-rU|>tj|d q0tj|d.S t=d/d! |D rg }|D ]}|j	dkrwtd|>t$|jd qktj|dS t=d0d! |D rd1d2 }tjt0t?||d3S t= fd4d!|D rtjd5d) |D dS t= fd6d!|D rՇ fd7d2}tjt0t?||d3S td8d9d) |D  t|tj@rtjtA| d:S t|tjBrtjtC|j|jDd;d<S t|tjErtjtF| d=S t|tjGr!tjtH| d>S t|tjIjJrY|Kd?r5|Kd@s=tdA| dBdCt2j* }|j*|< |( ) }	tjt!||	dS t|tjLjMtjLjNfrntjO|dDS tdEt| dF| )GNr   get_attrz?getattr nodes containing tensors should not appear in the graph)r  rR  )as_graphzUnsupported getattr attribute z with type: as_namer  as_sym_floatas_sym_boolr   r  r  rt  r  zBuffer must have valid namer   	as_stringr   r   Tas_none)as_bools)as_ints)	as_floats)
as_stringsr=  zEmpty list with type z nyi.zUnsure how to serialize the given empty list, as we don't know what is the type of this argument. Serializing it as a tensor list by default.c                 s       | ]	}t |tu V  qd S ro   )r   r   r  r]   r]   r^   ru         z8GraphModuleSerializer.serialize_input.<locals>.<genexpr>c                 s   r  ro   )r   r   r  r]   r]   r^   ru     r  c                 s   r  ro   )r   r   r  r]   r]   r^   ru     r  c                 s   r  ro   )r   r   r  r]   r]   r^   ru     r  c                 3       | ]}  |V  qd S ro   )r  r  r-  r]   r^   ru         )as_sym_intsc                 s   s    | ]	}t |tjV  qd S ro   )rp   rq   rH   r  r]   r]   r^   ru     r  c                 S   s   g | ]
}t jt|d qS )r  )rI   r   r   r  r]   r]   r^   r         z9GraphModuleSerializer.serialize_input.<locals>.<listcomp>)as_sym_floatsc                 3   r  ro   )r  r  r-  r]   r^   ru     r  c                 3   r  ro   )r  r  r-  r]   r^   ru     r  c                 3   r  ro   )r  r  r-  r]   r^   ru     r  )as_sym_boolsc                 s   rn   ro   )rp   rq   r0  r<   r  r]   r]   r^   ru     rv   c                 s   s&    | ]}t |tjjtd fV  qd S ro   )rp   rq   r0  r<   r   r  r]   r]   r^   ru     s   $ c                 S   sD   | d u r
t jddS t| tjjrt jt| jddS td|  NTr  rt  r  z!Unsupported list/tuple argument: )	r=   r   rp   rq   r0  r<   rL   r  rY   r  r]   r]   r^   serialize_optional_tensor_args  s   
zMGraphModuleSerializer.serialize_input.<locals>.serialize_optional_tensor_args)as_optional_tensorsc                 3   s    | ]}t | V  qd S ro   )rp   r  inductor_tensor_buffersr]   r^   ru     r  c                 S   s   g | ]	}t | d qS )rt  )rL   get_namer  r]   r]   r^   r         c                 3   s(    | ]}t |g  td R V  qd S ro   )rp   r   r  r  r]   r^   ru     s    
c                    sB   | d u r
t jddS t|  rt jt|  ddS td|  r  )r=   r   rp   rL   r  rY   r  r  r]   r^   r    s   
z&Unsupported list/tuple argument type: c                 S   r   r]   r   r  r]   r]   r^   r     r   )as_scalar_typer   )	as_device)as_memory_format)	as_layout__getstate____setstate__z!Unable to serialize custom class z7. Please define serialization methods via def_pickle().Z_custom_obj_)as_operatorzUnsupported argument type: z with schema arg_type )PZtorch._inductor.irZ	_inductorZirZBufferZReinterpretViewrp   rq   r0  r<   rt   r   r   rT  rR  rS  r   rY   r,   r  serialize_graphr!   r   r+   r   r  rK   r  r  rI   r  rE   r  r%  r%   r  r  rL   r  ZTorchBindObjectZget_real_obj_typeZqualified_namer  rJ   rH   r   r   r   r  r   r   OptionalTypegetElementTypeListTypeZBoolTypeZIntTypeZ	FloatTypeZ
StringType
TensorTyper   r   allr'  mapr   r   r   r&   r   Zmemory_format!_TORCH_TO_SERIALIZE_MEMORY_FORMATr   r   _CScriptObjectZ_has_methodrr   rs   r9  r6  )r  r,  r  Zinductor_irattrrR  Z
dedup_namearg_namearg_valr  Z	elem_typevaluesr  rx  r  custom_obj_namer]   )r  r  r^   r$     s  













z%GraphModuleSerializer.serialize_inputc                 C   s*   || j jvsJ t|| j j|< t|dS )Nrt  )r  r   r   rL   r  r  r;  r]   r]   r^   r!  '  s   
z-GraphModuleSerializer.serialize_tensor_outputc                 C   ,   || j jvsJ t|| j j|< tj|dS Nr  )r  r   r   rK   r   r  r]   r]   r^   r"  ,     z.GraphModuleSerializer.serialize_sym_int_outputc                 C   r  r  )r  r   r   rI   r   r  r]   r]   r^   serialize_sym_float_output1  r  z0GraphModuleSerializer.serialize_sym_float_outputc                 C   r  r  )r  r   r   rE   r   r  r]   r]   r^   serialize_sym_bool_output6  r  z/GraphModuleSerializer.serialize_sym_bool_outputspecc                 C   s  t d| |jtjjkrt|jtjr{t	|jj
tu r%tj|jj
d}nJt	|jj
tu r6tj|jj
d}n9t	|jj
tu rGtj|jj
d}n(t	|jj
tu rXtj|jj
d}n|jj
d u retjdd}n
td|jj
 d	tjt|jj|d
dS tjt| |jddS |jtjjkr|jd usJ t|jtjsJ tjtt|jjd|jddS |jtjjkr|jd usJ t|jtjsJ |jd usJ tjtt|jjd|j|jddS |jtjjkr|jd usJ t|jtjsJ tjtt|jjd|jddS |jtjj kr4|jd usJ t|jtj!s!J tjt"t!|jj|jj#d|jddS |jtjj$krTt|jtj%sFJ tjt&t%|jjdddS t'd| )Nz[serialize_input_spec] %sr   r   r  r   Tr  zUnhandled constant input z to serializer  ra   )constant_inputr,  )
user_inputrt  r,  parameter_name)	parameter)r,  buffer_name
persistent)r   )r,  tensor_constant_name)tensor_constantr  )r,  r  )
custom_objtokenUnknown argument kind: )(r   r  rw  r%  	InputKind
USER_INPUTrp   r,  ConstantArgumentr   ra   r   r$   r   r   r   r   rY   r.   r0   r  rQ   serialize_argument_spec	PARAMETERr   rL   r3   BUFFERr  r/   CONSTANT_TENSORr4   
CUSTOM_OBJr%   r1   r  TOKENrN   r2   r#  )r  r  Zconstant_specr]   r]   r^   serialize_input_spec;  s   
z*GraphModuleSerializer.serialize_input_specc                 C   s  t d| |jtjjkrtjt| 	|j
ddS |jtjjkr8t|j
tjs*J tjtt|j
jdddS |jtjjkr_|jd usFJ t|j
tjsOJ tjtt|j
jd|jddS |jtjjkr|jd usmJ t|j
tjsvJ tjtt|j
jd|jdd	S |jtjjkr|jd usJ t|j
tjsJ tjtt|j
jd|jd
dS |jtjjkr|jd usJ t|j
tjsJ tjtt|j
jd|jd
dS |jtjjkrt|j
tjsJ tjtt|j
jdddS td| )Nz[serialize_output_spec] %sr  )user_outputrt  )loss_output)r,  r  )buffer_mutationr  )gradient_to_parameter)r,  user_input_name)gradient_to_user_input)user_input_mutationr  r  )r   r  rw  r%  
OutputKindUSER_OUTPUTr>   r   rR   r  r,  LOSS_OUTPUTrp   rL   r6   r  BUFFER_MUTATIONr   r#   GRADIENT_TO_PARAMETERr(   GRADIENT_TO_USER_INPUTr)   USER_INPUT_MUTATIONrP   r  rN   r?   r#  )r  r  r]   r]   r^   serialize_output_spec  sl   z+GraphModuleSerializer.serialize_output_specsigc                    s6   t d t fdd|jD  fdd|jD dS )Nz
[serialize_signature]c                    r*  r]   )r  r   r-  r]   r^   r     r.  z=GraphModuleSerializer.serialize_signature.<locals>.<listcomp>c                    r*  r]   )r  r   r-  r]   r^   r     r.  input_specsoutput_specs)r   r  r-   r  r  r  r  r]   r-  r^   serialize_signature  s
   
z)GraphModuleSerializer.serialize_signaturexc                 C   s   t |tjrtjt|jddS t |tjr!tjtj|jddS t |tjr2tjtj|jddS t |tjr>| 	|j
S t |tjrPtjt|j|jddS td)	Nrt  r  r  r  r  r  r  TODO)rp   r%  rL   r!   r   r  rK   rI   r  r$  ra   r%   r  r#  r  r   r]   r]   r^   r    s   z-GraphModuleSerializer.serialize_argument_specc                    s$    fddt |t}| |S )Nc                    s   | j d u rd S | j tkr@tj| j j}| jv r6 j| j}|| jjkr5t	d| j d| jj d| dn
t
| jjd j|< | jD ]}| qCd S )Nz%The given TreeSpec's namedtuple type z was found to have field names z6 but somehow previously was found to have field names r2  )field_names)r   r   pytreeZSUPPORTED_SERIALIZED_TYPEScontextserialized_type_namer  r  _fieldsrY   r;   Zchildren_specs)tsr  r  childr  store_namedtuple_fieldsr]   r^   r    s&   





zIGraphModuleSerializer.serialize_treespec.<locals>.store_namedtuple_fields)r   rO   )r  ZtreespecZserialized_treespecr]   r
  r^   serialize_treespec  s   
z(GraphModuleSerializer.serialize_treespecmodule_call_signaturec                    s`   t d| t fdd|jD  fdd|jD  |j |j|j }r,|dS d dS )Nz$[serialize_module_call_signature] %sc                    r*  r]   r  rc   r   r-  r]   r^   r         
zIGraphModuleSerializer.serialize_module_call_signature.<locals>.<listcomp>c                    r*  r]   r  r  r-  r]   r^   r     r  r   r   in_specout_specforward_arg_names)	r   r  r9   r   r   r  r  r  r  r  r  namesr]   r-  r^   serialize_module_call_signature  s   



	z5GraphModuleSerializer.serialize_module_call_signaturec                       t d  fdd|D S )Nz
[serialize_module_call_graph]c                    s,   g | ]}t |j|jr |jnd dqS N)fqnrz  )r8   r  rz  r  rc   entryr-  r]   r^   r     s    	zEGraphModuleSerializer.serialize_module_call_graph.<locals>.<listcomp>r   r  r  r  r]   r-  r^   serialize_module_call_graph     

	z1GraphModuleSerializer.serialize_module_call_graphc                 C   sL  dt dtfdd}|jdkrt|jtjjgt R sJ t	|j}|j
}t|dkr-g S |jd }||jrXg }t|D ]\}}| ||}	|| |	| q=tj|dgS t|d	krf| |j|gS g }
tt||D ]\}\}}|d
u rt|jtjtjfsJ |
tjdd qot|trt|jtjtjfsJ | ||}	|
| |	| qot|trt|jtjrt|j tjsJ | ||}|d
usJ g }t|D ]\}}|d
u rq| ||}|| || q|
tj|d qot|ttt t!fr| ||}|
| || qot"dt#| d|$  |
S )a5  For a given node, return the dataclass representing its output values.

        [NOTE: Multiple outputs] We handle aggregates differently than FX. For
        FX, it looks like:

            x = call_function("multiple_return", ...)
            element0 = call_function(getitem, x, 0)
            foo = call_function("use_output", element0)

        We do not want the intermediate `getitem` call, so our serialized thing looks like:

            element0, element1, element2 = call_function("multiple_return", ...)
            foo = call_function("use_output", element0)

        We want names to be consistent across these two schemes, so that we can
        mostly reuse the names coming from FX. This function computes a mapping from
        the FX representation to our representation, preserving the names.
        r   r   c                 S   sD   t | }|j}t|dkrdS |d j}t|tjo!t| tjS )Nr    Fr   )	r   returnsr   	real_typerp   rq   r  r  r  )r   r  r!  return_typer]   r]   r^   _is_single_tensor_list_return&  s   

zNGraphModuleSerializer.serialize_outputs.<locals>._is_single_tensor_list_returnr7  r   r   r=  r    NTr  zUnhandled output type z from node )%r	   r   rt   rp   r   rq   rr   rs   r  r   r!  r   r  r?  r@  r'  r!  r!   r   rL  r  r}  r"  r  r  r   r  r  r  r`  r   rJ   r   rH   
ValueErrorr   format_node)r  r   r$  r  r!  r;  rA  rB  r  r  Zoutput_argumentsZreturn_schemar^  r/  r  mZsub_user_node_nameZuser_node_namer]   r]   r^   rO    sd   (





z'GraphModuleSerializer.serialize_outputsc                 C   s   |j d }t|trtg }t|D ]a\}}| ||}t|trY|dus%J g }t|D ]#\}}	t|	tjs?tdt	|	 d| 
||}
|| |
|	 q+|tj|d q|dur`|jn|j d| }
|| |
| q|S | |j|gS )zN
        For serializing HOO outputs since HOOs do not have a schema.
        r   Nz Serialize list output with type z nyir=  ra  )r  rp   r   r?  r`  r  rq   r   rY   r   r@  r'  r!  r!   r   r  rL  )r  r   r;  r   r  element_meta_valr^  Ztensorsjr'  r  r]   r]   r^   rV  v  s*   


z+GraphModuleSerializer.serialize_hoo_outputsr  r;  c                 C   s   |d u r
t jddS t|tjrt j| ||dS t|ttjfr,t j| ||dS t|t	tj
frEt|tr;J t j| ||dS t|ttjfrWt j| ||dS td| )NTr  r  r  r  r  zUnable to serialize output )r!   r   rp   rq   r   r!  r   rD   r  r   rJ   r"  r   rH   r  rY   r  r]   r]   r^   rL    s(   



z&GraphModuleSerializer.serialize_outputc           
      C   s   |j d }i }|jD ]}|jtju sJ d| d| d|j||jd < q
t|D ]\}}||vr<|j d| ||< q*g }t|D ]\}}	|| 	|| |	 qC|S )Nr   z
User node z of z is incorrectr    ra  )
r  r]  r   rH  rI  r  r/  r?  r'  r!  )
r  r   r;  Zidx_to_namer_  rB  _arg_listr  r(  r]   r]   r^   _handle_getitem_users  s"   

z+GraphModuleSerializer._handle_getitem_usersgraph_modulec                 C   s   t |tjjs	J td|jdd |jjD ]-}zt	| d|j
 | W q tyD } ztd| d|  dt  |d }~ww t| jj| jj| jj| jj| jj| jj| jj| jj| jjd	S )	Nz[serialize_graph]

%sF)Zprint_outputZhandle_zFailed serializing node z in graph: 
 Original exception )	r   r   r   r   r   r   r   r   r   )rp   rq   r0  r,   r   r  Zprint_readablerR  r   rT  rt   rm  rY   r&  	traceback
format_excr*   r  r   r   r   r   r   r   r   r   )r  r-  r   rp  r]   r]   r^   r    s0   z%GraphModuleSerializer.serialize_graphr  c              
   C   s`   i }| d }r.td| z
t||d< W |S  ty- } ztd| |d }~ww |S )Nrj  z%
[serialize_graph_module_metadata] %sz9Failed to serialize custom metadata for graph with error )r:  r   r  r   r   rm  rY   )r  r  rn  rj  rp  r]   r]   r^   serialize_graph_module_metadata  s   z5GraphModuleSerializer.serialize_graph_module_metadatac                 C   s@   t d | |}t|| | j| | j| |j	| j
dS )Nz
[serialize])rR  rz  r  r8  r  )r   r  r  r,   r  r
  r  r  r1  r  r  )r  r-  rR  r]   r]   r^   rT     s   




zGraphModuleSerializer.serializero   )BrZ   r[   r\   r%  ExportGraphSignaturer  r8   r  r   r  rq   r0  r<   r(  r1  r   r6  r[  r\  r   r`  r@  r   rM  r%   r&  r:   rK  r	   rN  rU  r   r  r  r  r  r!   r$  rL   r!  rK   r"  rI   r  r  r.   r  r>   r  r-   r  ArgumentSpecr  r  r9   r  r  rO  rV  rL  r,  r,   r*   r  r1  rT   r]   r]   r]   r^   rU     s    

]+
	
+
  	M9

d$rU   )	metaclassc                   @   sD   e Zd Zdefdeeeef  defddZde	j
defdd	ZdS )
rV   Nopset_versionr   c                 C   s:   i | _ |r| j | d| j vrtj | j d< || _d S Naten)r5  updaterq   r  _get_max_operator_versionr   )r  r5  r   r]   r]   r^   r    s   

z"ExportedProgramSerializer.__init__rx   r   c                 C   s   |   t|j|j}||j}t|j}i }|j	 D ]\}}|||< q|j
	 D ]\}}||vs5J |||< q+t|| j|ttd td ddd |jD tjd}	t|	t|  t|jdd}
t|	t|
| jt|| jt|j| jS )	zS
        Args:
            exported_program: Exported Program to serialize
        r   r    )majorminorc                 S   rs  r]   )dialectrc   re   r]   r]   r^   r   .  ru  z7ExportedProgramSerializer.serialize.<locals>.<listcomp>r-  r5  r   schema_version	verifierstorch_versionF)Zin_place)validaterU   r
  r  rT   r-  r   r   r  ri   rz   r'   r5  rC   rB   r@  rq   __version__canonicalizesetr|  r   ry   r   r   r   r{   )r  rx   Zgm_serializerserialized_graph_moduleZserialized_range_constraintsrz   ncr   Zserialized_epZnew_state_dictr]   r]   r^   rT     sF   



z#ExportedProgramSerializer.serialize)rZ   r[   r\   DEFAULT_PICKLE_PROTOCOLr   r   r   r   r  r%  r'   r   rT   r]   r]   r]   r^   rV     s    $	rV   c                   @   sf  e Zd ZejG dd dZddddZeded fddZ	d	e
fd
dZd	e
fddZdede
deeeeef  dejfddZdedeeejf fddZdedeeejf fddZdedeeejf fddZdedefddZdede jfddZ!deeej"j#ef  fdd Z$d!e%dej"j%fd"d#Z&d$e#d%e'ddfd&d'Z(d(e)de j)fd)d*Z*d+e+de j+fd,d-Z,d.e-de j.fd/d0Z/		dfd1e0d2ee1e
ej2f e3f d3ee1e
e4f e3f d4eee5e5ej2d5f e1e
e4f f e3f  d6ee1e
e6j7f  defd7d8Z8d9e
d:ej"j#fd;d<Z9d=d> Z:d$e#fd?d@Z;dAe<e= fdBdCZ>dDe?de4fdEdFZ@dDeAde4fdGdHZBdIdJ ZCd$e#d:ej"j#fdKdLZDd$e#d:ej"j#fdMdNZEd:ej"j#dOeeFeGeHf dPedQe1e
e4f fdRdSZId:ej"j#dQe1e
e4f fdTdUZJd$e#d:ej"j#ddfdVdWZKdXe1e
e
f de1e
e4f fdYdZZLd[e?de jMfd\d]ZNd^eOde jOfd_d`ZPdae<eQ de<e jQ fdbdcZRdS )grW   c                   @   s   e Zd ZU ejjed< ejed< e	ej
 ed< eeejf ed< eeeejejjf f ed< eeeejeejf f ed< eeeejdf eeef f  ed< d	S )
zGraphModuleDeserializer.Resultr-  rz  r  names_to_symbolsry   rz   .r{   N)rZ   r[   r\   rq   r0  r,   r}   r%  r2  r  r8   r   r   r   r   r   r   r   r   r   r  r   r   r	   r]   r]   r]   r^   ResultC  s   
 
*rK  r   Nc                 C   s(   i | _ i | _tj | _tj | _d S ro   )	serialized_name_to_nodeserialized_name_to_metarq   r0  r*   rR  r   Moduler5  r-  r]   r]   r^   r  M  s   z GraphModuleDeserializer.__init__c                 c   sr    | j | j| j| jf}tj | _ tj | _i | _i | _zd V  W |\| _ | _| _| _d S |\| _ | _| _| _w ro   )	rR  r5  rL  rM  rq   r0  r*   r   rN  r  r]   r]   r^   save_graph_moduleS  s2   z)GraphModuleDeserializer.save_graph_moduleserialized_targetc                 C   s,   | d\}}|dd  }t| }||S )NrE  r    )split_deserialization_registryfrom_op_name)r  rP  rW  rZ  rY  r]   r]   r^   deserialize_extension_operatori  s   
z6GraphModuleDeserializer.deserialize_extension_operatorc                 C   s   | drt}|ddd  }n| dr"t}|ddd  }n| dr,| |S |S |}|D ]}t||s=|  S t||}q2|S )N	_operatorr2  r    rq   rF  )r3  rH  rQ  rq   rT  rQ  rT  )r  rP  r5  serialized_target_namesr   r  r]   r]   r^   deserialize_operatoro  s"   



z,GraphModuleDeserializer.deserialize_operatorr   r   c              	      sR   ddt jdtttttf  dt jf fdd}t j|i  j j	d}|||S )	z
        Parses and does bottom-up processing of sympy.Expr nodes,
        populating ShapeEnv & caching symbols as needed.
        Nr   r   r   c                    s   | j s	| js	| jr| S t| }| jD ]} | q| jv r% j| } n|  j|< t| tj	r@t
| tjtjfr@ j|  |d urQ|  jjvrQ j| |  j| }rd jj| |j|jd | S )N)Zcompiler_minZcompiler_max)Z
is_IntegerZis_FloatZ
is_Booleanr   r/  _parse_sym_exprsymbol_name_to_symbolrp   r   r   r   Zsymbol_is_typer   UNBACKED_INTUNBACKED_FLOATunbacked_symbolsadd	shape_envZ
var_to_valZadd_var_to_valsymbol_name_to_ranger:  Zconstrain_symbol_ranger   r   )r   r   r   r,  vrr-  r]   r^   _process_sym_expr  s.   



zBGraphModuleDeserializer._parse_sym_expr.<locals>._process_sym_expr)localsro   )
r   Exprr   r   r   r   r   Zsympifysympy_functionsrY  )r  r   r   ra  r   r]   r-  r^   rX    s   ."
z'GraphModuleDeserializer._parse_sym_exprr   c                 C   s   |j }|jdkr+|jd u rd }n|jjdksJ |jj }| |j|}| jj||dS |jdkr:t|tu s8J |S td|j d|j  )Nr   r   r   zSymInt has invalid field type  with value )	ra   r   r   rX  r   r^  Zcreate_symintnoder   rY   r  r   r   r   r   r]   r]   r^   deserialize_sym_int  s   


z+GraphModuleDeserializer.deserialize_sym_intc                 C   st   |j }|jdkr |jr|jjnd }| |j|}| jj||dS |jdkr.t|t	s,J |S t
d|j d|j  )Nr   r   r   z SymFloat has invalid field type re  )ra   r   r   r   rX  r   r^  Zcreate_symfloatnoderp   r   rY   rf  r]   r]   r^   deserialize_sym_float  s   

z-GraphModuleDeserializer.deserialize_sym_floatc                 C   s\   |j }|jdkr| |j}| j|S |jdkr"t|ts J |S td|j d|j  )Nr   r   zSymBool has invalid field type re  )	ra   r   rX  r   r^  Zcreate_symboolnoderp   r   rY   )r  r   r   r   r]   r]   r^   deserialize_sym_bool  s   

z,GraphModuleDeserializer.deserialize_sym_boolr   c              
      sz    j 0 tttjt fdd|jD t fdd|jD t|j	t
|j |jdW  d    S 1 s6w   Y  d S )Nc                 3   r  ro   rg  rc   r   r-  r]   r^   ru     r  zBGraphModuleDeserializer.deserialize_tensor_meta.<locals>.<genexpr>c                 3   r  ro   rj  rk  r-  r]   r^   ru     r  )r   r   r   )fake_tensor_moder   r   rq   Zempty_stridedr   r   r   r   r   _SERIALIZE_TO_TORCH_DTYPEr   r   )r  r   r]   r-  r^   r     s   $z/GraphModuleDeserializer.deserialize_tensor_metarq  c                 C   s   t j|j|jdS )Nr  )r%  r%   r  r  rr  r]   r]   r^   deserialize_script_obj_meta  s   z3GraphModuleDeserializer.deserialize_script_obj_metac                 C   s   |j dkr| j|jj S |j dkr| j|jj S |j dkr$| j|jj S |j dkr0| j|jj S |j dkr8|jS |j dkr@|j	S |j dkrH|j
S |j dkrOd S td	| )
Nr  r  r  r  r   r   r   r  z"Unable to deserialize output node )r   rL  r  r  r  r  r  r  r   r   r   rY   )r  r)  r]   r]   r^   deserialize_graph_output  s"   







z0GraphModuleDeserializer.deserialize_graph_outputserialized_graphc                 C   s  t d |j D ]\}}t d|| | |}t d|| || j|< q
|j D ]\}}t d|| | |}t d|| || j|< q,|j D ]\}}t d|| | 	|}t d|| || j|< qN|j
 D ]\}}	t d||	 | |	}
t d	||
 |
| j|< qp|j D ]\}}t d
| | || j|< qt d t|jD ]n\}}t d| |jdv r|jj}| j|}||_| || q|jdkr|jjdkr|jj}| j|}||_| || qtd|j d|jdv r| jj| jj}| j|}| ||jd< qtd| |jD ]+}z| |j}|  || W q! t!yL } ztd| dt"#  |d }~ww g }|j$D ]}t d| |%| &| qR|j'rvt(|dksqJ |d }nt)|}| j*|}|j'r|j+d jd |jd< nt)dd |j+d D |jd< | jjD ]"}|j,d }d urt-j.|d| j/| j0dd }r||jd< qt(| j0dksJ | jS ) Nz
[deserialize_graph]z([deserialize_tensor_meta] %s (input): %sz)[deserialize_tensor_meta] %s (output): %sz$[deserialize_sym_int] %s (input): %sz%[deserialize_sym_int] %s (output): %sz&[deserialize_sym_float] %s (input): %sz'[deserialize_sym_float] %s (output): %sz%[deserialize_sym_bool] %s (input): %sz&[deserialize_sym_bool] %s (output): %sz [deserialize_script_obj_meta] %sz
[deserialize graph nodes]z[deserialize input] %s)r  r  r  r  z Deserializing a constant symint z as an input)r   r   r   r  r  r   zInvalid input type zFailed deserializing node r.  z[deserialize output] %sr    r   c                 s   s,    | ]}t |tjjr|jd  n|V  qdS )r   N)rp   rq   r0  r<   r  r+  r]   r]   r^   ru   l  s
    
z<GraphModuleDeserializer.deserialize_graph.<locals>.<genexpr>r]   T)r^  pendingsimplifyunbacked_bindings)1r   r  r   ri   r   rM  r   rg  r   rh  r   ri  r   rn  r?  r   r   ra   r  rR  r  sync_fx_noder  rY   rz  r  r,  deserialize_inputr  r   rW  r   deserialize_noderm  r/  r0  r   r'  ro  r   r   r   r)  r/  r:  r   Z _free_unbacked_symbols_with_pathr^  r\  )r  rp  r  Ztensor_valuer;  Zsym_int_valueZint_valZsym_float_valueZ	float_valZsym_bool_valueZbool_valrq  r  input_Z	node_nameZplaceholder_nodeserialized_noder   rp  r   r)  Zoutput_noder   r   rs  r]   r]   r^   deserialize_graph  s   











z)GraphModuleDeserializer.deserialize_graphrx  r   c           
   
   C   s  dt fdd}|tv s|tjjjjkr1|jd jj	}| 
|j}| jd||i |}| || nt|tjjr| |j\}}| |j}g || R D ]}	t|	tjjrc|	jdkrc|	j| qOt|jdkrt|jd drt|d	d
r|jd jjnd }| jd||||}|  || |j| n>t|tjj!gt" R r||r|jd jjnd }| #||\}}| jd||||}|  || nt$d| dt%| |j| |j t&'d|j|j(|j)|j*|j+d |jdvrd|jvri |jd< d S d S d S )Nr   c                 S   s,   t | }|j}t|dkot|d jtjS )Nr    r   )r   r!  r   rp   r"  rq   r  )r   r  r!  r]   r]   r^   _is_single_tensor_return  s   zJGraphModuleDeserializer.deserialize_node.<locals>._is_single_tensor_returnr   r7  r  r    r  rD  Tz!Unsupported target type for node z: z)[deserialize_node] %s: %s(%s, {%s}) -> %sr   )r  r)  rc  ),r   rJ  rq   opsr7  itemr   r   ra   r  deserialize_sym_op_inputsr   rR  create_nodedeserialize_sym_op_outputsrp   rr   r9  deserialize_hoo_inputsdeserialize_metadatar8  r  r0  r<   rt   r  r8  r   rQ  rT  r  r  deserialize_outputsrs   r  deserialize_inputsrY   r   r   r  r   r/  rG  r:  )
r  rx  r   rz  r  r/  fx_noderG  r8  r   r]   r]   r^   rv    sh   



z(GraphModuleDeserializer.deserialize_noder  c                 C   sr  t d| |jdkrtjtjj| |jj	d dS |jdkr2tjtjj
tj|jj	jd|jjdS |jdkrMtjtjjtj|jj	jd|jj|jjdS |jdkretjtjjtj|jj	jd|jjdS |jd	krtjtjjtj|jj	j|jj	jd
|jjdS |jdkrtjtjjtj|jj	jdd dS |jdkrtjtjjtj|jj|  |jj!dd dS t"d| )Nz[deserialize_input_spec] %sr  rw  r,  r   r  rt  r   )rw  r,  r   r  r  r  r  r  r  r  zUnknown input spec )#r   r  r   r%  r.   r  r  deserialize_argument_specr  r,  r  rL   r  r  r  r  r   r  r  r  r  r  r  r%   r  r  r  r  rN   r  r  r  deserialize_constant_inputra   r#  )r  r  r]   r]   r^   deserialize_input_spec  sd   






	z.GraphModuleDeserializer.deserialize_input_specoc                 C   sZ  t d| |jdkrtjtjj| |jj	d dS |jdkr0tjtjj
tj|jj	jdd dS |jdkrHtjtjjtj|jj	jd|jjdS |jdkr`tjtjjtj|jj	jd|jjdS |jdkrxtjtjjtj|jj	jd|jjdS |jd	krtjtjjtj|jj	jd|jjdS |jd
krtjtjjtj|jj	jdd dS td| )Nz[deserialize_output_spec] %sr  r  r  rt  r  r  r  r  r  zUnknown output spec )r   r  r   r%  r>   r  r  r  r  r,  r  rL   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rN   r  r#  )r  r  r]   r]   r^   deserialize_output_spec  sX   






z/GraphModuleDeserializer.deserialize_output_specr  c                    s8   t d tj fdd|jD  fdd|jD dS )Nz
[deserialize_signature]c                    r*  r]   )r  )rc   r  r-  r]   r^   r   6  r.  zAGraphModuleDeserializer.deserialize_signature.<locals>.<listcomp>c                    r*  r]   )r  )rc   r  r-  r]   r^   r   7  r.  r  )r   r  r%  r2  r  r  r  r]   r-  r^   deserialize_signature3  s
   
z-GraphModuleDeserializer.deserialize_signaturerF  serialized_state_dictrz   r{   .r_  c              	   C   s  t d u sJ | a ztd tjdd| _tdd| jd| _i dtj	j
jjdtj	j
jjdtj	j
jjd	tj	j
jjd
tj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjdtj	j
jjtj	j
jjtj	j
jjtj	j
jjtj	j
jj tj	j
jj!d| _"i | _#t$|| _%| &|j'| _'i | _(t) | _*d\}}dd t+j,t+j-fD \}}	|r.|. D ]J\}
}|j/}|j0dkrt1d|}t2t3|t4 |j0| j(|
< |
5|rt6|
t7|d  }t1||}q|
5|	r-t6|
t7|	d  }t1||}qt8|d D ]	}t9| jj: q4t8|d D ]	}t9| jj; qD|d ur`t7|dkr`t$|| _<nd | _<| =|j> t?| j< | @|jA}W d    n	1 sw   Y  tBC| jD| j>}i }|jEFd }rtGH||d< tI|dri |d< |jJ. D ]\}}|jK|d |< q||_LtMjN|| j'|| j#t$|| j%| j<d W d a S d a w )!Nz
[deserialize]T)Zassume_static_by_defaultF)Zallow_fallback_kernelsZallow_non_fake_inputsr^  FloorDivModularIndexingWhere	PythonModModCleanDiv	CeilToInt
FloorToIntCeilDivLShiftRShiftPowByNaturalFloatPowFloatTrueDiv
IntTrueDiv!IsNonOverlappingAndDenseIndicatorTruncToFloat)
TruncToInt
RoundToIntRoundDecimalToFloatIdentity)r  c                 s   s    | ]}t | V  qd S ro   )r   )rc   r   r]   r]   r^   ru   t  s    
z6GraphModuleDeserializer.deserialize.<locals>.<genexpr>r   r    r   rj  r  )r-  rz  r  rJ  ry   rz   r{   )Or   r   r  r   ZShapeEnvr^  r   rl  rq   utilsZ_sympyZ	functionsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rd  rY  r   rz   r  rz  r_  rE  r\  r   r[  rZ  ri   r   r   maxr   r   r   r3  r   r   rangenextZunbacked_symfloat_counterZunbacked_symint_counterr{   ry  rR  r   deserialize_module_call_graphr  r%  _create_graph_module_for_exportr5  r8  r:  r   r   rQ  r  r  r  rW   rK  )r  rF  r  rz   r{   r_  Zcount_unbacked_symfloatZcount_unbacked_symintZunbacked_symfloat_prefixZunbacked_symint_prefixrd   r`  r   r  r*  r  r-  r  rj  type_fieldsr]   r]   r^   deserialize:  s   	
	













z#GraphModuleDeserializer.deserializer  r  c                 C   sL   || j v rtd| d||_|| j |< d|jvsJ | j| |jd< d S )NzNode z& has already been deserialized before.r   )rL  rY   r  r  rM  )r  r  r  r]   r]   r^   rt    s   

z$GraphModuleDeserializer.sync_fx_nodec                    s   t  fdd|D S )Nc                 3   s    | ]	}  |jV  qd S ro   )ru  r,  rc   inputr-  r]   r^   ru     r  zDGraphModuleDeserializer.deserialize_sym_op_inputs.<locals>.<genexpr>)r   )r  r   r]   r-  r^   r}    s   z1GraphModuleDeserializer.deserialize_sym_op_inputsc                    s2  t |j}dd |jD } fdd|jD }g }t }|D ]t}|j|v rK||j }	||j }
|
tjkr:||	 q|
tjkrKt	
|jsK|	||j< q|  oS|j }|r_|||j  qt	
|jr|jrjJ t|dkr|t }|t|  |||j  q|j|v r||j ||j< qt||fS )Nc                 S   s   i | ]}|j |jqS r]   )r  rw  r  r]   r]   r^   rf     s    z>GraphModuleDeserializer.deserialize_inputs.<locals>.<dictcomp>c                    s   i | ]
}|j  |jqS r]   )r  ru  r,  r  r-  r]   r^   rf     s    r   )r   rx  r   r   r  r"   r~  r'  r  keyword	iskeywordZhas_default_valuer  r   r  r  r  r   )r  r   rx  Zschema_argsZargument_kindsZactual_argsr/  rG  r  r,  rw  Zis_positionalr]   r-  r^   r    sB   









z*GraphModuleDeserializer.deserialize_inputsr   c                 C   sN   g }i }|D ]}|j dkr| |j||j < q|| |j qt||fS )zO
        For deserializing HOO inputs since HOOs do not have a schema.
        r  )r  ru  r,  r'  r   )r  r   r/  rG  rw  r]   r]   r^   r    s   
z.GraphModuleDeserializer.deserialize_hoo_inputsinpc                    sX   j } j}|dkrd S |dkrj jj S |dkr t j S |dkr)t j S |dkr2t	 j
 S |dkrrt|ts=J   |j tjj}W d    n1 sZw   Y  j|j| jjd|j|jdS |d	kr{t jS |d
kr jS |dkr jS |dkr jS |dkr jS |dkr jS |dkr jS |dkr jS t|trt |dkrg S |dkrчfdd|D }|S |dv rt|S |dv rfdd|D S |dkr fdd}tt!||S t"d  |dkr j#jjv rj j#j S j$ j#j S |dkr%% j&S t"d  )Nr  r  r  r  r  r  r  rt  r  r   r   r   r  r  r  r  r   r>  c                    s   g | ]} j |j qS r]   )rL  r  r+  r-  r]   r^   r   	  rg   z=GraphModuleDeserializer.deserialize_input.<locals>.<listcomp>)r  r  r  r  )r  r  r  c                    r*  r]   )deserialize_sym_argumentr+  r-  r]   r^   r   !	  r.  r  c                    s4   | j dkrd S | j dkrj| jj S td  )Nr  r  Unhandled argument )r   rL  ra   r  rY   r  r  r  r]   r^    deserialize_optional_tensor_args$	  s
   

zSGraphModuleDeserializer.deserialize_input.<locals>.deserialize_optional_tensor_argsr  r  r  )'ra   r   rL  r  r  rm  r  !_SERIALIZE_TO_TORCH_MEMORY_FORMATr  _SERIALIZE_TO_TORCH_LAYOUTr  rp   r+   rO  ry  rR  r%  r  r5  Zregister_moduler~  r   r  r   r   r   r  r  r  r  r  r  r   r  rY   r  rz   rW  r  )r  r  ra   Ztyp_	submoduleresultr  r]   r  r^   ru    sz   







z)GraphModuleDeserializer.deserialize_inputc                 C   sn   |j dkr
t|jS |j dkrt|jS |j dkrt|jS |j dkr(t|jS |j dkr/d S t	d| d)Nr   r   r  r   r  zUnhandled constant argument z to deserialize)
r   r   r   r   r   r   r  r   r   rY   )r  r  r]   r]   r^   r  9	  s   








z2GraphModuleDeserializer.deserialize_constant_inputc                 C   s   t |tr|jdkr|jS |jdkr| j|j S n1t |tr2|jdkr&|jS |jdkr1| j|j S nt |trJ|jdkr?|j	S |jdkrJ| j|j S t
d| )Nr   r  r   r   z Unknown symbolic argument type: )rp   rK   r   r   rL  r  rI   r   rE   r   rY   )r  Zsym_argr]   r]   r^   r  G	  s$   








z0GraphModuleDeserializer.deserialize_sym_argumentc                 C   s   |  |jd jj| d S )Nr   )rt  r   ra   r  )r  rx  r  r]   r]   r^   r  Y	     z2GraphModuleDeserializer.deserialize_sym_op_outputsc                 C   sB  t |jdkr	d S t |jdkrV|jd jdkrVd|jv rIt|ddsIg }|jd j}| |j}| |||d| t	||j
d< || j|j< d S | |jd jj| d S t |jdkrvt|jd jtttfrv| |jd jj| d S t |jdkr|jd jdkrd |j
d< || j|j d	 d S | || d S )
Nr   r    r  ztorch.ops.higher_orderrD  Tr   r  Z_unused)r   r   r   r   rT  r  r  r8  generate_getitemr   r  rL  r  rt  rp   ra   rK   rE   rI   r  _renamerR  Z_target_to_strdeserialize_multiple_outputs)r  rx  r  r;  r,  deserialized_metadatar]   r]   r^   r  \	  s4   


z+GraphModuleDeserializer.deserialize_outputsr,  rB  r  c                 C   s   t |tr	|j}nt |tr|j}nt |tr|j}n	tdt| | jj	dt
j||f|d}| || || j|  |j| d S )Nz+generate_getitem got unknown argument type r7  rt  )rp   rL   r  rK   r  rI   r#  r   rR  r~  rH  rI  rt  r'  rM  r  r8  )r  r;  r  r,  rB  r  r  individual_outputr]   r]   r^   r  	  s$   


z(GraphModuleDeserializer.generate_getitemc           	      C   s  t |D ]\}}t|tttfr| ||||| qt|ts!J |jdv r1| |||j|| q|jdv r_| j	
dtj||f}|g  | |d ||j| |j| |d |jd< q|jdkr| j	j
dtj||fdd}|d  d |jd< |j| qtd| d S )	N)r  r  r  )r>  r  r  r  r  r  r  r  r7  r  r   r  rt  z Unimplemented node output type: )r?  rp   rL   rK   rI   r  r!   r   ra   rR  r~  rH  rI  r'  generate_getitemsr  r8  NotImplementedError)	r  r;  r  r/  r  rB  r,  Zlist_outputr  r]   r]   r^   r  	  s:   






z)GraphModuleDeserializer.generate_getitemsc                 C   s   |  |j}g }t|jdkr4t|jd jtsJ t|jd jd ts'J | |||jd j	| n	| |||j| t
||jd< || j|j< d S )Nr    r   r   )r  r8  r   r   rp   ra   r  rL   r  r>  r   r  rL  r  )r  rx  r  r  r;  r]   r]   r^   r  	  s   z4GraphModuleDeserializer.deserialize_multiple_outputsr8  c                    s   i }| d }r||d< dtffdd}| d }r8dd  dd	 t fd
d|tD }||d< | d }r]g }|tD ]}	|	d\}
}||
||f qF||d< | d }rmt|t|d< | d }r{t||d< |S )Nrb  rP  c                    s   d }|  drtj}| ddd  }n|  dr%t}| ddd  }n | S |}|D ]}t||s9|   S t||}q.|S )Nztorch.nnr2  r   rq   r    )r3  rq   r   rQ  rW  rQ  rT  )rP  r5  rV  r   r  r-  r]   r^   deserialize_meta_func	  s   



zKGraphModuleDeserializer.deserialize_metadata.<locals>.deserialize_meta_funcrc  c                 S   s   | ||ffS ro   r]   )keyre  rf  r]   r]   r^   import_nn_module_stack
  s   zLGraphModuleDeserializer.deserialize_metadata.<locals>.import_nn_module_stackc                 S   s   g }d\}}d\}}t | D ]+\}}||v r|d7 }q||v r$|d8 }q|dkr9|dkr9|| ||  |d }q|| |d   t|dksKJ |S )N)r   r   )z[(z)]r    rd  r      )r?  r'  r   )r8  outstartrG  r  r	  endrH  r]   r]   r^   metadata_split
  s   

zDGraphModuleDeserializer.deserialize_metadata.<locals>.metadata_splitc                 3   s    | ]	} | V  qd S ro   r]   )rc   r|  )r  r  r]   r^   ru   
  s
    

z?GraphModuleDeserializer.deserialize_metadata.<locals>.<genexpr>rh  rd  ri  rj  )	r:  r   r   rQ  rk  r'  r   r   r   )r  r8  rn  rb  r  Znn_module_stack_strrc  Zsource_fn_st_strro  Zsource_fn_strr  Z
target_strZtorch_fn_strZ
custom_strr]   )r  r  r  r^   r  	  s,   z,GraphModuleDeserializer.deserialize_metadatar   c                 C   s   t d| |jdkrtj|jjdS |jdkr tj|jj	dS |jdkr-tj
|jj	dS |jdkr>tj|jj| |dS tjd| |dS )	Nz[deserialize_argument_spec] %sr  rt  r  r  r  r  r  )r   r  r   r%  rL   r  r  rK   r  r  rI   r  r  r  ru  r  r]   r]   r^   r  ,
  s   



z1GraphModuleDeserializer.deserialize_argument_specr  c                    sR   t j fdd|jD  fdd|jD t|jt|j|j }r%|dS d dS )Nc                    r*  r]   r  r  r-  r]   r^   r   =
  r  zMGraphModuleDeserializer.deserialize_module_call_signature.<locals>.<listcomp>c                    r*  r]   r  r  r-  r]   r^   r   @
  r  r  )r%  r9   r   r   r   r  r  r  r  r]   r-  r^   !deserialize_module_call_signature9
  s   

	z9GraphModuleDeserializer.deserialize_module_call_signaturer  c                    r  )Nz 
[deserialize_module_call_graph]c                    s.   g | ]}t j|j|jr |jnd dqS r  )r%  r8   r  rz  r  r  r-  r]   r^   r   L
  s    	zIGraphModuleDeserializer.deserialize_module_call_graph.<locals>.<listcomp>r  r  r]   r-  r^   r  H
  r   z5GraphModuleDeserializer.deserialize_module_call_graph)r   Nro   )NN)SrZ   r[   r\   dataclassesr   rK  r  r   r   rO  r   rT  rW  r   r   r   r   r   r   rc  rX  rJ   rq   rg  rH   rh  rD   ri  rM   r   r   r%   r%  rn  r0  r<   ro  r*   ry  r
   rv  r.   r  r>   r  r-   r2  r  r,   r   r   r|   r	   r   r   r   r  rt  r}  r  r  r:   r  r!   ru  r$   r  r  r  r  rL   rK   rI   r  r  r  r  r3  r  r9   r  r8   r  r]   r]   r]   r^   rW   A  s    
	(-

tO5/(
r	(L(



/
"D
c                   @   s   e Zd Zddeeeef  fddZdeeej	f deee
jf dee
je	f fdd	Z	dd
ddedeeeejf ef deeeejf ef deeeeejdf eeef f ef  dejf
ddZdS )rX   Nexpected_opset_versionc                 C   s8   i | _ |r| j | d| j vrtj | j d< d S d S r6  )r  r8  rq   r  r9  )r  r  r]   r]   r^   r  [
  s   
z$ExportedProgramDeserializer.__init__r_  rY  r   c                 C   sV   t d i }| D ]\}}|| }r"t d|| |||< qt d| q|S )Nz 
[deserialize_range_constraints]z([deserialize_range_constraints] %s -> %sz;Symbol %s did not appear in the graph that was deserialized)r   r  ri   r:  r   )r  r_  rY  r   rd   re   symbolr]   r]   r^   deserialize_range_constraintsb
  s   

z9ExportedProgramDeserializer.deserialize_range_constraintsF_unsafe_skip_version_checkrx   ry   rz   r{   .c                C   s   t |tsJ |j}|jtd kr)|jdkr|jdks)|s)td|j dt ddd |j D }t	 
|j||||}| ||j}	tj|j|jj|j|j|	|j|j|jdd |jD d		}
td
|
 |
S )Nr   zSerialized schema version z+ does not match our current schema version r2  c              	   S   s0   i | ]\}}|t t|jt t|jtqS r]   )r   r   r   Zmin_valr   Zmax_valrb   r]   r]   r^   rf   
  s    z;ExportedProgramDeserializer.deserialize.<locals>.<dictcomp>c                 S   r   r]   r   r=  r]   r]   r^   r   
  r   z;ExportedProgramDeserializer.deserialize.<locals>.<listcomp>)	rootrR  r
  ry   r   r  r{   rz   r@  z
[deserialize]: %s)rp   r'   r?  r:  rB   r;  rY   r   ri   rW   r  r-  r  rJ  r%  rR  rz  ry   r  r{   rz   r@  r   r  )r  rx   ry   rz   r{   r  versionr_  resr   r  r]   r]   r^   r  q
  sL   	"

z'ExportedProgramDeserializer.deserializero   )rZ   r[   r\   r   r   r   r   r  r   r   r   r   r  r'   r   rq   r   r|   r   r	   r%  r  r]   r]   r]   r^   rX   Y
  s.    
(rX   c                       s   e Zd Z fddZ  ZS )r   c                    s6   t |tr|jS t |trt|dS t |S )Nr   )	rp   r   ra   r|   base64	b64encoder   superr   )r  r  	__class__r]   r^   r   
  s
   

zEnumEncoder.default)rZ   r[   r\   r   __classcell__r]   r]   r  r^   r   
  s    r   c                    s   t  tr jt jiS t r fddt D S t  tr*dd  D S t  t	r8t	dd  D S t  t
rFdd   D S t  trc tjkrRdS  tj krZd	S  tjkrad
S  S  S )Nc                    s    i | ]}|j tt |j qS r]   )r  r   rT  )rc   fr  r]   r^   rf   
  s    z&_dataclass_to_dict.<locals>.<dictcomp>c                 S   r   r]   r   r  r]   r]   r^   r   
  r   z&_dataclass_to_dict.<locals>.<listcomp>c                 s   s    | ]}t |V  qd S ro   r  r  r]   r]   r^   ru   
      z%_dataclass_to_dict.<locals>.<genexpr>c                 S   s   i | ]	\}}|t |qS r]   r  rb   r]   r]   r^   rf   
  r  Infinityz	-InfinityNaN)rp   rS   r   r   ra   r  is_dataclassr  r  r   r   ri   r   r   r   nanr  r]   r  r^   r   
  s*   








r   r  c                 C   s   t jt| tdddS )NF)r   	allow_nanr   )r   r   r   r   r   r  r]   r]   r^   _to_json_bytes
  r  r  rx   r5  c                 C   sl   t | j t||| }W d    n1 sw   Y  t|jts%J t|j}t||j	|j
|j}|S ro   )r   r{   rV   rT   rp   rx   r'   r  rw   ry   rz   )rx   r5  r   Zserialized_programZ
json_bytesr   r]   r]   r^   rT   
  s   

rT   c                    s  t | trJ d|  dt| tkrt| j|S t| tjkrEtd t	| v rE|d u r1d S t	| }t
|dks>J t|d |S t | trt| trt |tsVJ t
|dks^J tt| }tt| }t |tsuJ | j| }| jd
i |t||iS t| r| d
i |}t| }t| D ]}|j}	t||	 t||	}
t||	|
 q|S t |trt
|dkr|S t	| d   fdd|D S t |trt	| d fdd	| D S | tkrt|S |S )NzUnresolved class type: 'z'.r   r   r    c                    s   g | ]}t  |qS r]   r   )rc   r_   )d_typer]   r^   r     r.  z&_dict_to_dataclass.<locals>.<listcomp>c                    s   i | ]
\}}|t  |qS r]   r  rb   )v_typer]   r^   rf     r  z&_dict_to_dataclass.<locals>.<dictcomp>r]   )rp   r   typing
get_originr   r   
__origin__r   r   get_argsr   
issubclassrS   r   r  iterr|  r  r}   r   r  r  get_type_hintsr  r  rT  setattrr  ri   r   )r   dataZty_argsr  _valueZ
field_typer  Z
type_hintsr  r  Znew_field_objr]   )r  r  r^   r   
  sH   "





r   Fr  r  c                C   sN   t | jtsJ | jd}t|}tt|}t|j	|| j
| j| j|dS )Nr   r  )rp   rx   r|   r   r   r   r   r'   rX   r  ry   rz   r{   )r   r  r  Zexported_program_strZexported_program_dictZserialized_exported_programr]   r]   r^   r    s   

r  c                    s  dt fdd  fddfdd}|j}t|tjks%J i fdd	}fd
d}D ]}|| q6|D ]}	|	jD ]}
||
 qEq@|D ]}	|	jD ]}||j qUqP|D ]}
||
 qa|D ]}	|	j  qktt	j
 tdd}tt	j tdd}tt	j tdd}tt	j tdd}tt	j tdd}d}|D ].}|jD ](}|j}|jdkrt|jjj|jjj|jj\|j_}d| |j_|d7 }qqt||||||j|d	fS )Nr  c                 S   s  | j dkrd S | j dkr| jS | j dkr| jS | j dkrd S | j dkr%d S | j dkr,d S | j dkr3d S | j dkr:d S | j d	krAd S | j d
krI| jS | j dkrQ| jS | j dkrY| jS | j dkra| jS | j dkrhd S | j dkrod S | j dkrvd S | j dkr}d S | j dkrd S | j dkrd S | j dkr| jS | j dkr| jS | j dkrd S | j dkr| j	S | j dkr| j
S | j dkrd S td|  )Nr  r  r>  r   r  r   r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  z+Unknown input type to the ExportedProgram: )r   r  r>  r  r  r  r  r  r  r  r  r#  r  r]   r]   r^   _get_argument&  sf   
























z*_canonicalize_graph.<locals>._get_argumentc                    s"   t |tsJ t|  | d S ro   )rp   r!   r  Ztree_map)r  r  )r  r]   r^   for_args]  s   z%_canonicalize_graph.<locals>.for_argsc                    s
  t G dd d}t i i g  i g }dtt fddD ]}fdd}
|| q!tD ]\}fdd	}|jD ]}
|| qC|g d
< q4tD ]\}	fdd}	|jD ]}
|	|j qiqWfdd}
	fddD ]}
|
| qdtf 
fdd}	 D ]\}|j
d
kr| qt d
krt \}} }|jD ]}
|
| q|| v sJ  jD ]}| }|j
d
ksJ | j
d8  _
|j
d
kr|| q؈ j  t d
ks|S )Nc                   @   s"   e Zd ZU ee ed< eed< dS )z6_canonicalize_graph.<locals>.sort_nodes.<locals>.EdgesoutsinsN)rZ   r[   r\   r  r   r}   r]   r]   r]   r^   Edgesb  s   
 r  r   c                 S   s   | d u rd S t | tr| jS t | tttfr,| jdkr| jS | jdv r%d S td|  t | t	rH| jdkr:| j
jS | jdkrAd S td|  t | trP| jS td|  )Nr  )r   r   r   Unknown argument type: r  r  zUnknown optional tensor type: )rp   rL   r  rK   rE   rI   r   r  r#  r=   r  r%   r  r]   r]   r^   r  n  s&   






z9_canonicalize_graph.<locals>.sort_nodes.<locals>.get_namec                    s    |  }r | d S d S ro   )r]  r  r   )r  graph_inputsr]   r^   	add_input  s   z:_canonicalize_graph.<locals>.sort_nodes.<locals>.add_inputc                    s(   |  }r| vsJ  |< d S d S ro   r]   r  )	def_tabler  rB  r]   r^   add_def  s   z8_canonicalize_graph.<locals>.sort_nodes.<locals>.add_defr   c                    sb   |  }r/| v rd S |vr|v sJ d S | }| j    jd7  _d S d S )Nr    )r  r'  r  )r  r   src)rz   r  edgesr  r  rB  r]   r^   add_edge  s   z9_canonicalize_graph.<locals>.sort_nodes.<locals>.add_edgec                    s,    |  }r|vsJ t |< d S d S ro   )r   r  )r  rankr]   r^   add_rank  s   z9_canonicalize_graph.<locals>.sort_nodes.<locals>.add_rankc                    s    | }|r| vr| S dS )Nr  r]   r  )rz   r  r   r]   r^   get_rank  s   z9_canonicalize_graph.<locals>.sort_nodes.<locals>.get_rankrB  c                    sB   fdd |  } fdd|j D }t|j|| f d S )Nc                    s   g   fdd|   S )Nc                    s     | S ro   )r'  r   )r  ranksr]   r^   <lambda>  s    zc_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.get_ranks.<locals>.<lambda>r]   )r  )r  r  )r  r^   	get_ranks  s   zQ_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.get_ranksc                    s   g | ]
}|j  |jfqS r]   )r  r,  r  r  r]   r^   r     r  zR_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.<listcomp>)r   heapqheappushr   )rB  r   Z	args_rank)
candidatesr  r  r   r  r^   add_candidate  s   z>_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidater    )r   rE  r   r   r?  r   r   r,  r   ri   r  r   r  heappopr'  r  clear)r   r  rn  r  r  r   r  r  r_  r  r  r  rp  r*  )rz   r  sorted_inputs)	r
  r  r  r  r  r  rB  r   r   r^   
sort_nodesa  s`   






z'_canonicalize_graph.<locals>.sort_nodesc                    s   fdd}| d u rd S t | tr|| j j| _d S t | tr1| jdkr/|| j j| _d S d S t | trG| jdkrE|| j j	| _d S d S t | t
r]| jdkr[|| j j| _d S d S t | trl|| j j| _d S td|  )Nc                    s@   dt   }|  vsJ | | < | |v sJ || ||< |S )Nr*  )r   pop)r  r  new_name
name_tabler]   r^   r    s   z8_canonicalize_graph.<locals>.rename_def.<locals>._renamer  r  )rp   rL   r  r   rK   r   r  r   rI   r   rE   r   r%   r   r#  )r  r  )rR  r  r]   r^   
rename_def  s(   







z'_canonicalize_graph.<locals>.rename_defc                    s   | d u rd S t | tr | j| j| _d S t | ttfr/| jdkr- | j| j| _d S d S t | trF| jdkrD | j| j| _d S d S t | t	r`| jdkr^ | j
j| j
j| j
_d S d S t | trp | j| j| _d S td|  )Nr  r  r  )rp   rL   r:  r  rK   rI   r   r  rE   r=   r  r%   r#  r  r  r]   r^   replace_use  s&   






z(_canonicalize_graph.<locals>.replace_user   r  r  Z_gr    )	r   r   r   r   r   r   r   r   r   )r!   r   r   r   r   r,  r8  r  r   sortedr   ri   rH  
itemgetterr   r   r   r   r   _canonicalize_graphr  rR  r  r*   r   )r  sorted_outputsrR  rz   r  Zsorted_nodesr  r  r  rG  r  Zsorted_tensor_valuesZsorted_sym_int_valuesZsorted_sym_float_valuesZsorted_sym_bool_valuesZsorted_custom_obj_valuescounterr   r  r*  r]   )r  rz   r  rR  r  r  r^   r  #  sv   7
w



	r  r%  rz   c                    s  t | } |p	t }tt| j tdd}tt| j	 tdd}t| j
jdd d}| j
j}| j
j}t|jt|jksDJ t|jt|jksPJ dtttt tf fdd}dtttt tf fdd	}ttt|j|j|d}	t|	dkrtd
d |	D  \}
}nd}
d}ttt|j|j|d}tdd |D  \}}t|
|||\}  fdd} fdd}|D ]| q|D ]| qtt|tt|t|d|d||| j| j| j dS )ak  
    Normalize a serialized ExportedProgram, so that different eager program which
    shares the same semantics can get a single representation on disk.

    This function canonicalizes an ExportedProgram by:

    1. Sorting nodes in topological order.
    2. Rename nodes to have unique names.
    3. Remove unstable fields.
    4. Aggregate the above program fields.
    5. Recurse in subgraphs.

    Args:
        ep (ExportedProgram): The ExportedProgram to canonicalize.
        constants (Optional[set[str]]): Set of constants names

    Returns:
        ExportedProgram: The canonicalized exported program.
    r   r  c                 S   s   | j S ro   )r  r  r]   r]   r^   r  `  s    zcanonicalize.<locals>.<lambda>r   c                 S   s   | \}\}}t |tsJ |jdkrdd |fS |jdkr#d|jj|fS |jdkr/d|jj|fS |jdkr;d|jj|fS |jd	krGd
|j	j
|fS |jdkrQdd |fS |jdkr]d|jj|fS td| )Nr     r  r    r   r   r  r  r     r  r   r     Unknown input type: )rp   r.   r   r  r  r   r  r  r  r  r  r  r  r#  )r  rB  _argr  r]   r]   r^   
rank_inputg  s"   








z canonicalize.<locals>.rank_inputc                 S   s   | \}\}}t |tsJ |jdkrdd |fS |jdkr!dd |fS |jdkr-d|jj|fS |jdkr9d|jj|fS |jdkrCd	d |fS |jd
krMdd |fS |jdkrWdd |fS td| )Nr  r  r  r  r    r  r  r  r  r  r   r  r   Unknown output type: )rp   r>   r   r  r  r  r  r#  )r  rB  r   r  r]   r]   r^   rank_output{  s"   











z!canonicalize.<locals>.rank_outputc                 s       | ]\}}|V  qd S ro   r]   rc   rB  r  r]   r]   r^   ru     r  zcanonicalize.<locals>.<genexpr>r]   c                 s   r$  ro   r]   r%  r]   r]   r^   ru     r  c                    s  t | tsJ | jdkrt| jj}|jdkr |j} |j |_d S |jdkrC|j}|jdkr5 |j |_d S |jdkr<d S t	d| |jdkrf|j
}|jdkrX |j |_d S |jdkr_d S t	d	| |jd
v rmd S t	d| | jdkr| jj} |j |_d S | jdkr| jj} |j |_d S | jdkr| jj} |j |_d S | jdkr| jj} |j |_d S | jdkr| jj} |j |_d S | jdkrd S t	d|  )Nr  r  r  r  r   Unknown sym_int type: r  r   Unknown sym_float type: )r  r   r   r   r  r  r  r  r   r  r  r  r  )rp   r.   r   r  r,  r  r  r  r  r#  r  r  r   r  r  r  )r  r,  r   r   r  Zt_custom_objtok)replace_tabler]   r^   replace_input  sT   














z#canonicalize.<locals>.replace_inputc                    s  t tsJ jdkrtjj}|jdkr |j} |j |_d S |jdkrC|j}|jdkr5 |j |_d S |jdkr<d S t	d| |jdkrf|j
}|jdkrX |j |_d S |jdkr_d S t	d	| |jd
v rmd S t	d| jdkrjj} |j |_d S jdkrjj} |j |_d S jdkrjj} |j |_d S jdkrj} |jj |j_ |j |_d S jdkr׈j} |jj |j_ |j |_d S jdkrjj} |j |_d S t	d )Nr  r  r  r  r   r&  r  r   r'  )r  r   r   r   r  r  r  r  r  r  r  r  r"  )rp   r>   r   r  r,  r  r  r  r  r#  r  r  r  r  r  r  r  r  )r  r,  r   r   r  gur(  r)  r  r]   r^   replace_output  sX   














z$canonicalize.<locals>.replace_outputr  )rR  rz  r  r>  )!copydeepcopyrE  r   r  r5  ri   rH  r  r   r-  r  rz  rR  r   r   r  r   r  r   r   r   r   r?  r}  r  r'   r,   r-   r  r?  r@  rA  )r%  rz   r5  r   r  rz  rR  r!  r#  Z
sorted_insr  r  Zsorted_outsr  r  Zsorted_graphr*  r.  r]   r-  r^   rD  G  s\   

72

rD  c                   @   sZ   e Zd ZdZedefddZedefddZedefdd	Zede	j
fd
dZdS )ExtensionHandlerz6
    Base class for handling extension operators.
    r   c                 C      t | j d)Nz  namespace() must be implementedr  r  r   r]   r]   r^   rW  &     zExtensionHandler.namespacec                 C   r2  Nz op_name() must be implementedr3  r   rt   r]   r]   r^   rX  *  r4  zExtensionHandler.to_op_namer  c                 C   r2  r5  r3  )r   r  r]   r]   r^   rS  .  r4  zExtensionHandler.from_op_namec                 C   r2  )Nz  op_schema() must be implementedr3  r6  r]   r]   r^   r   2  r4  zExtensionHandler.op_schemaN)rZ   r[   r\   __doc__classmethodr   rW  rX  rS  rq   ZFunctionSchemar   r]   r]   r]   r^   r1  "  s    r1  op_typeextension_handlerc                 C   s   t |tsJ d| d| tvsJ |  dt| tsJ | jds+| jdr-J | tvs5J |t| < |t| < dS )zJRegister custom de/serialization method for a node with non-standard type.zExpected ExtensionHandler, got r2  z is already registered.rq   builtinsN)	r  r1  r   rp   r   r[   r3  rW  rR  )r9  r:  r]   r]   r^   register_extension7  s   r<  c                   C   s   t t S ro   )r   r   r|  r]   r]   r]   r^   r  E  s   r  r   rR  ro   (  r  r/  r   r  r  ry  r   r   r  loggingr   rH  r/  r  collectionsr   r   
contextlibr   r   r   enumr   r   r	   r
   r   r   r   r   collections.abcr   r   rq   Ztorch.export.exported_programZexportrx   r%  Ztorch._export.verifierr   Ztorch._export.non_strict_utilsr   Z"torch._library.fake_class_registryr   Ztorch._subclasses.fake_tensorr   r   Ztorch.fx.experimentalr   Ztorch.utilsr   r  Ztorch.utils._pytreer   r   Ztorch.utils._sympy.numbersr   Ztorch.utils._sympy.symbolr   r   Ztorch.utils._sympy.value_rangesr   r  r   r  r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   unionrS   __all__	getLoggerrZ   r   r   rY   r   rk   r   r   r   ZMetaTyperI  rk  Zuint8ZBYTEZint8ZCHARZuint16ZUINT16Zint16ZSHORTZint32INTZint64LONGZfloat16ZHALFZfloat32FLOATZfloat64DOUBLEZ	complex32ZCOMPLEXHALFZ	complex64ZCOMPLEXFLOATZ
complex128ZCOMPLEXDOUBLEZBOOLZbfloat16ZBFLOAT16Zfloat8_e4m3fnZFLOAT8E4M3FNZfloat8_e5m2Z
FLOAT8E5M2r   rm  Z
sparse_cooZ	SparseCooZ
sparse_csrZ	SparseCsrZ
sparse_cscZ	SparseCscZ
sparse_bsrZ	SparseBsrZ
sparse_bscZ	SparseBscZ_mkldnnZstridedZStridedr   r  Zcontiguous_formatZContiguousFormatZchannels_lastZChannelsLastZchannels_last_3dZChannelsLast3dZpreserve_formatZPreserveFormatr  r  eqnelegeltgtnegpostruncZsym_notmulr]  subfloordivmodpowZsym_intZ	sym_floatZsym_iteZsym_maxZsym_minZsym_sqrttruedivand_rJ  anyrw   r   r   r   rc  r   r   r   r   r   r   r   r}   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rU   rV   rW   rX   JSONEncoderr   r   r  rT   r   r  r  rE  rD  r1  r<  r  r   rR  r]   r]   r]   r^   <module>   s  
$	4
	
"	
(

        F>        O	
)

  $& \
  