o
    Ih$                    @   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]   Q/var/www/vscode/kcb/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sympyprintingrepr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   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   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   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   stridesstorage_offsetlayout)rM   _TORCH_TO_SERIALIZE_DTYPEr   shaper   r&   r   r   r   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_meta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   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)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   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   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   	node_argsr]   r9  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)  rG  	enumerate_output_node_name_at_indexr2  r,  r!   r   )r   rH  tensor_argsidxr)  r  r9  r]   r^   serialize_tensor_list_output;  s   zPGraphModuleSerializer.handle_call_function.<locals>.serialize_tensor_list_outputF)r   r  r  rE  is_hop_single_tensor_returnz* is not supported in export serialization.:#zSerializing z is not supported)0rt   r)  rG  r   r*  r  r   r;  kwargsoperatorgetitem_SYM_OPSrp   rq   rJ   rD   rH   r   r<   rC  serialize_sym_op_inputsserialize_outputserialize_metadatarr   rs   serialize_inputsserialize_outputsrF  r   _higher_order_opsaoti_call_delegater  hasattrgraphowning_modulegetattr	aoti_pathserialize_hoo_inputsserialize_hoo_outputsr   r   	namespace
to_op_namer   rY   r  r  r2  )r  r   rH  ex_noderI  serializable_argslowered_module_namelowered_modulerP  handlerrf  op_namer]   r9  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   rU  rV  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_)rs  r  )r  r   r   rq  r]   r]   r^   rM  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 )rw  r]   rb   )rz  r]   r^   r     s    z<GraphModuleSerializer.serialize_metadata.<locals>.<listcomp>source_fn_stackc                    s(   g | ]}|d   d  |d  qS )r   rw  r    )rC  )rc   	source_fnr9  r]   r^   r     s    torch_fncustomz-Failed to serialize custom metadata for node z with error )r)  rG  ri   ST_DELIMITERjoinr  r   r   	ExceptionrY   r  )r  r   retru  rv  nn_module_listsource_fn_stsource_fn_listr}  r~  er]   )rz  r  r^   rZ  ~  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  r  r]   r]   r^   r1    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  r7  r]   r]   r^   r         zAGraphModuleSerializer.serialize_sym_op_inputs.<locals>.<listcomp>r  r8  kind)rp   rq   rr   rs   r   	argumentsrW  r  inspect	signature
parameterskeyszipr2  r:   r/  r"   
POSITIONAL)r  rt   r;  
args_namesserialized_args	args_namer8  r]   r]   r^   rX    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    r  )rp   rq   r]  	torchbindCallTorchBindschemarr   rs   _registered_extension_typesr   rL  r  r  r2  r:   r/  r   r"   KEYWORD
kwarg_onlyr   r  )
r  r   r;  rT  r  r  objmethodi
schema_argr]   r]   r^   r[    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 ) r  )r:   r/  r"   r  rc   ar9  r]   r^   r     s    z>GraphModuleSerializer.serialize_hoo_inputs.<locals>.<listcomp>c                    s&   g | ]\}}t | |tjd qS )r  )r:   r/  r"   r  )rc   r  r  r9  r]   r^   r     s    )extendri   )r  r;  rT  r  r]   r9  r^   rd    s   


z*GraphModuleSerializer.serialize_hoo_inputsc                 C   s   t |tu pt|tjS ro   )r   r   rp   rq   rJ   r  r8  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   r<  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   r<  r<   r  r  r	  r  r]   r]   r^   is_sym_float_arg     
z&GraphModuleSerializer.is_sym_float_argc                 C   r  ro   )rp   r   rq   r<  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  r`  )as_graphzUnsupported getattr attribute z with type: as_namer#  as_sym_floatas_sym_boolr   r%  r'  r  r!  zBuffer must have valid namer   	as_stringr   r   Tas_none)as_bools)as_ints)	as_floats)
as_stringsrJ  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  r9  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  r9  r]   r^   ru     r  c                 3   r  ro   )r  r  r9  r]   r^   ru     r  c                 3   r  ro   )r  r  r9  r]   r^   ru     r  )as_sym_boolsc                 s   rn   ro   )rp   rq   r<  r<   r  r]   r]   r^   ru     rv   c                 s   s&    | ]}t |tjjtd fV  qd S ro   )rp   rq   r<  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  r  r!  z!Unsupported list/tuple argument: )	r=   r   rp   rq   r<  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 )r  )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()._custom_obj_)as_operatorzUnsupported argument type: z with schema arg_type )Ptorch._inductor.ir	_inductorirBufferReinterpretViewrp   rq   r<  r<   rt   r   r   rb  r`  ra  r+  rY   r,   r  serialize_graphr!   r   r+   r   r  rK   r  r  rI   r  rE   r)  r0  r%   r&  r  rL   r  TorchBindObjectget_real_obj_typequalified_namer  rJ   rH   r   r   r   r  r   r   OptionalTypegetElementTypeListTypeBoolTypeIntType	FloatType
StringType
TensorTyper   r   allr2  mapr   r   r   r&   r   memory_format!_TORCH_TO_SERIALIZE_MEMORY_FORMATr   r   _CScriptObject_has_methodrr   rs   rF  rC  )r  r8  r  inductor_irattrr`  
dedup_namearg_namearg_valr&  	elem_typevaluesr  r  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 )Nr  )r  r  r   rL   r  r  rH  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r8  )
user_inputr  r8  parameter_name)	parameter)r8  buffer_name
persistent)r   )r8  tensor_constant_name)tensor_constantr%  )r8  r  )
custom_objtokenUnknown argument kind: )(r   r*  r  r0  	InputKind
USER_INPUTrp   r8  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  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_outputr  )loss_output)r8  r  )buffer_mutationr  )gradient_to_parameter)r8  user_input_name)gradient_to_user_input)user_input_mutationr
  r  )r   r*  r  r0  
OutputKindUSER_OUTPUTr>   r   rR   r  r8  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                    r6  r]   )r  r   r9  r]   r^   r     r:  z=GraphModuleSerializer.serialize_signature.<locals>.<listcomp>c                    r6  r]   )r&  r   r9  r]   r^   r     r:  input_specsoutput_specs)r   r*  r-   r)  r*  r  r'  r]   r9  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)	Nr  r!  r  r#  r  r%  r'  TODO)rp   r0  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 r?  )field_names)r   r   pytreeSUPPORTED_SERIALIZED_TYPEScontextserialized_type_namer  r0  _fieldsrY   r;   children_specs)tsr4  r0  childr  store_namedtuple_fieldsr]   r^   r:    s&   





zIGraphModuleSerializer.serialize_treespec.<locals>.store_namedtuple_fields)r   rO   )r  treespecserialized_treespecr]   r9  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                    r6  r]   r  rc   r-  r9  r]   r^   r         
zIGraphModuleSerializer.serialize_module_call_signature.<locals>.<listcomp>c                    r6  r]   r?  r@  r9  r]   r^   r     rA  r  r  in_specout_specforward_arg_names)	r   r*  r9   r  r  r=  rC  rD  rE  r  r>  namesr]   r9  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)fqnr  )r8   rK  r  rH  rc   entryr9  r]   r^   r     s    	zEGraphModuleSerializer.serialize_module_call_graph.<locals>.<listcomp>r   r*  r  r  r]   r9  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  rR  return_typer]   r]   r^   _is_single_tensor_list_return&  s   

zNGraphModuleSerializer.serialize_outputs.<locals>._is_single_tensor_list_returnrD  r   r   rJ  r    NTr  zUnhandled output type z from node )%r	   r   rt   rp   r   rq   rr   rs   r  r   rR  r   r)  rL  rM  r2  r,  r!   r   rY  r  r  rS  r  r  r   r  r  r  rs  r   rJ   r   rH   
ValueErrorr   format_node)r  r   rU  r  rR  rH  rN  rO  r)  r  output_argumentsreturn_schemarq  r;  r  msub_user_node_nameuser_node_namer]   r]   r^   r\    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 nyirJ  rt  )r)  rp   r   rL  rs  r  rq   r+  rY   r   rM  r2  r,  r!   r   r  rY  )r  r   rH  r  r  element_meta_valrq  tensorsjrZ  r  r]   r]   r^   re  v  s*   


z+GraphModuleSerializer.serialize_hoo_outputsr  rH  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^   rY    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    rt  )
r)  rp  r   rU  rV  r  r;  rL  r2  r,  )
r  r   rH  idx_to_namerr  rO  _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)print_outputhandle_zFailed serializing node z in graph: 
 Original exception )	r  r  r  r  r	  r  r  r  r
  )rp   rq   r<  r,   r   r*  print_readabler`  r  rb  rt   r  rY   rW  	traceback
format_excr*   r  r  r  r  r	  r  r  r  r
  )r  rd  r   r  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 )Nr~  z%
[serialize_graph_module_metadata] %sz9Failed to serialize custom metadata for graph with error )rG  r   r*  r   r   r  rY   )r  r)  r  r~  r  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])r`  r  r  rE  r  )r   r*  r  r,   r,  r  rP  r  rk  r)  r  )r  rd  r`  r]   r]   r^   rT     s   




zGraphModuleSerializer.serializero   )BrZ   r[   r\   r0  ExportGraphSignaturer  r8   r  r   r  rq   r<  r<   r4  r>  r   rC  rn  ro  r   rs  rM  r   rZ  r%   r1  r:   rX  r	   r[  rd  r   r  r  r  r  r!   r/  rL   r,  rK   r-  rI   r  r  r.   r  r>   r&  r-   r,  ArgumentSpecr  r=  r9   rH  rP  r\  re  rY  rc  r,   r*   r  rk  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)ro  updaterq   r  _get_max_operator_versionr   )r  ro  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   r  r]   )dialectrc   re   r]   r]   r^   r   .  r  z7ExportedProgramSerializer.serialize.<locals>.<listcomp>rd  ro  r   schema_version	verifierstorch_versionF)in_place)validaterU   r  r  rT   rd  r   r   r  ri   rz   r'   ro  rC   rB   rz  rq   __version__canonicalizesetr  r   ry   r   r   r   r{   )r  rx   gm_serializerserialized_graph_moduleserialized_range_constraintsrz   ncr   serialized_epnew_state_dictr]   r]   r^   rT     sF   



z#ExportedProgramSerializer.serialize)rZ   r[   r\   DEFAULT_PICKLE_PROTOCOLr   r   r   r   r  r0  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.Resultrd  r  r  names_to_symbolsry   rz   .r{   N)rZ   r[   r\   rq   r<  r,   r}   r0  rl  r  r8   r   r   r   r   r   r+  r   r   r   r  r   r   r	   r]   r]   r]   r^   ResultC  s   
 
*r  r   Nc                 C   s(   i | _ i | _tj | _tj | _d S ro   )	serialized_name_to_nodeserialized_name_to_metarq   r<  r*   r`  r   ModulerB  r9  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   )	r`  rB  r  r  rq   r<  r*   r   r  r  r]   r]   r^   save_graph_moduleS  s2   z)GraphModuleDeserializer.save_graph_moduleserialized_targetc                 C   s,   | d\}}|dd  }t| }||S )NrR  r    )split_deserialization_registryfrom_op_name)r  r  rf  rm  rl  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	_operatorr?  r    rq   rS  )r@  rU  r  rq   r  r_  rb  )r  r  rB  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)compiler_mincompiler_max)
is_Integeris_Float
is_Booleanr   r;  _parse_sym_exprsymbol_name_to_symbolrp   r   r   r   symbol_is_typer   UNBACKED_INTUNBACKED_FLOATunbacked_symbolsadd	shape_env
var_to_valadd_var_to_valsymbol_name_to_rangerG  constrain_symbol_ranger   r   )r   r   r   r8  vrr9  r]   r^   _process_sym_expr  s.   



zBGraphModuleDeserializer._parse_sym_expr.<locals>._process_sym_expr)localsro   )
r   Exprr   r   r   r   r   sympifysympy_functionsr  )r  r   r   r  r   r]   r9  r^   r    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   r  r   r  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 r  )ra   r   r   r   r  r   r  create_symfloatnoderp   r   rY   r  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 r  )	ra   r   r  r   r  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   r  rc   r   r9  r]   r^   ru     r  zBGraphModuleDeserializer.deserialize_tensor_meta.<locals>.<genexpr>c                 3   r  ro   r  r  r9  r]   r^   ru     r  )r   r   r   )fake_tensor_moder   r   rq   empty_stridedr   r   r   r   r   _SERIALIZE_TO_TORCH_DTYPEr   r   )r  r   r]   r9  r^   r     s   $z/GraphModuleDeserializer.deserialize_tensor_metar  c                 C   s   t j|j|jdS )Nr%  )r0  r%   r  r&  r  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   r  r"  r  r$  r  r  r  r   r   r   rY   )r  r5  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 rg  z[deserialize output] %sr    r   c                 s   s,    | ]}t |tjjr|jd  n|V  qdS )r   N)rp   rq   r<  r<   r)  r7  r]   r]   r^   ru   l  s
    
z<GraphModuleDeserializer.deserialize_graph.<locals>.<genexpr>r]   T)r  pendingsimplifyunbacked_bindings)1r   r*  r  ri   r   r  r  r  r	  r  r  r  r  r  rL  r  r   ra   r  r`  r   sync_fx_noder  rY   r  r)  r8  deserialize_inputr)  r  r  r   deserialize_noder  ri  rj  r  r2  r  r
  r   r   r5  r;  rG  r    _free_unbacked_symbols_with_pathr  r  )r  r  r  tensor_valuerH  sym_int_valueint_valsym_float_value	float_valsym_bool_valuebool_valr  r  input_	node_nameplaceholder_nodeserialized_noder   r  r  r5  output_noder   r   r  r]   r]   r^   deserialize_graph  s   











z)GraphModuleDeserializer.deserialize_graphr  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   rR  r   rp   rS  rq   r  )r   r  rR  r]   r]   r^   _is_single_tensor_return  s   zJGraphModuleDeserializer.deserialize_node.<locals>._is_single_tensor_returnr   rD  r  r    r"  rQ  Tz!Unsupported target type for node z: z)[deserialize_node] %s: %s(%s, {%s}) -> %sr   )r   r5  rv  ),r   rW  rq   opsrq  itemr   r  ra   r  deserialize_sym_op_inputsr  r`  create_nodedeserialize_sym_op_outputsrp   rr   rF  deserialize_hoo_inputsdeserialize_metadatarE  r  r<  r<   rt   r)  rr  r   r_  rb  r"  r  deserialize_outputsrs   r  deserialize_inputsrY   r   r   r*  r   r;  rT  rG  )
r  r  r   r  r  r;  fx_noderT  rE  r-  r]   r]   r^   r    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  r  r8  r   r  r  r   )r  r8  r   r  r  r	  r%  r  r  r  zUnknown input spec )#r   r*  r   r0  r.   r  r  deserialize_argument_specr  r8  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  r  r  r  r  r  r  zUnknown output spec )r   r*  r   r0  r>   r  r   r  r  r8  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                    r6  r]   )r  )rc   r  r9  r]   r^   r   6  r:  zAGraphModuleDeserializer.deserialize_signature.<locals>.<listcomp>c                    r6  r]   )r  )rc   r  r9  r]   r^   r   7  r:  r(  )r   r*  r0  rl  r)  r*  r+  r]   r9  r^   deserialize_signature3  s
   
z-GraphModuleDeserializer.deserialize_signaturer  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)assume_static_by_defaultF)allow_fallback_kernels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   r~  r  )rd  r  r  r  ry   rz   r{   )Or   r   r*  r   ShapeEnvr  r   r  rq   utils_sympy	functionsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rz   r  r  r  r  r  r   r  r  ri   r   r   maxr   r   r   r@  r   r   rangenextunbacked_symfloat_counterunbacked_symint_counterr{   r  r`  r   deserialize_module_call_graphr  r0  _create_graph_module_for_exportrB  rE  rG  r   r   r_  r  r0  r)  rW   r  )r  r  r  rz   r{   r  count_unbacked_symfloatcount_unbacked_symintunbacked_symfloat_prefixunbacked_symint_prefixrd   r  r   r  ra  r  rd  r)  r~  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   )r  rY   r  r)  r  )r  r  r  r]   r]   r^   r    s   

z$GraphModuleDeserializer.sync_fx_nodec                    s   t  fdd|D S )Nc                 3   s    | ]	}  |jV  qd S ro   )r  r8  rc   inputr9  r]   r^   ru     r  zDGraphModuleDeserializer.deserialize_sym_op_inputs.<locals>.<genexpr>)r   )r  r  r]   r9  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  r  r  r]   r]   r^   rf     s    z>GraphModuleDeserializer.deserialize_inputs.<locals>.<dictcomp>c                    s   i | ]
}|j  |jqS r]   )r  r  r8  r  r9  r]   r^   rf     s    r   )r   r  r  r   r  r"   r  r2  r  keyword	iskeywordhas_default_valuer  r   r  r  r  r   )r  r   r  schema_argsargument_kindsactual_argsr;  rT  r  r8  r  is_positionalr]   r9  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  r  r8  r2  r   )r  r  r;  rT  r  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  r  r  r   r   r   r  r$  r  r  r   rK  c                    s   g | ]} j |j qS r]   )r  r  r7  r9  r]   r^   r   	  rg   z=GraphModuleDeserializer.deserialize_input.<locals>.<listcomp>)r  r  r  r  )r  r  r  c                    r6  r]   )deserialize_sym_argumentr7  r9  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   r  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   r  r"  r  r  r  !_SERIALIZE_TO_TORCH_MEMORY_FORMATr  _SERIALIZE_TO_TORCH_LAYOUTr  rp   r+   r  r  r`  r0  r	  rB  register_moduler  r   r  r   r   r   r  r  r$  r  r  r  r   r  rY   r(  rz   r  r  )r  r  ra   typ_	submoduleresultr  r]   r  r^   r    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   r  r  rI   r   rE   r   rY   )r  sym_argr]   r]   r^   r  G	  s$   








z0GraphModuleDeserializer.deserialize_sym_argumentc                 C   s   |  |jd jj| d S )Nr   )r  r  ra   r  )r  r  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_orderrQ  Tr   r  _unused)r   r  r   r   rb  r"  r  rE  generate_getitemr   r)  r  r  r  rp   ra   rK   rE   rI   r  _renamer`  _target_to_strdeserialize_multiple_outputs)r  r  r  rH  r8  deserialized_metadatar]   r]   r^   r  \	  s4   


z+GraphModuleDeserializer.deserialize_outputsr8  rO  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 rD  r  )rp   rL   r  rK   r  rI   r.  r   r`  r  rU  rV  r  r2  r  r)  rr  )r  rH  r  r8  rO  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  )rK  r  r  r  r  r  r  r  rD  r  r   r  r  z Unimplemented node output type: )rL  rp   rL   rK   rI   r(  r!   r   ra   r`  r  rU  rV  r2  generate_getitemsr)  rr  NotImplementedError)	r  rH  r  r;  r,  rO  r8  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  rE  r   r  rp   ra   r  rL   r.  rK  r   r)  r  r  )r  r  r  r,  rH  r]   r]   r^   r+  	  s   z4GraphModuleDeserializer.deserialize_multiple_outputsrE  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 )Nru  r  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.nnr?  r   rq   r    )r@  rq   r   r  r  r_  rb  )r  rB  r  r   r  r9  r]   r^   deserialize_meta_func	  s   



zKGraphModuleDeserializer.deserialize_metadata.<locals>.deserialize_meta_funcrv  c                 S   s   | ||ffS ro   r]   )keyrx  ry  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    rw  r      )rL  r2  r   )rE  outstartr  r  r  endr  r]   r]   r^   metadata_split
  s   

zDGraphModuleDeserializer.deserialize_metadata.<locals>.metadata_splitc                 3   s    | ]	} | V  qd S ro   r]   )rc   r  )r3  r8  r]   r^   ru   
  s
    

z?GraphModuleDeserializer.deserialize_metadata.<locals>.<genexpr>r{  rw  r}  r~  )	rG  r   r   r  r  r2  r   r   r   )r  rE  r  ru  r1  nn_module_stack_strrv  source_fn_st_strr  source_fn_strr  
target_strtorch_fn_str
custom_strr]   )r3  r8  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"  r  r$  r  r(  r  r  )r   r*  r   r0  rL   r"  r  rK   r$  r  rI   r  r  r(  r  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                    r6  r]   r  r@  r9  r]   r^   r   =
  rA  zMGraphModuleDeserializer.deserialize_module_call_signature.<locals>.<listcomp>c                    r6  r]   r?  r@  r9  r]   r^   r   @
  rA  rB  )r0  r9   r  r  r   rC  rD  rE  rF  r]   r9  r^   !deserialize_module_call_signature9
  s   

	z9GraphModuleDeserializer.deserialize_module_call_signaturer  c                    rI  )Nz 
[deserialize_module_call_graph]c                    s.   g | ]}t j|j|jr |jnd dqS rJ  )r0  r8   rK  r  r@  rL  r9  r]   r^   r   L
  s    	zIGraphModuleDeserializer.deserialize_module_call_graph.<locals>.<listcomp>rN  rO  r]   r9  r^   r  H
  rQ  z5GraphModuleDeserializer.deserialize_module_call_graph)r   Nro   )NN)SrZ   r[   r\   dataclassesr   r  r  r   r   r  r   r  r  r   r   r   r   r   r   r  r  rJ   rq   r  rH   r  rD   r  rM   r   r   r%   r0  r  r<  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  r:   r  r!   r  r$   r  r  r  r  rL   rK   rI   r(  r.  r+  r  rm  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 rp  )rB  rr  rq   r  rs  )r  rB  r]   r]   r^   r  [
  s   
z$ExportedProgramDeserializer.__init__r  r  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   rG  r   )r  r  r  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 r?  c              	   S   s0   i | ]\}}|t t|jt t|jtqS r]   )r   r   r   min_valr   max_valrb   r]   r]   r^   rf   
  s    z;ExportedProgramDeserializer.deserialize.<locals>.<dictcomp>c                 S   r   r]   r   rw  r]   r]   r^   r   
  r   z;ExportedProgramDeserializer.deserialize.<locals>.<listcomp>)	rootr`  r  ry   r   r  r{   rz   rz  z
[deserialize]: %s)rp   r'   ry  rt  rB   ru  rY   r   ri   rW   r  rd  rD  r  r0  r`  r  ry   r  r{   rz   rz  r   r*  )r  rx   ry   rz   r{   rF  versionr  resr   r$  r]   r]   r^   r  q
  sL   	"

z'ExportedProgramDeserializer.deserializero   )rZ   r[   r\   r   r   r   r   r  r   r   r   r   rD  r'   r   rq   r+  r|   r   r	   r0  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]   rO  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   rb  )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   rT  r@  r]   r]   r^   ru   
      z%_dataclass_to_dict.<locals>.<genexpr>c                 S   s   i | ]	\}}|t |qS r]   rT  rb   r]   r]   r^   rf   
  r  Infinityz	-InfinityNaN)rp   rS   r   r   ra   rA  is_dataclassr  r  r   r   ri   r   r   r   nanrS  r]   rS  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   rS  r]   r]   r^   _to_json_bytes
  r&  r[  rx   ro  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   ro  r   serialized_program
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   rA  rX  get_type_hintsr  r  rb  setattrr  ri   r   )r   dataty_argsr  _value
field_typer  
type_hintsrR  r  new_field_objr]   )r_  r`  r^   r   
  sH   "





r   FrE  rB  c                C   sN   t | jtsJ | jd}t|}tt|}t|j	|| j
| j| j|dS )Nr   rE  )rp   rx   r|   r   r   r   r   r'   rX   r  ry   rz   r{   )r   rB  rF  exported_program_strexported_program_dict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"  rK  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"  rK  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!   r1  tree_map)rR  r  )rr  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   
 rw  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]   ry  )	def_tabler  rO  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    )ru  r2  rv  )r  r   src)rz   r|  edgesr  rz  rO  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   ry  )r  rankr]   r^   add_rank  s   z9_canonicalize_graph.<locals>.sort_nodes.<locals>.add_rankc                    s    | }|r| vr| S dS )Nr  r]   ry  )rz   r  r  r]   r^   get_rank  s   z9_canonicalize_graph.<locals>.sort_nodes.<locals>.get_rankrO  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   )r2  r-  )r  ranksr]   r^   <lambda>  s    zc_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.get_ranks.<locals>.<lambda>r]   )r  )rt  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  r8  r  r  r]   r^   r     r  zR_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.<listcomp>)r  heapqheappushr   )rO  r   	args_rank)
candidatesrt  r  r  r  r^   add_candidate  s   z>_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidater    )r   r  r   r   rL  r  r  r8  r   ri   rv  r   r  heappopr2  ru  clear)r  rw  r  r  r{  r   r}  r  rr  r  r  r  r  ra  )rz   rt  sorted_inputs)	r  r|  r  r  r  rz  rO  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 )Nra  )r   pop)r  r  new_name
name_tabler]   r^   r)    s   z8_canonicalize_graph.<locals>.rename_def.<locals>._renamer  rx  )rp   rL   r  r  rK   r   r  r  rI   r	  rE   r  r%   r  r.  )r  r)  )r`  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"  rx  )rp   rL   rG  r  rK   rI   r   r  rE   r=   r"  r%   r.  r  r  r]   r^   replace_use  s&   






z(_canonicalize_graph.<locals>.replace_user   r2  r  _gr    )	r  r  r  r  r  r	  r  r
  r  )r!   r  r   r  r  r8  rE  r  r   sortedr  ri   rU  
itemgetterr  r	  r  r  r   _canonicalize_graphr  r`  r  r*   r
  )r  sorted_outputsr`  rz   r  sorted_nodesr  r  r  r  r  sorted_tensor_valuessorted_sym_int_valuessorted_sym_float_valuessorted_sym_bool_valuessorted_custom_obj_valuescounterr   r  ra  r]   )rr  rz   rt  r`  r  r  r^   r  #  sv   7
w



	r  r0  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   )rK  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  r4  r	     r  r   r     Unknown input type: )rp   r.   r   r  r  r   r  r  r  r	  r  r  r  r.  )r  rO  _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  r4  r  r  r    r  r  r  r  r  r   r  r   Unknown output type: )rp   r>   r   r  r  r  r  r.  )r5  rO  r  r  r]   r]   r^   rank_output{  s"   











z!canonicalize.<locals>.rank_outputc                 s       | ]\}}|V  qd S ro   r]   rc   rO  r  r]   r]   r^   ru     rU  zcanonicalize.<locals>.<genexpr>r]   c                 s   r  ro   r]   r  r]   r]   r^   ru     rU  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  r8  r"  r  r$  r  r.  r  r  r   r  r	  r  )r  r8  r   r   rR  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  r8  r"  r  r$  r  r.  r  r  r  r  r  r  r  r  )r5  r8  r   r   rR  gur  r  r  r]   r^   replace_output  sX   














z$canonicalize.<locals>.replace_outputr(  )r`  r  r  rx  )!copydeepcopyr  r   r  ro  ri   rU  r  r   rd  r  r  r`  r   r  r)  r  r*  r   r   r   r   rL  r  r  r'   r,   r-   r  ry  rz  r{  )r0  rz   ro  r   r  r  r`  r  r  
sorted_insr  r)  sorted_outsr  r*  sorted_graphr  r  r]   r  r^   r  G  s\   

72

r  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/  rP  r   r]   r]   r^   rf  &     zExtensionHandler.namespacec                 C   r  Nz op_name() must be implementedr  r   rt   r]   r]   r^   rg  *  r  zExtensionHandler.to_op_namer  c                 C   r  r  r  )r   r  r]   r]   r^   r  .  r  zExtensionHandler.from_op_namec                 C   r  )Nz  op_schema() must be implementedr  r  r]   r]   r^   r   2  r  zExtensionHandler.op_schemaN)rZ   r[   r\   __doc__classmethodr   rf  rg  r  rq   FunctionSchemar   r]   r]   r]   r^   r  "  s    r  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 r?  z is already registered.rq   builtinsN)	re  r  r   rp   r   r[   r@  rf  r  )r  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   r  ro   (  rL  r  r   rA  r  r  r   r   r  loggingr   rU  ri  ra  collectionsr   r   
contextlibr   r   r   enumr   r   r	   r
   r   r   r   r   collections.abcr   r   rq   torch.export.exported_programexportrx   r0  torch._export.verifierr   torch._export.non_strict_utilsr   "torch._library.fake_class_registryr   torch._subclasses.fake_tensorr   r   torch.fx.experimentalr   torch.utilsr   r1  torch.utils._pytreer   r   torch.utils._sympy.numbersr   torch.utils._sympy.symbolr   r   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   MetaTyper  r  uint8BYTEint8CHARuint16UINT16int16SHORTint32INTint64LONGfloat16HALFfloat32FLOATfloat64DOUBLE	complex32COMPLEXHALF	complex64COMPLEXFLOAT
complex128COMPLEXDOUBLEBOOLbfloat16BFLOAT16float8_e4m3fnFLOAT8E4M3FNfloat8_e5m2
FLOAT8E5M2r   r  
sparse_coo	SparseCoo
sparse_csr	SparseCsr
sparse_csc	SparseCsc
sparse_bsr	SparseBsr
sparse_bsc	SparseBsc_mkldnnstridedStridedr   r   contiguous_formatContiguousFormatchannels_lastChannelsLastchannels_last_3dChannelsLast3dpreserve_formatPreserveFormatr  r  eqnelegeltgtnegpostruncsym_notmulr  subfloordivmodpowsym_int	sym_floatsym_itesym_maxsym_minsym_sqrttruedivand_rW  anyrw   r   r   r   r  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  r  r  r  r  r  r   r  r]   r]   r]   r^   <module>   s  
$	4
	
"	
(

        F>        O	
)

  $& \
  