U
    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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mZmZmZmZ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*m+Z+ d d	l,m-Z- d d
l.m/Z0 d dl1m2Z2m3Z3 d dl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZc ddldmeZe dddddgZfegehZiG dd dejZkeeef dddZlee*eme j[ene jWe$j;f ZodZpe jqeUjre jseUjte jueUjve jweUjxe jyeUjze j{eUj|e j}eUj~e jeUje jeUje jeUje jeUje jneUje jeUjiZeleZe jeJje jeJje jeJje jeJje jeJje jeJje jeJjiZeleZe jeLje jeLje jeLje jeLjiZeleZe
je
je
je
je
je je je je je je jhZe
je
je
je
je
je
je jhZeG dd dZeG dd dZe<e jdd d!Zeeme j[f e[d"d#d$Zeene jWf eWd"d%d&Ze je^d'd(d)Zdaed ed*< e*d+d,d-Zeene*d.d/d0Zee ed1d2d3Zeeeef eed4f ef d5d6d7Zejed8d9d:Zejd;d<d=Zeeje5f eeeTf d>d?d@ZdAdB Ze jjendCdDdEZeendCdFdGZeG dHdI dIZG dJdK dKeԃZeG dLd dedMZeG dNd dedMZeG dOd dedMZeG dPd dedMZG dQdR dRejڃZdSdT Zdje$j=eeeemf  edUdVdZdWdX Zdkeeeeemf  e$j=dYdZd[Zee@eeef f d;d\d]Ze=e=d^d_d`ZG dadb dbZeee dcdddeZdfdg Zi Zeee ef edh< i Zeeef edi< dS )l    N)contextmanager)	dataclassfield)Enum)AnyCallablecastDictfinalIteratorListOptionalSetTupleUnionType)SchemaVersion)load_verifier)
FakeTensorFakeTensorMode)symbolic_shapes)_pytree)treespec_dumpstreespec_loads)ValueRanges   )-ArgumentBufferMutationSpecConstantInputSpecConstantValueCustomObjArgumentDeviceExportedProgramGradientToParameterSpecGradientToUserInputSpecGraphGraphArgumentGraphModuleGraphSignature	InputSpecInputToBufferSpecInputToCustomObjSpecInputTokenSpecInputToParameterSpecInputToTensorConstantSpecLayoutLossOutputSpecMemoryFormatModuleCallEntryModuleCallSignatureNamedArgumentNodeOptionalTensorArgument
OutputSpecOutputTokenSpecRangeConstraint
ScalarTypeSCHEMA_VERSIONSymBoolSymBoolArgumentSymExprSymExprHint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__ rS   rS   O/var/www/html/venv/lib/python3.8/site-packages/torch/_export/serde/serialize.pyrO   k   s   rO   dc                 C   s   dd |   D S )Nc                 S   s   i | ]\}}|j |qS rS   )value.0kvrS   rS   rT   
<dictcomp>p   s      z _reverse_map.<locals>.<dictcomp>itemsrU   rS   rS   rT   _reverse_mapo   s    r_   ;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)rP   rQ   rR   bytes__annotations__rS   rS   rS   rT   ra      s   
ra   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )_SerializedProgramrb   rc   rd   re   N)rP   rQ   rR   r"   rg   rf   rS   rS   rS   rT   rh      s   
rh   )rV   returnc                 C   s*   | j d krtj| jdS tj| j| j dS )Ntyperk   index)rm   torchdevicerk   rU   rS   rS   rT   deserialize_device   s    
rp   sri   c                 C   s   t | tjtfrt| r*tjt| dS t | tjs:t| jj	d krZtjt
t| dS tjt
t| tj| jj	dddS ntd|  dt|  dd S )Nas_intas_exprhintz,SymInt should be either symbol or int, got `` of type ``)
isinstancern   r@   intr   Zis_concrete_intcreateAssertionErrornoderx   r>   strr?   rO   rk   rr   rS   rS   rT   serialize_sym_int   s    
r   c                 C   s`   t | tjtfrBt| r*tjt| dS tjtt| ddS nt	d|  dt
|  dd S )Nas_bool)expr_strru   z.SymBool should be either symbol or bool, got `ry   rz   )r{   rn   r<   boolr   Zis_concrete_boolr}   r>   r   rO   rk   r   rS   rS   rT   serialize_sym_bool   s    
r   )tri   c              	   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   s   g | ]}t |qS rS   r   rY   rr   rS   rS   rT   
<listcomp>   s     z)serialize_tensor_meta.<locals>.<listcomp>rl   c                 S   s   g | ]}t |qS rS   r   r   rS   rS   rT   r      s     r   )dtypesizesrequires_gradro   stridesZstorage_offsetlayout)rC   _TORCH_TO_SERIALIZE_DTYPEr   shaper   r!   ro   rk   rm   Zstrider   _TORCH_TO_SERIALIZE_LAYOUTr   )r   rS   rS   rT   serialize_tensor_meta   s    r   _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)r{   rn   nn	Parameterr   jsondumps_dataclass_to_dictEnumEncoderencode_reconstruct_fake_tensor)r   is_parametertensor_metaZtensor_meta_bytesrS   rS   rT   _reduce_fake_tensor  s     r   )serialized_tensor_metar   ri   c                 C   sH   t | d}tt|}td k	s*tdt|}|rDtj	
|}|S )Nr   z)Need access to current deserializer state)r   loadsdecode_dict_to_dataclassrC   r   r~   deserialize_tensor_metarn   r   r   )r   r   Zjson_tensor_metar   r   rS   rS   rT   r     s    

r   )artifactri   c                 C   sZ   | d krdS t tjkstdz,tt t t }t	| | |
 W S tjt = X d S )N    z0Refusing to stomp on existing FakeTensor reducer)r   copyregdispatch_tabler~   pickler   ioBytesIOrn   savegetvalue)r   bufferrS   rS   rT   serialize_torch_artifact   s    r   .)
serializedc                 C   sV   t | ttfr| S t| dkr"i S t| }|d t|}t |ttfsRt	|S Nr   )
r{   dicttuplelenr   r   seekrn   loadr~   )r   r   r   rS   rS   rT   deserialize_torch_artifact6  s    


r   valadjustc                 C   s   | t jkrtjS | t j kr$tj S t| t jr8t| S tdt	| | | |dkr^t
| S |dkrpt| S td| d S )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 )sympyoomathinfr{   Integerr|   logwarningrk   r   r   RuntimeErrorr   rS   rS   rT   _sympy_int_to_intB  s"    
  

r   ri   c                 C   s.   | t jkrtjS | t j kr$tj S t| S N)r   r   r   r   r   )r   rS   rS   rT   _int_to_sympy_intZ  s
    
r   )range_constraintsri   c                 C   s   dd |   D S )Nc                 S   s0   i | ](\}}t |tt|jd t|jdqS )r   r   )r   r9   r   lowerupperrX   rS   rS   rT   r\   f  s    

z/serialize_range_constraints.<locals>.<dictcomp>r]   )r   rS   rS   rT   serialize_range_constraintsc  s    r   c                 C   sL   t | tjjr| jS t| tkr6tt|  t| S tdt|  d S )NzCannot find schema for )	r{   rn   _ops
OpOverload_schemark   _serialization_registry	op_schemar   )targetrS   rS   rT   _get_schema_from_targeto  s
    r   r   ri   c                 C   s,   t | }|j}t|dko*t|d jtjS )Nr   r   )r   returnsr   r{   	real_typern   
TensorType)r   schemar   rS   rS   rT   _is_single_tensor_returnw  s    r   c                 C   sD   t | }|j}t|dkrdS |d j}t|tjoBt| tjS )Nr   Fr   )	r   r   r   r   r{   rn   ListTypegetElementTyper   )r   r   r   return_typerS   rS   rT   _is_single_tensor_list_return}  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< 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_valuesFis_single_tensor_returncustom_obj_valuesN)rP   rQ   rR   r   listr   r   r   rg   r   r   r5   r   r   r	   r   rC   r   r@   r   r<   r   r   r   r    rS   rS   rS   rT   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)r{   r   	TypeErrorrP   rk   __new__r   )metaclsnamebases	classdictbrS   rS   rT   r     s    
zFinal.__new__N)rP   rQ   rR   r   rS   rS   rS   rT   r     s   r   c                   @   sB  e Zd Zejeej dddZedd Z	e
jjdddZe
jjdd	d
ZedddZe
jjdddZdd Zdd Ze
jjeeef dddZejedddZee dddZdNeee dddZee dd d!Zedd"d#Zedd$d%ZdOe e
j!j" e"d&d'd(Z#e$dd)d*Z%e&dd+d,Z'e&dd-d.Z(ej)e)d/d0d1Z*ej+e+d/d2d3Z,eje-d4d5d6Z.ej/e"d7d8d9Z0ej1e1d:d;d<Z2eej ee d=d>d?Z3e
jjee" dd@dAZ4e
jjee" ddBdCZ5eee"dDdEdFZ6e
jjee$ ddGdHZ7e
jj8e9dIdJdKZ:e
jj8e8dIdLdMZ;dS )PrK   )graph_signaturemodule_call_graphc                 C   s$   t  | _|| _|| _i | _i | _d S r   )r   graph_stater   r   custom_objsduplicate_getitem_nodes)selfr   r   rS   rS   rT   __init__  s
    zGraphModuleSerializer.__init__c                 c   s&   | j }t | _ z
d V  W 5 || _ X d S r   )r   r   r   ZsavedrS   rS   rT   save_graph_state  s
    
z&GraphModuleSerializer.save_graph_state)r   c                 C   s  |j dkstt|jd tjrNtjt|j	dd}t
|jd | jj|j	< nt|jd tjrjtdnt|jd tttttd fr| |jd }ndt|jd tjr|jd j}tjt|j	|dd}| |jd | jj|j	< ntd|jd  | jj| d S )	Nplaceholderr   r   	as_tensorz*SymInt graph input is not implemented yet.r   	class_fqnas_custom_objz Unimplemented graph input type: )opr~   r{   metarn   Tensorr   r}   rB   r   r   r   r   r@   r|   r   r   floatrk   serialize_inputepr    r  serialize_script_obj_metar   r   append)r   r   Zgraph_inputr  rS   rS   rT   handle_placeholder  s&    
z(GraphModuleSerializer.handle_placeholderc                    s   |j dkstt|jdks$td|jd }t|tjjrVd j_	 
|g j_n(t|ttfsht fdd|D  j_d S )Noutputr   z"FX.Node's args should have one argr   Tc                    s   g | ]}  |qS rS   )r  rY   argr   rS   rT   r     s     z7GraphModuleSerializer.handle_output.<locals>.<listcomp>)r  r~   r   argsr{   rn   fxr5   r   r   r  r   r   r   )r   r   Z	node_argsrS   r  rT   handle_output  s    
z#GraphModuleSerializer.handle_outputr   c                 C   sN   t |tr|S |jdr8|jdd}| d|j S |j d|j S d S )Nz
torch._opsz	torch.ops.)r{   r   rQ   
startswithreplacerP   )r   r   modulerS   rS   rT   serialize_operator  s    
z(GraphModuleSerializer.serialize_operatorc                 C   s.  |j dkst|jtjkrd S |jtkrt|jdks:t|jd }t	| 
|j| |j|jtj| |j|dg| |d}n|jtkrt|jdkst|jd }t	| 
|j| |j|jtj| |j|dg| |d}n.t|jtjjr6t	| 
|j| |j|j|j| || |d}nt|jtjjrzt	| 
|j| |j|j| || |d}nt|jtkr
|j}t|jtkstdt|j dtt|j }t	d	|  d
| |j | |j|j|j| || |d}nt!d|j d| j"j#$| d S )Ncall_functionr   r   
as_sym_int)r   r   r   metadataas_sym_boolzMiss z CustomOpHandler$:zSerializing z is not supported)%r  r~   r   operatorgetitem_SYM_INT_OPSr   kwargsr	  r5   r  serialize_sym_op_inputsr  r   r}   serialize_sym_int_outputr   serialize_metadata_SYM_BOOL_OPSserialize_sym_bool_outputr{   rn   r   r   serialize_inputsserialize_outputsHigherOrderOperatorserialize_hoo_inputsserialize_hoo_outputsrk   r   	namespaceop_namerO   r   r   r  )r   r   meta_valZex_nodeZcustom_op_handlerhandlerrS   rS   rT   handle_call_function  sj    











&z*GraphModuleSerializer.handle_call_functionc                 C   s   d S r   rS   )r   r   rS   rS   rT   handle_get_attr#  s    z%GraphModuleSerializer.handle_get_attrc                 C   sX   d }|j D ]H}|jtjks(t| d||jd kr
|d krD|}q
|j| j|j< q
|S )Nz is not a getitem noder   )usersr   r%  r&  r~   r  r   r   )r   r   rm   	user_nodeuserrS   rS   rT   _output_node_at_index&  s    
z+GraphModuleSerializer._output_node_at_index)r   ri   c           	         s   i }|j d }r||d< |j d }rXdd   fdd| D }t||d< |j d }rfdd|D }t||d< |j d	 }rtt||d	< |S )
Nstack_tracenn_module_stackc                 S   sJ   t | trt| dkst| \}}t |ts0tt |ts>t|d | S )N   ,)r{   r   r   r~   r   )r   pathtyrS   rS   rT   export_nn_module_stack:  s
    zHGraphModuleSerializer.serialize_metadata.<locals>.export_nn_module_stackc                    s"   g | ]\}}| d  | qS )r@  rS   rX   )rC  rS   rT   r   D  s    z<GraphModuleSerializer.serialize_metadata.<locals>.<listcomp>source_fn_stackc                    s(   g | ] }|d   d  |d  qS )r   r@  r   )r  )rY   Z	source_fnr  rS   rT   r   J  s   torch_fn)r	  getr^   ST_DELIMITERjoinr   )	r   r   retr=  r>  Znn_module_listsource_fn_stZsource_fn_listrE  rS   )rC  r   rT   r+  3  s"    


z(GraphModuleSerializer.serialize_metadatascript_obj_metari   c                 C   s   t |j|jdS Nr  )r    r   r  r   rL  rS   rS   rT   r  U  s    z/GraphModuleSerializer.serialize_script_obj_metac                 C   sD   g }t |j }t||D ] \}}|t|| |d q|S Nr   r  )inspect	signature
parameterskeyszipr  r4   r  )r   r  r  serialized_argsZ
args_namesZ	args_namer  rS   rS   rT   r)  ]  s    z-GraphModuleSerializer.serialize_sym_op_inputsNr   c              	   C   s   t |tjjft st|p i }g }t|}t|jD ]n\}}|j	|krp|
t|j	| ||j	 |jd q8|js8|t|k r8|
t|j	| || |jd q8q8|S rO  )r{   rn   r   r   allowed_registered_op_typesr~   r   	enumerate	argumentsr   r  r4   r  rk   
kwarg_onlyr   )r   r   r  r(  rV  r   i
schema_argrS   rS   rT   r.  f  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  |dqS ) rP  r4   r  rY   ar  rS   rT   r     s
   z>GraphModuleSerializer.serialize_hoo_inputs.<locals>.<listcomp>c                    s"   g | ]\}}t | |d qS )rP  r^  )rY   r   r`  r  rS   rT   r     s   )extendr^   )r   r  r(  r   rS   r  rT   r1    s    

z*GraphModuleSerializer.serialize_hoo_inputsc                 C   s&   t |tp$t |tjjo$|j| jjkS r   )r{   r|   rn   r  r5   r   r   r   r   r  rS   rS   rT   is_sym_int_arg  s    
z$GraphModuleSerializer.is_sym_int_argc                 C   s&   t |tp$t |tjjo$|j| jjkS r   )r{   r   rn   r  r5   r   r   r   rb  rS   rS   rT   is_sym_bool_arg  s    
z%GraphModuleSerializer.is_sym_bool_arg)arg_typeri   c              	      sN  dd l m  m} |j|jf t|tjjr|j	dkrt|j
tsHtt|jj|j
}t|tjrntdn\t|tjjr  |}W 5 Q R X tjt|j
|ddS td|j
 dt| n|rtjtj|jdd	S |rtjtj|jdd
S t|jd tj r@tjt |j|jd j!ddS |jj"krlj"|j }tjt#|ddS tjt#|jddS nt| r|$ }|d k	stdtjt#|ddS t|tj%rtjtjt|dd	S t|t&rtj|dS t|trtj|dS t|t'r*tj|dS t|t(rBtj|dS |d krXtjddS t|t)t*fr&t+|dkrp|d k	rZt|tj,r|- }t|tj.st|- }t|tj,r|- }t|tj/rtjg dS t|tj0rtjg dS t|tj1rtjg dS t|tj2r.tjg dS t|tj3rHtjg dS td| dnt45d tjg dS t6dd  |D rtjt)|dS t6d!d  |D rtjt)|dS t6d"d  |D rtjt)|dS t6d#d  |D r tjt)|dS t6d$d  |D r*tjd%d& |D d'S t6fd(d |D rg }	|D ]J}
t|
tjjrt|	7tj|
jd nt|
t'rJ|	7tj|
d qJtj|	d'S t6fd)d |D rg }	|D ]J}
t|
tjjr|	7tj|
jd nt|
t&r|	7tj|
d qtj|	d*S t6d+d  |D rpg }|D ],}
|
j	dkrNtd|7t#|
jd q6tj|dS t6d,d  |D rd-d. }tjt)t8||d/S t6 fd0d |D rtjd1d& |D dS t6 fd2d |D r
 fd3d.}tjt)t8||d/S td4d5d& |D  n$t|tj9rDtjt:| d6S t|tj;rjtjt<|j|j=d7d8S t|tj>rtjt?| d9S t|tj@rtjtA| d:S t|tjBjCr|Dd;r|Dd<std=| d>d?t+jE }|jE|< |F G }tjt ||dS t|tjHjIr8tjJ|d@S tdAt| d S )BNr   get_attrz?getattr nodes containing tensors should not appear in the graph)r   graph)as_graphzUnsupported getattr attribute z with type: as_namer  r!  r   r  r  r  r  zBuffer must have valid namer   	as_stringrs   as_floatrS   as_none)as_bools)as_ints)	as_floats)
as_strings
as_tensorsz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   s   | ]}t |tV  qd S r   )r{   r   r_  rS   rS   rT   	<genexpr>  s     z8GraphModuleSerializer.serialize_input.<locals>.<genexpr>c                 s   s   | ]}t |tV  qd S r   )r{   r|   r_  rS   rS   rT   rw    s     c                 s   s   | ]}t |tV  qd S r   )r{   r  r_  rS   rS   rT   rw    s     c                 s   s   | ]}t |tV  qd S r   )r{   r   r_  rS   rS   rT   rw    s     c                 s   s   | ]}t |tjV  qd S r   )r{   rn   r@   r_  rS   rS   rT   rw    s     c                 S   s   g | ]}t jt|d qS )ri  )rA   r}   r   r_  rS   rS   rT   r      s     z9GraphModuleSerializer.serialize_input.<locals>.<listcomp>)as_sym_intsc                 3   s   | ]}  |V  qd S r   )rc  r_  r  rS   rT   rw  "  s     c                 3   s   | ]}  |V  qd S r   )rd  r_  r  rS   rT   rw  +  s     )as_sym_boolsc                 s   s   | ]}t |tjjV  qd S r   )r{   rn   r  r5   r_  rS   rS   rT   rw  4  s     c                 s   s$   | ]}t |tjjtd fV  qd S r   )r{   rn   r  r5   rk   r_  rS   rS   rT   rw  >  s     c                 S   sH   | d krt jddS t| tjjr6t jt| jddS td|  d S NrS   ro  r  r  z!Unsupported list/tuple argument: )	r6   r}   r{   rn   r  r5   rB   r   rO   r`  rS   rS   rT   serialize_optional_tensor_args@  s    
zMGraphModuleSerializer.serialize_input.<locals>.serialize_optional_tensor_args)as_optional_tensorsc                 3   s   | ]}t | V  qd S r   )r{   r_  inductor_tensor_buffersrS   rT   rw  M  s     c                 S   s   g | ]}t | d qS )r  )rB   get_namer_  rS   rS   rT   r   P  s     c                 3   s"   | ]}t | td fV  qd S r   )r{   rk   r_  r~  rS   rT   rw  R  s    c                    sF   | d krt jddS t|  r4t jt|  ddS td|  d S rz  )r6   r}   r{   rB   r  rO   r{  r~  rS   rT   r|  V  s    
z&Unsupported list/tuple argument type: c                 S   s   g | ]}t |qS rS   rj   r_  rS   rS   rT   r   e  s     )as_scalar_typerl   )	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: )KZtorch._inductor.irZ	_inductorZirBufferZReinterpretViewr{   rn   r  r5   r  r   r   r~   getattrrg  Zowning_moduler
  rO   r'   r   serialize_graphr   r}   r&   rk   rc  rA   r   rd  r=   r	  r  r    r  r   rB   r  r@   r   r|   r  r   r   r   OptionalTyper   r   ZBoolTypeZIntTypeZ	FloatTypeZ
StringTyper   r   r   allr  mapr   r   ro   r!   rm   Zmemory_format!_TORCH_TO_SERIALIZE_MEMORY_FORMATr   r   _CScriptObjectZ_has_methodr   _typeZqualified_namer   r   r  )r   r  re  Zinductor_irattrrg  Z
dedup_namearg_nameZ	elem_typevaluesr`  rY  r|  custom_obj_namer  rS   )r  r   rT   r    sF   


 







z%GraphModuleSerializer.serialize_inputc                 C   s*   || j jkstt|| j j|< t|dS )Nr  )r   r   r~   r   rB   r   r   r5  rS   rS   rT   serialize_tensor_output  s    z-GraphModuleSerializer.serialize_tensor_outputc                 C   s,   || j jkstt|| j j|< tj|dS Nri  )r   r   r~   r   rA   r}   r  rS   rS   rT   r*    s    z.GraphModuleSerializer.serialize_sym_int_outputc                 C   s,   || j jkstt|| j j|< tj|dS r  )r   r   r~   r   r=   r}   r  rS   rS   rT   r-    s    z/GraphModuleSerializer.serialize_sym_bool_output)specri   c                 C   s  |j tjjkrt|jtjrt|jjtr>t	j
|jjd}nt|jjtr^t	j
|jjd}nnt|jjtr~t	j
|jjd}nNt|jjtrt	j
|jjd}n.|jjd krt	j
dd}ntd|jj dtj
t|jj|d	d
S tj
t| |jddS n|j tjjkrV|jd k	s"tt|jtjs6ttj
tt|jjd|jddS |j tjjkr|jd k	svtt|jtjst|jd k	sttj
tt|jjd|j|jddS |j tjjkr|jd k	stt|jtjsttj
tt|jjd|jddS |j tjjkrl|jd k	s2tt|jtjsFttj
t t|jj|jj!d|jddS |j tjj"krt|jtj#sttj
t$t#|jjdddS td| d S )Nrs   r   rk  rm  rS   ro  zUnhandled constant input z to serializer   rW   )constant_inputr  )
user_inputr  r  parameter_name)	parameter)r  buffer_name
persistent)r   )r  tensor_constant_name)tensor_constantr  )r  r  )
custom_objtokenUnknown argument kind: )%kindr  	InputKind
USER_INPUTr{   r  ConstantArgumentrW   r|   r   r}   r   r   r  rO   r)   r   r   rG   serialize_argument_spec	PARAMETERr   r~   rB   r-   BUFFERr  r*   CONSTANT_TENSORr.   
CUSTOM_OBJr    r+   r  TOKENrD   r,   )r   r  Zconstant_specrS   rS   rT   serialize_input_spec  s     

 z*GraphModuleSerializer.serialize_input_specc                 C   s  |j tjjkr(tjt| |jddS |j tjj	krdt
|jtjsHttjtt|jjdddS |j tjjkr|jd k	stt
|jtjsttjtt|jjd|jddS |j tjjkr|jd k	stt
|jtjsttjtt|jjd|jddS |j tjjkrV|jd k	s"tt
|jtjs6ttjtt|jjd|jd	d
S |j tjjkr|jd k	svtt
|jtjsttjtt|jjd|jd	dS |j tjjkrt
|jtjsttjtt|jjdddS td| d S )Nr  )user_outputr  )loss_output)r  r  )buffer_mutationr  )gradient_to_parameter)r  user_input_name)gradient_to_user_input)user_input_mutationr  r  )r  r  
OutputKindUSER_OUTPUTr7   r}   rH   r  r  LOSS_OUTPUTr{   rB   r~   r0   r   BUFFER_MUTATIONr   r   GRADIENT_TO_PARAMETERr#   GRADIENT_TO_USER_INPUTr$   USER_INPUT_MUTATIONrF   r  rD   r8   )r   r  rS   rS   rT   serialize_output_spec  sj    z+GraphModuleSerializer.serialize_output_specsigri   c                    s,   t  fdd|jD  fdd|jD dS )Nc                    s   g | ]}  |qS rS   )r  r   r  rS   rT   r     s     z=GraphModuleSerializer.serialize_signature.<locals>.<listcomp>c                    s   g | ]}  |qS rS   )r  r   r  rS   rT   r     s     input_specsoutput_specs)r(   r  r  r   r  rS   r  rT   serialize_signature  s    z)GraphModuleSerializer.serialize_signaturexri   c                 C   s   t |tjr tjt|jddS t |tjrBtjtj|jddS t |tjrZ| |j	S t |tj
r~tjt
|j|jddS tdd S )Nr  r  ri  r  r  r  TODO)r{   r  rB   r   r}   r   rA   r  r  rW   r    r  r~   r   r  rS   rS   rT   r  "  s    z-GraphModuleSerializer.serialize_argument_specmodule_call_signatureri   c                    s@   t  fdd|jD  fdd|jD t|jtt|jtdS )Nc                    s   g | ]}  |qS rS   r  rY   r  r  rS   rT   r   4  s    zIGraphModuleSerializer.serialize_module_call_signature.<locals>.<listcomp>c                    s   g | ]}  |qS rS   r  r  r  rS   rT   r   7  s    r   r   in_specout_spec)r3   r   r   r   r  rE   r  r   r  rS   r  rT   serialize_module_call_signature0  s    



z5GraphModuleSerializer.serialize_module_call_signaturer   ri   c                    s    fdd|D S )Nc                    s,   g | ]$}t |j|jr  |jnd dqS N)fqnrR  )r2   r  rR  r  rY   entryr  rS   rT   r   A  s   	zEGraphModuleSerializer.serialize_module_call_graph.<locals>.<listcomp>rS   r   r   rS   r  rT   serialize_module_call_graph>  s    
	z1GraphModuleSerializer.serialize_module_call_graphc                 C   s  |j dkr"t|jtjjft s&tt|j}|j	}t
|dkrFg S |jd }t|jrg }t|D ]D\}}| ||}|dk	r|jn|j d| }	|| |	| qftj|dgS t
|dkr| |j|gS g }
tt||D ]\}\}}|dkr.t|jtjtjfst|
tjdd	 qt|trt|jtjtjfsTt| ||}|dk	rp|jn|j d| }	|
| |	| qt|trTt|jtjrt|j tjst| ||}|dk	stg }t|D ]P\}}|dkrq| ||}|dk	s(td
| || |j| q|
tj|d qt|ttfr| ||}|dk	r|jn|j d| }	|
| |	| qtdt | d|!  q|
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   r   N_unused_ru  r   rS   ro  zNo user found at index zUnhandled output type z from node )"r  r{   r   rn   r   r   rW  r~   r   r   r   r	  r   rX  r<  r   r  r  r   r}   serialize_outputrU  r   r  r   r   r   r   r   r|   r@   
ValueErrorrk   format_node)r   r   r   r   r5  Ztensor_argsidxr	  r:  r   Zoutput_argumentsZreturn_schemar  r[  msub_user_noderS   rS   rT   r/  M  s    &




 


  

z'GraphModuleSerializer.serialize_outputsc                 C   s  |j d }t|trnt|dkrxt|d tjs6t| |d}|dk	rP|jn
|j d}t	j
| ||d gdgS g }t|D ]\}}| ||}t|tr6|dk	stg }t|D ]d\}	}
t|
tjstdt|
 d| ||	}|dk	r|jn|j d	|	 }|| ||
 q|t	j
|d q|dk	rF|jn|j d	| }|| || q|S | |j|gS dS )
zN
        For serializing HOO outputs since HOOs do not have a schema.
        r   r   r   NZ	_unused_0ru  z Serialize list output with type z nyir  )r	  r{   r   r   rn   r
  r~   r<  r   r   r}   r  rX  r   rO   rk   r  r  )r   r   r5  r:  r   r   r[  element_meta_valZtensorsjr  r  rS   rS   rT   r2    sB    


z+GraphModuleSerializer.serialize_hoo_outputs)r   r5  ri   c                 C   s   |d krt jddS t|tjr4t j| ||dS t|ttjfrXt j| ||dS t|tj	rxt j| 
||dS td| d S )NrS   ro  r  r  r!  zUnable to serialize output )r   r}   r{   rn   r
  r  r|   r@   r*  r<   r-  rO   r  rS   rS   rT   r    s    


z&GraphModuleSerializer.serialize_outputc           
      C   s   |j d }i }|jD ]6}|jtjks:td| d| d|j||jd < qt|D ]$\}}||krT|j d| ||< qTg }t|D ]\}}	|	| 
|| |	 q|S )Nr   z
User node z of z is incorrectr   r  )r	  r9  r   r%  r&  r~   r   r  rX  r  r  )
r   r   r5  Zidx_to_namer;  r  _arg_listr[  r  rS   rS   rT   _handle_getitem_users  s"    


z+GraphModuleSerializer._handle_getitem_users)graph_moduleri   c                 C   s   t |tjjst|jjD ]\}zt| d|j | W q t	k
rt } zt
d| d|  |W 5 d }~X Y qX qt| jj| jj| jj| jj| jj| jj| jj| jjdS )NZhandle_zFailed serializing node z in graph: )r   r   r   r   r   r   r   r   )r{   rn   r  r'   r~   rg  r   r  r  	ExceptionrO   r  r%   r   r   r   r   r   r   r   r   )r   r  r   erS   rS   rT   r     s(    z%GraphModuleSerializer.serialize_graphc                 C   s(   |  |}t|| | j| | jdS )Nrg  rR  r   )r  r'   r  r   r  r   )r   r  rg  rS   rS   rT   rJ   5  s    


zGraphModuleSerializer.serialize)N)N)<rP   rQ   rR   r  ExportGraphSignaturer   r2   r   r   r   rn   r  r5   r  r  r   r  r7  r8  r<  r	   r+  r    r  r4   r)  r   r.  r1  r   rc  rd  r   r  r   r  rB   r  rA   r*  r-  r)   r  r7   r  r(   r  ArgumentSpecr  r3   r  r  r/  r2  r  r  r'   r%   r  rJ   rS   rS   rS   rT   rK     sb   
B# " 
 cL8i:)	metaclassc                   @   s:   e Zd Zdeeeef  dddZej	e
dddZdS )	rL   N)opset_versionc                 C   s4   i | _ |r| j | d| j kr0tj | j d< d S NZaten)r  updatern   r  _get_max_operator_version)r   r  rS   rS   rT   r   A  s
    
z"ExportedProgramSerializer.__init__)rb   ri   c           
      C   s   |   t|j|j}||j}t|j}i }|j	 D ]\}}|||< q:|j
	 D ]\}}||ksjt|||< qVt|| j|ttd td d|jd}	t|	 t|	t|jt|t|jS )zS
        Args:
            exported_program: Exported Program to serialize
        r   r   )majorminorr  r  r   schema_versiondialect)	_validaterK   r   r   rJ   r  r   r   r   r^   rd   r~   r"   r  r   r;   r  canonicalizerh   r   rc   re   )
r   rb   Zgm_serializerserialized_graph_moduleZserialized_range_constraintsrd   ncr   Zserialized_eprS   rS   rT   rJ   H  s@     

z#ExportedProgramSerializer.serialize)N)rP   rQ   rR   r   r	   r   r|   r   r  r"   rh   rJ   rS   rS   rS   rT   rL   ?  s   c                   @   s  e Zd ZejG dd dZdd Zeed dddZ	e
d	d
dZeeeejf dddZeeeejf dddZeedddZeejdddZeeejjef  dddZeejjdddZee ddddZ!e"ej"dd d!Z#e$ej$d"d#d$Z%e&ej'd%d&d'Z(dRe)ee*e
ej+f e,f ee*e
e-f e,f eee.e.ej+d(f e*e
e-f f e,f  ee*e
e/j0f  ed)d*d+Z1e
ejjd,d-d.Z2d/d0 Z3ej4j5ed1d2d3Z6e7e8 d4d5d6Z9e:e-d7d8d9Z;e<e-d7d:d;Z=d<d= Z>eejjd>d?d@Z?eejjd>dAdBZ@eejjddCdDdEZAe*e
e
f e*e
e-f dFdGdHZBe:ejCdIdJdKZDeEejEdLdMdNZFe7eG e7ejG dOdPdQZHdS )SrM   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jf f ed< eeeejdf eeef f  ed< d	S )
zGraphModuleDeserializer.Resultr  rR  r   names_to_symbolsrc   rd   .re   N)rP   rQ   rR   rn   r  r'   rg   r  r  r   r2   r	   r   r   Symbolr   r
  r   r   r  r   r   r   rS   rS   rS   rT   Resulty  s   

r  c                 C   s(   i | _ i | _tj | _tj | _d S r   )	serialized_name_to_nodeserialized_name_to_metarn   r  r%   rg  r   Moduler  r  rS   rS   rT   r     s    z GraphModuleDeserializer.__init__Nr   c                 c   s^   | j | j| j| jf}tj | _ tj | _i | _i | _z
d V  W 5 |\| _ | _| _| _X d S r   )	rg  r  r  r  rn   r  r%   r   r  r   rS   rS   rT   save_graph_module  s$    
z)GraphModuleDeserializer.save_graph_moduleserialized_targetc                 C   sv   | dr"t}|ddd  }n&| drDt}|ddd  }n|S |}|D ] }t||sf|  S t||}qP|S )N	_operatorr  r   rn   )r  r%  splitrn   hasattrr  )r   r  r  serialized_target_namesr   r   rS   rS   rT   deserialize_operator  s    

z,GraphModuleDeserializer.deserialize_operatorrq   c                 C   s  |j }|jdkrN|jd kr"d }n|jjdks2t|jj }|j| jkrT| j|j }ntj|j| jd}|dd |j	D }t
|tjr|| jjkr|| j|j< |d k	r| j|| | j|j }r| jj||j|jd n^|| j|j< |j	}|D ]F}|j| jkr|| j|j< | j|j }r| jj||j|jd q| jj||dS |jdkrnt
|tsjt|S td|j d	|j  d S )
Nrv   rt   localsc                 S   s   i | ]}|t j|jd dqS )T)integer)r   r   r   r   rS   rS   rT   r\     s      z?GraphModuleDeserializer.deserialize_sym_int.<locals>.<dictcomp>)Zcompiler_minZcompiler_maxrw   zSymInt has invalid field type  with value )rW   rk   rx   r~   r   symbol_name_to_symbolr   sympifysubsfree_symbolsr{   r   	shape_envZ
var_to_valZadd_var_to_valsymbol_name_to_rangerF  Zconstrain_symbol_ranger   r   r   Zcreate_symintnoder|   rO   )r   rr   r   rx   symvrr  rS   rS   rT   deserialize_sym_int  sP    
		z+GraphModuleDeserializer.deserialize_sym_intc                 C   sf   |j }|jdkr.tj|j| jd}| j|S |jdkrJt|t	sFt
|S td|j d|j  d S )Nrv   r  r   zSymBool has invalid field type r  )rW   rk   r   r  r   r  r  Zcreate_symboolnoder{   r   r~   rO   )r   rr   r   exprrS   rS   rT   deserialize_sym_bool  s    

z,GraphModuleDeserializer.deserialize_sym_bool)r   ri   c              
      sj    j Z tttjt fdd|jD t fdd|jD t|j	t
|j dW  5 Q R  S Q R X d S )Nc                 3   s   | ]}  |V  qd S r   r  rY   r   r  rS   rT   rw    s     zBGraphModuleDeserializer.deserialize_tensor_meta.<locals>.<genexpr>c                 3   s   | ]}  |V  qd S r   r  r  r  rS   rT   rw  	  s     )ro   r   )fake_tensor_moder   r   rn   Zempty_stridedr   r   r   rp   ro   _SERIALIZE_TO_TORCH_DTYPEr   )r   r   rS   r  rT   r      s    z/GraphModuleDeserializer.deserialize_tensor_metarK  c                 C   s   t j|j|jdS rM  )r  r    r   r  rN  rS   rS   rT   deserialize_script_obj_meta  s    z3GraphModuleDeserializer.deserialize_script_obj_metac                 C   sx   |j dkr| j|jj S |j dkr0| j|jj S |j dkrH| j|jj S |j dkrX|jS |j dkrfd S td| d S )Nr  r  r"  rt   rp  z"Unable to deserialize output node )	rk   r  r  r   r  rj  r"  rt   rO   )r   r  rS   rS   rT   deserialize_graph_output  s    




z0GraphModuleDeserializer.deserialize_graph_output)serialized_graphri   c                 C   s   |j  D ]\}}| |}|| j|< q
|j D ]\}}| || j|< q2|j D ]\}}| || j|< qV|j D ]\}}| 	|| j|< qzt
|jD ]\}}	|	jdkr|	jj}
| j|
}|
|_| |
| q|	jdkr| jj| jj}
| j|
}| |	|jd< qtd|	 q|jD ]X}z| |j}| || W n4 tk
r| } ztd| |W 5 d }~X Y nX q(g }|jD ]}|| | q|j rt!|dkst"|d }nt#|}| j$|}|j r|j%d jd |jd< nt#dd	 |j%d D |jd< | jS )
N)r  r  r  )rt   rn  r   rp  rl  r   zInvalid input type zFailed deserializing node r   r   c                 s   s*   | ]"}t |tjjr|jd  n|V  qdS )r   N)r{   rn   r  r5   r	  r  rS   rS   rT   rw  i  s   z<GraphModuleDeserializer.deserialize_graph.<locals>.<genexpr>)&r   r^   r   r  r   r  r   r  r   r   rX  r   rk   rW   r   rg  r   sync_fx_noderR  r  r  deserialize_inputr	  rO   r   r  r   deserialize_noder  r   r  r!  r   r   r~   r   r  r  )r   r"  r   Ztensor_valuer5  Zsym_int_valueZsym_bool_valuerL  r[  input_Z	node_nameZplaceholder_nodeserialized_noder   r  r   r  Zoutput_noderS   rS   rT   deserialize_graph%  s`    




z)GraphModuleDeserializer.deserialize_graph)r'  r   ri   c                 C   s~  |t ks|tkrL|jd jj}| |j}| jd||i |}| 	|| nt
|tjjr| |j\}}t|jdkrt|jd dr|jd jjnd }| jd||||}| || |j| |j ntt
|tjjr,t|r|jd jjnd }| ||\}}| jd||||}| || ntd| dt| |j| |j |jdkrzd|jkrzi |jd< d S )	Nr   r  r   r  z!Unsupported target type for node z: )r   r  r>  )r,  r'  r   rW   rj  deserialize_sym_op_inputsr   rg  create_nodedeserialize_sym_op_outputsr{   rn   r   r0  deserialize_hoo_inputsr   r
  r  r   deserialize_outputsr	  r  deserialize_metadatar   r   r   deserialize_inputsrO   rk   r  )r   r'  r   r   r  fx_noder(  rS   rS   rT   r%  p  sT            z(GraphModuleDeserializer.deserialize_node)r[  ri   c                 C   sp  |j dkr(tjtjj| |jjd 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|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|jjjd	|jjdS |j d
kr&tjtjjtj|jjjdd dS |j dkr^tjtjjtj|jj| |jjdd dS t d| d S )Nr  r  r  r   r  r  r   )r  r  r   r  r  r  r  r  r  r  zUnknown input spec )!rk   r  r)   r  r  deserialize_argument_specr  r  r  rB   r  r   r  r  r   r  r  r  r  r  r  r    r  r  r  r  rD   r  r  r  deserialize_constant_inputrW   r~   )r   r[  rS   rS   rT   deserialize_input_spec  sd    



 	z.GraphModuleDeserializer.deserialize_input_spec)ori   c                 C   sV  |j dkr(tjtjj| |jjd dS |j dkrTt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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|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rDtjtjjtj|jjjdd dS td
| d S )Nr  r1  r  r  r  r  r  r  r  zUnknown output spec )rk   r  r7   r  r  r2  r  r  r  rB   r  r   r  r  r  r  r  r  r  r  r  r  r  r  rD   r  r~   )r   r5  rS   rS   rT   deserialize_output_spec  sV    




z/GraphModuleDeserializer.deserialize_output_specr  c                    s.   t j fdd|jD  fdd|jD dS )Nc                    s   g | ]}  |qS rS   )r4  )rY   r[  r  rS   rT   r     s     zAGraphModuleDeserializer.deserialize_signature.<locals>.<listcomp>c                    s   g | ]}  |qS rS   )r6  )rY   r5  r  rS   rT   r     s     r  )r  r  r  r  r  rS   r  rT   deserialize_signature  s    z-GraphModuleDeserializer.deserialize_signature.)r  serialized_state_dictrd   re   r  ri   c           
   	   C   s   t d kst| a ztjdd| _tdd| jd| _i | _t|| _	| 
|j| _i | _|r| D ]>\}}t|j}|jdkrtd|}tt||j| j|< qd|d k	rt|dkrt|| _nd | _| |j | |j}	tjt| j| j| j|	| jt|| j	| jdW S d a X d S )NT)Zassume_static_by_defaultF)Zallow_fallback_kernelsZallow_non_fake_inputsr  r?  r   )r  rR  r   r  rc   rd   re   )r   r~   r   ZShapeEnvr  r   r  r  r   rd   r7  rR  r  r^   r|   r   r   maxr   r   r   re   r(  rg  deserialize_module_call_graphr   rM   r  r  _create_graph_module_for_exportr  )
r   r  r8  rd   re   r  rZ   r  r   r   rS   rS   rT   deserialize
  sN    	



 
z#GraphModuleDeserializer.deserialize)r   r0  c                 C   sF   || j krtd| d|| j |< d|jks2t| j| |jd< d S )NzNode z& has already been deserialized before.r   )r  rO   r	  r~   r  )r   r   r0  rS   rS   rT   r#  A  s
    

z$GraphModuleDeserializer.sync_fx_nodec                    s   t  fdd|D S )Nc                 3   s   | ]}  |jV  qd S r   )r$  r  rY   inputr  rS   rT   rw  I  s     zDGraphModuleDeserializer.deserialize_sym_op_inputs.<locals>.<genexpr>)r   )r   r   rS   r  rT   r)  H  s    z1GraphModuleDeserializer.deserialize_sym_op_inputs)r   r'  c           	         s|   |j j} fdd|jD }g }i }|D ]F}|  o<|j }|rT|||j  q(|j|kr(||j ||j< q(t||fS )Nc                    s   i | ]}|j  |jqS rS   )r   r$  r  r=  r  rS   rT   r\   M  s    z>GraphModuleDeserializer.deserialize_inputs.<locals>.<dictcomp>)r   rY  r   Zhas_default_valuerZ  r  r   r   )	r   r   r'  Zschema_argsZactual_argsr  r(  r\  Zis_positionalrS   r  rT   r/  K  s    

z*GraphModuleDeserializer.deserialize_inputs)r   c                 C   sN   g }i }|D ]4}|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$  r  r  r   )r   r   r  r(  r&  rS   rS   rT   r,  ^  s    
z.GraphModuleDeserializer.deserialize_hoo_inputs)inpri   c              	      s^   j } j}|dkrd S |dkr.j jj S |dkr@t j S |dkrRt j S |dkrdt	 j
 S |dkrt|tszt " |j tjj}W 5 Q R X j|j| jjd|j|jdS |d	krt jS |d
k r jS |dkr jS |dkr jS |dkr" jS |dkr8 jS |dkrN jS t|tr t |dkrlg S |dkrg }|D ]}|!j|j  q~|S |dkrt|S |dkrʇfdd|D S |dkr fdd}tt"||S t#d  nZ|dkr6 j$jjkr(j j$j S j% j$j S |dkrL& j'S t#d  d S )Nrp  r  r  r  r  rh  rf  r  r  rt   rn  r   rl  r  r"  r   rv  )rr  rs  rq  rt  )rx  ry  c                    s   g | ]}  |qS rS   )deserialize_sym_argumentr  r  rS   rT   r     s     z=GraphModuleDeserializer.deserialize_input.<locals>.<listcomp>r}  c                    s8   | j dkrd S | j dkr&j| jj S td  d S )Nrp  r  Unhandled argument )rk   r  rW   r   rO   r{  r?  r   rS   rT    deserialize_optional_tensor_args  s
    

zSGraphModuleDeserializer.deserialize_input.<locals>.deserialize_optional_tensor_argsrA  r  r  )(rW   rk   r  r  r   r  r  !_SERIALIZE_TO_TORCH_MEMORY_FORMATr  _SERIALIZE_TO_TORCH_LAYOUTr  r{   r&   r~   r  r(  rg  r  r;  r  Zregister_moduler*  rp   r  rt   rn  r   rl  r@  r  r"  r   r   r  r  rO   r  rd   r  r  )r   r?  rW   Ztyp_	submoduleresultr  rC  rS   rB  rT   r$  k  sx    
















z)GraphModuleDeserializer.deserialize_inputc                 C   sr   |j dkrt|jS |j dkr(t|jS |j dkr<t|jS |j dkrPt|jS |j dkr^d S t	d| dd S )Nrt   rn  rl  r   rp  zUnhandled constant argument z to deserialize)
rk   r|   rt   r  rn  r   rl  r   r   rO   )r   r?  rS   rS   rT   r3    s    








z2GraphModuleDeserializer.deserialize_constant_inputc                 C   st   t |tr2|jdkr|jS |jdkrb| j|j S n0t |trb|jdkrL|jS |jdkrb| j|j S td| d S )Nrt   rj  r   z Unknown symbolic argument type: )	r{   rA   rk   rt   r  rj  r=   r   rO   )r   Zsym_argrS   rS   rT   r@    s    





z0GraphModuleDeserializer.deserialize_sym_argument)r'  r0  c                 C   s   |  |jd jj| d S r   )r#  r   rW   rj  r   r'  r0  rS   rS   rT   r+    s    z2GraphModuleDeserializer.deserialize_sym_op_outputsc                 C   s   t |jdkrd S t |jdkrJ|jd jdkrJ| |jd jj| d S t |jdkrt|jd jtt	fr| |jd jj
| d S | || d S )Nr   r   r  )r   r   rk   r#  r  r   r{   rW   rA   r=   rj  deserialize_multiple_outputsrH  rS   rS   rT   r-    s    
 z+GraphModuleDeserializer.deserialize_outputs)r'  r0  ri   c                    s    |j tjjtttf td fddtjjd fddg }t	|j
dkrt|j
d jtsttt|j
d jd tst|||j
d j n|||j
 t||jd	< |j|j< d S )
N)r0  r  r  c                    s|   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 r  r  )r{   rB   r   rA   rj  r~   rk   rg  r*  r%  r&  r#  r  r  r	  r  )r5  r0  r  r  r   Zindividual_output)deserialized_metadatar   rS   rT   generate_getitem  s     

zNGraphModuleDeserializer.deserialize_multiple_outputs.<locals>.generate_getitem)r0  c                    s   t |D ]\}}t|tr |j}t|ttfr>| ||| qt|ttfrj	dt
j||f}| g  | d || |j  | d |jd< qtd| qd S )Nr  r   z Unimplemented node output type: )rX  r{   r   rW   rB   rA   r   r   rg  r*  r%  r&  r  r	  r  NotImplementedError)r5  r0  r  r  r  Zlist_outputrJ  rK  generate_getitemsr   rS   rT   rO    s     

zOGraphModuleDeserializer.deserialize_multiple_outputs.<locals>.generate_getitemsr   r   r   )r.  r   rn   r  r5   r   rB   rA   r|   r   r   r{   rW   r   r~   rv  r   r	  r  r   )r   r'  r0  r5  rS   rN  rT   rI    s    
z4GraphModuleDeserializer.deserialize_multiple_outputs)r   ri   c                    s   i }| d }r||d< tdfdd}| d }rpdd  dd	 t fd
d|tD }||d< | d }rg }|tD ]$}	|	d\}
}||
||f q||d< | d }rt|t|d< |S )Nr=  r  c                    s   d }|  dr(tj}| ddd  }n,|  drJt}| ddd  }n
 | S |}|D ] }t||sr|   S t||}q\|S )Nztorch.nnr  r?  rn   r   )r  rn   r   r	  r  r
  r  )r  r  r  r   r   r  rS   rT   deserialize_meta_func0  s    



zKGraphModuleDeserializer.deserialize_metadata.<locals>.deserialize_meta_funcr>  c                 S   s   | ||ffS r   rS   )keyrA  rB  rS   rS   rT   import_nn_module_stackE  s    zLGraphModuleDeserializer.deserialize_metadata.<locals>.import_nn_module_stackc                 S   s   t dd| } t d| S )Nz\(.*?\)r]  z(?<!\()\s*,\s*(?!\())resubr	  )r   rS   rS   rT   metadata_splitN  s    zDGraphModuleDeserializer.deserialize_metadata.<locals>.metadata_splitc                 3   s   | ]} | V  qd S r   rS   )rY   item)rR  rU  rS   rT   rw  T  s   z?GraphModuleDeserializer.deserialize_metadata.<locals>.<genexpr>rD  r@  rE  )rF  r   r   r	  rG  r  r   )r   r   rI  r=  rP  Znn_module_stack_strr>  Zsource_fn_st_strrJ  Zsource_fn_strr   Z
target_strZtorch_fn_strrS   )rR  rU  r   rT   r.  +  s(    	z,GraphModuleDeserializer.deserialize_metadatar  c                 C   sn   |j dkrtj|jjdS |j dkr4tj|jjdS |j dkrVtj|j	j| 
|dS tjd| 
|dS d S )Nr  r  r  r  r  r]  )rk   r  rB   r  r   rA   r  rj  r  r  r$  r  rS   rS   rT   r2  f  s    


z1GraphModuleDeserializer.deserialize_argument_specr  c                    s>   t j fdd|jD  fdd|jD t|jt|jdS )Nc                    s   g | ]}  |qS rS   r2  r  r  rS   rT   r   t  s    zMGraphModuleDeserializer.deserialize_module_call_signature.<locals>.<listcomp>c                    s   g | ]}  |qS rS   rW  r  r  rS   rT   r   w  s    r  )r  r3   r   r   r   r  r  r  rS   r  rT   !deserialize_module_call_signaturep  s    

z9GraphModuleDeserializer.deserialize_module_call_signaturer  c                    s    fdd|D S )Nc                    s.   g | ]&}t j|j|jr" |jnd dqS r  )r  r2   r  rR  rX  r  r  rS   rT   r     s   	zIGraphModuleDeserializer.deserialize_module_call_graph.<locals>.<listcomp>rS   r  rS   r  rT   r:  ~  s    
	z5GraphModuleDeserializer.deserialize_module_call_graph)NN)IrP   rQ   rR   dataclassesr   r  r   r   r   r  r   r  r@   r   r|   rn   r  r<   r   r  rC   r   r   r    r  r   r   r  r5   r!  r%   r(  r   r%  r)   r4  r7   r6  r(   r  r7  r'   r	   r
  rf   r   r   r   r   r<  r#  r)  r   r   r/  r   r4   r,  r   r$  r   r3  r@  r+  r-  rI  r.  r  r2  r3   rX  r2   r:  rS   rS   rS   rT   rM   w  sf   	@K24.  (7L D ;c                   @   s   e Zd Zdeeeef  dddZeeej	f eee
jf ee
je	f dddZdeeeeejf ef eeeejf ef eeeeejdf eeef f ef  ejd	d
dZdS )rN   N)expected_opset_versionc                 C   s4   i | _ |r| j | d| j kr0tj | j d< d S r  )rZ  r  rn   r  r  )r   rZ  rS   rS   rT   r     s
    
z$ExportedProgramDeserializer.__init__)r  r  ri   c                 C   sD   i }|  D ]2\}}|| }r,|||< qtd| d q|S )NzSymbol z2 did not appear in the graph that was deserialized)r^   rF  r   r   )r   r  r  r   rZ   r[   symbolrS   rS   rT   deserialize_range_constraints  s    
z9ExportedProgramDeserializer.deserialize_range_constraints.)rb   rc   rd   re   ri   c           
      C   s   t |tst|j}|jtd krN|jdkr6|jdksNtd|j dt ddd |j	 D }t
 |j||||}| ||j}|j}	tj|j|jj|j|j||j|jt|j|jd	S )Nr   zSerialized schema version z+ does not match our current schema version r  c                 S   s*   i | ]"\}}|t t|jt|jqS rS   )r   r   r   Zmin_valZmax_valrX   rS   rS   rT   r\     s     z;ExportedProgramDeserializer.deserialize.<locals>.<dictcomp>)	rootrg  r   rc   r   r   re   Zverifierrd   )r{   r"   r~   r  r  r;   r  rO   r   r^   rM   r<  r  r\  r  r  r  rg  rR  rc   r   re   r   r  rd   )
r   rb   rc   rd   re   versionr  resr   Zmodel_opset_versionrS   rS   rT   r<    sB    "
z'ExportedProgramDeserializer.deserialize)N)N)rP   rQ   rR   r   r	   r   r|   r   r   r   r   r   r\  r"   r   rn   r
  rf   r   r   r  r<  rS   rS   rS   rT   rN     s   	 (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   )	r{   r   rW   rf   base64	b64encoder   superdefault)r   obj	__class__rS   rT   rd    s
    

zEnumEncoder.default)rP   rQ   rR   rd  __classcell__rS   rS   rf  rT   r     s   r   c                    s   t  tr jt jiS t r< fddt D S t  trTdd  D S t  t	rpt	dd  D S t  t
rdd   D S  S d S )Nc                    s:   i | ]2}|j d kr"t |jd ks|jtt |jqS r   )rd  r  r   r   )rY   fre  rS   rT   r\     s
   
  z&_dataclass_to_dict.<locals>.<dictcomp>c                 S   s   g | ]}t |qS rS   r   r  rS   rS   rT   r     s     z&_dataclass_to_dict.<locals>.<listcomp>c                 s   s   | ]}t |V  qd S r   rk  r  rS   rS   rT   rw    s     z%_dataclass_to_dict.<locals>.<genexpr>c                 S   s   i | ]\}}|t |qS rS   rk  rX   rS   rS   rT   r\     s      )r{   rI   rk   r   rW   rY  is_dataclassfieldsr   r   r   r^   rj  rS   rj  rT   r     s    





r   )rb   r  ri   c                 C   sT   t || }t|jtsttjt|jt	d}|
d}t||j|j|j}|S r   )rL   rJ   r{   rb   r"   r~   r   r   r   r   r   ra   rc   rd   re   )rb   r  Zserialized_programZjson_programZ
json_bytesr   rS   rS   rT   rJ     s      
c                    s  t | trtd|  dt| tjkrptd t| krp|d krHd S t| }t|dksbtt	|d |S t | trt
| trt |tstt|dksttt| }tt| }t |tst| j| }| jf |t	||iS t| rL| f |}t| }t| D ],}|j}	t	||	 t||	}
t||	|
 q|S t |trt|dkrj|S t| d   fdd|D S t |trt| d fdd	| D S |S )
NzUnresolved class type: 'z'.r?  r   r   c                    s   g | ]}t  |qS rS   r   )rY   rV   )d_typerS   rT   r   &	  s     z&_dict_to_dataclass.<locals>.<listcomp>c                    s   i | ]\}}|t  |qS rS   rn  rX   )v_typerS   rT   r\   )	  s      z&_dict_to_dataclass.<locals>.<dictcomp>)r{   r   r~   typing
get_originr   rk   get_argsr   r   
issubclassrI   r   nextiterrT  r  rg   r}   rY  rl  get_type_hintsrm  r   r  setattrr   r^   )r   dataZty_argsr  _valueZ
field_typere  Z
type_hintsri  r   Znew_field_objrS   )ro  rp  rT   r   
	  s@    "



r   )r   rZ  ri   c                 C   sJ   t | jtst| jd}t|}tt|}t	|
|| j| j| jS r`  )r{   rb   rf   r~   r   r   r   r   r"   rN   r<  rc   rd   re   )r   rZ  Zexported_program_strZexported_program_dictZserialized_exported_programrS   rS   rT   r<  -	  s    

r<  c              	      s  t ddd  fddfdd}|j}t|tjksHti fdd	}fd
d}D ]}|| qj|D ]}|jD ]}	||	 qq~|D ]}|jD ]}||j qq|D ]}	||	 q|D ]}|j  qt	t
j tdd}
t	t
j tdd}t	t
j tdd}d}|D ]\}|jD ]N}|j}|jdkrJt|jjj|jjj|jj|j_d| |j_|d7 }qJq@t|||
||jdfS )Nr{  c                 S   st  | 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rJd S | j dkrXd S | j dkrfd S | j dkrtd 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rd S | j dkrd S | j dk rd 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r0d S | j dkrB| jS | j dkrRd S | j dkrbd S td|  d S )Nrp  r  rv  rt   rr  rn  rs  rl  rt  r  rx  r  r  r  r  r   rq  r"  ry  rh  r}  r  r  z+Unknown input type to the ExportedProgram: )	rk   r  rv  r  rx  r"  ry  r}  r~   r{  rS   rS   rT   _get_argumentC	  s^    













z*_canonicalize_graph.<locals>._get_argumentc                    s"   t |tstt|  | d S r   )r{   r   r~   pytreeZtree_map)ri  r`  )r{  rS   rT   for_argsv	  s    z%_canonicalize_graph.<locals>.for_argsc                    s  t G dd d}t i i g  i g }tt ddd
D ]}fdd}	|| qBtD ]<\}fdd	}|jD ]}	|| q|g d
< qhtD ]4\}fdd}	|jD ]}	|	|j qqfdd}
fdd
D ]}	|
| qtd 	fdd}	 D ]\}|j
d
kr6| q6t d
kr
t \}} }|jD ]}	|
| q|| kst jD ]@}| }|j
d
kst| j
d8  _
|j
d
kr|| q j  qV|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)rP   rQ   rR   r   r|   rg   rS   rS   rS   rT   Edges{	  s   
r  r   c                 S   s   | d krd S t | tr| jS t | ttfrX| jdkr:| jS | jdkrHd S td|  nHt | tr| jdkrt| j	jS | jdkrd S td|  ntd|  d S )Nrj  )rt   r   Unknown argument type: r  rp  zUnknown optional tensor type: )
r{   rB   r   rA   r=   rk   rj  r~   r6   r  r{  rS   rS   rT   r  	  s"    





z9_canonicalize_graph.<locals>.sort_nodes.<locals>.get_namec                    s    |  }r | d S r   )addr`  rr   )r  graph_inputsrS   rT   	add_input	  s    z:_canonicalize_graph.<locals>.sort_nodes.<locals>.add_inputc                    s$   |  }r | kst  |< d S r   )r~   r  )	def_tabler  r  rS   rT   add_def	  s    z8_canonicalize_graph.<locals>.sort_nodes.<locals>.add_defr   c                    sR   |  }rN| kr$|ks t d S  | }| j   jd7  _d S )Nr   )r~   r~  r  r  )r`  rr   src)r  edgesr  r  r  rS   rT   add_edge	  s    z9_canonicalize_graph.<locals>.sort_nodes.<locals>.add_edgec                    s(    |  }r$|kst t|< d S r   )r~   r   r  r  rankrS   rT   add_rank	  s    z9_canonicalize_graph.<locals>.sort_nodes.<locals>.add_rankc                    s    |  }r| S dS d S )NrL  rS   r  r  rS   rT   get_rank	  s    z9_canonicalize_graph.<locals>.sort_nodes.<locals>.get_rank)r  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 r   )r  r  )r  ranksrS   rT   <lambda>	  r   zc_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.get_ranks.<locals>.<lambda>rS   )r[  )r}  r  )r  rT   	get_ranks	  s    zQ_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.get_ranksc                    s   g | ]}|j  |jfqS rS   rP  r_  r  rS   rT   r   	  s     zR_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidate.<locals>.<listcomp>)r   heapqheappushr   )r  r   Z	args_rank)
candidatesr}  r  r   r  rT   add_candidate	  s    z>_canonicalize_graph.<locals>.sort_nodes.<locals>.add_candidater   )r   setr   r   rX  r   r   r  r|   r^   r  r   r  heappopr  r~   r~  clear)r   r  rI  r[  r  r   r  r5  r;  r  r  r  r  r  )r}  sorted_inputs)	r  r  r  r  r  r  r  r   r  rT   
sort_nodesz	  sX    
	



z'_canonicalize_graph.<locals>.sort_nodesc                    s   fdd}| d krd S t | tr4|| j j| _nZt | trZ| jdkr|| j j| _n4t | tr| jdkr|| j j	| _nt
d|  d S )Nc                    s@   dt   }|  kst| | < | |ks.t|| ||< |S )Nr  )r   r~   pop)r  r  new_name
name_tablerS   rT   _rename	  s    z8_canonicalize_graph.<locals>.rename_def.<locals>._renamerj  r  )r{   rB   r   r   rA   rk   rj  r   r=   r   r~   )r`  r  )rg  r  rS   rT   
rename_def	  s    




z'_canonicalize_graph.<locals>.rename_defc                    s   | d krd S t | tr* | j| j| _nt | trR| jdkr | j| j| _ndt | trz| jdkr | j| j| _n<t | tr| jdkr | j	j| j	j| j	_nt
d|  d S )Nrj  r  r  )r{   rB   rF  r   rA   rk   rj  r=   r6   r  r~   r{  r  rS   rT   replace_use
  s    






z(_canonicalize_graph.<locals>.replace_user   rQ  rh  Z_gr   )r   r   r   r   r   r   r   )r   r   r   r~   r   r   r  r   r  r   sortedr   r^   r%  
itemgetterr   r   rk   _canonicalize_graphrh  rg  r   r%   r   )r  sorted_outputsrg  r  Zsorted_nodesr  r  r[  r  r5  Zsorted_tensor_valuesZsorted_sym_int_valuesZsorted_sym_bool_valuescounterr   r`  rS   )r{  r}  rg  r  r  rT   r  @	  sb    3r



  	r  )r  ri   c                    s  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s~tt|jt|jksttttt tf ddd}tttt tf ddd	}ttt|j|j|d}td
d |D  \}	}
ttt|j|j|d}tdd |D  \}}t|	||\}  fdd} fdd}|
D ]| q^|D ]| qrtt|tt|
t|d|d||| j| jdS )a,  
    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.

    Returns:
        ExportedProgram: The canonicalized exported program.
    r   r  c                 S   s   | j S r   )r  r  rS   rS   rT   r  c
  r   zcanonicalize.<locals>.<lambda>r   c                 S   s   | \}\}}t |tst|jdkr.dd |fS |jdkrFd|jj|fS |jdkr^d|jj|fS |jdkrvd|jj	|fS |jd	krd
|j
j|fS |jdkrdd |fS |jdkrd|jj|fS td| d S )Nr     r  r   r   r?  r     r     r  r   r     Unknown input type: )r{   r)   r~   rk   r  r  r   r  r  r  r  r  r  r   )r?  r  r  r  rS   rS   rT   
rank_inputj
  s"    








z canonicalize.<locals>.rank_inputc                 S   s   | \}\}}t |tst|jdkr.dd |fS |jdkrBdd |fS |jdkrZd|jj|fS |jdkrrd|jj|fS |jdkrd	d |fS |jd
krdd |fS |jdkrdd |fS td| d S )Nr  r  r  r  r   r  r  r  r  r  r?  r  r   Unknown output type: )r{   r7   r~   rk   r  r  r  r  )outr  r  r  rS   rS   rT   rank_output~
  s"    











z!canonicalize.<locals>.rank_outputc                 s   s   | ]\}}|V  qd S r   rS   rY   r  r[  rS   rS   rT   rw  
  s     zcanonicalize.<locals>.<genexpr>c                 s   s   | ]\}}|V  qd S r   rS   r  rS   rS   rT   rw  
  s     c                    sV  t tstjdkrjj}|jdkr>|j} |j |_n`|jdkr|j}|jdkrf |j	 |_	q|jdkrrqtd| n|jdkrd S td| njd	krj
j} |j |_njd
krjj} |j |_nrjdkrjj} |j |_nPjdkrd S jdkr4jj} |j |_njdkrDd S td d S )Nr  r  r  rj  rt   Unknown sym_int type: )rp  r   rt   rn  rl  r  r  r  r   r  r  r  r  )r{   r)   r~   rk   r  r  r  r   r  rj  r  r   r  r  )r?  r  r   rr   tokZreplace_tabler  rS   rT   replace_input
  sB    







z#canonicalize.<locals>.replace_inputc                    s  t tstjdkrjj}|jdkr>|j} |j |_n`|jdkr|j}|jdkrf |j	 |_	q|jdkrrqtd| n|jdkrd S td| njd	krj
j} |j |_n҈jd
krjj} |j |_njdkrjj} |j |_njdkr2j} |jj |j_ |j |_n`jdkrbj} |jj |j_ |j |_n0jdkrjj} |j |_ntd d S )Nr  r  r  rj  rt   r  )rp  rt   rn  rl  r  r  r  r  r  r  r  r  )r{   r7   r~   rk   r  r  r  r   r  rj  r  r  r  r  r  r  r  )r  r  r   rr   gur  r  rS   rT   replace_output
  sJ    







z$canonicalize.<locals>.replace_outputr  r  r  ) copydeepcopyr   r  r  r^   r%  r  r   r  r   rR  rg  r   r   r  r~   r   r  r   r|   r   r   rX  rU  r  r"   r'   r(   r   r  r  )r  r  r   r   rR  rg  r  r  Z
sorted_insr  r  Zsorted_outsr  r  Zsorted_graphr  r  rS   r  rT   r  L
  sZ    
    -*r  c                   @   s@   e Zd ZdZedd Zedd Zedd Zedd	 Zd
S )CustomOpHandlerz3
    Base class for handling custom operators.
    c                 C   s   t | j dd S )Nz  namespace() must be implementedrM  rg  r   rS   rS   rT   r3    s    zCustomOpHandler.namespacec                 C   s   t | j dd S )Nz op_name() must be implementedr  r   op_typerS   rS   rT   r4    s    zCustomOpHandler.op_namec                 C   s   t | j dd S )Nz op_type() must be implementedr  )r   r4  rS   rS   rT   r    s    zCustomOpHandler.op_typec                 C   s   t | j dd S )Nz  op_schema() must be implementedr  r  rS   rS   rT   r     s    zCustomOpHandler.op_schemaN)	rP   rQ   rR   __doc__classmethodr3  r4  r  r   rS   rS   rS   rT   r    s   


r  Z
op_handlerr  c                 C   s6   t | tstdt|  d| t|< | t|  < dS )z3Register custom de/serialization method for a node.zExpected CustomOpHandler, got r  N)r{   r  r~   rk   r   _deserialization_registryr3  r  rS   rS   rT   register_custom_op_handler"  s    r  c                   C   s   t t S r   )r   r   rT  rS   rS   rS   rT   rW  -  s    rW  r   r  )N)N)ra  r  r   rY  r  rQ  r   r   loggingr   r%  rS  rq  
contextlibr   r   r   enumr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   rn   Ztorch.export.exported_programZexportrb   r  Ztorch._export.serde.schemar   Ztorch._export.verifierr   Ztorch._subclasses.fake_tensorr   r   Ztorch.fx.experimentalr   Ztorch.utilsr   r|  Ztorch.utils._pytreer   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,   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   unionrI   __all__	getLoggerrP   r   r   rO   r_   r|   r   ZMetaTyperG  Zuint8ZBYTEZint8ZCHARZint16ZSHORTZint32INTZint64LONGZfloat16ZHALFZfloat32FLOATZfloat64DOUBLEZ	complex32ZCOMPLEXHALFZ	complex64ZCOMPLEXFLOATZ
complex128ZCOMPLEXDOUBLEZBOOLZbfloat16ZBFLOAT16r   r  Z
sparse_cooZ	SparseCooZ
sparse_csrZ	SparseCsrZ
sparse_cscZ	SparseCscZ
sparse_bsrZ	SparseBsrZ
sparse_bscZ	SparseBscZ_mkldnnZstridedZStridedr   rE  Zcontiguous_formatZContiguousFormatZchannels_lastZChannelsLastZchannels_last_3dZChannelsLast3dZpreserve_formatZPreserveFormatr  rD  mulr  rT  floordivmodZsym_intZ	sym_floatZsym_iteZsym_maxZsym_minZsym_sqrtr'  eqnelegeltgtZsym_notr,  ra   rh   ro   rp   r   r   r
  r   r   rg   r   rf   r   r   r   r   Exprr   r   r   r   r   r   r   r   r   r   rk   r   rK   rL   rM   rN   JSONEncoderr   r   rJ   r   r<  r  r  r  r  rW  r   r  rS   rS   rS   rT   <module>   s   8/
                        
 (

       (7      I	 %    B