o
    ZhQ                     @   s  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m	Z	m
Z
mZmZ d dlmZmZ d dlZd dlm  mZ d dlmZ d dlmZmZmZ d dlmZmZmZ d dlm Z  d d	l!m"Z" d d
l#m$Z$ edej%ej&Z'G dd dej(Z)G dd dZ*e	de+Z,G dd dej-Z.G dd dZ/G dd dZ0G dd dZ1G dd dZ2G dd dZ3G dd dZ4G dd  d Z5G d!d" d"e5Z6G d#d$ d$e5Z7G d%d& d&e5Z8G d'd( d(e5Z9G d)d* d*e5Z:G d+d, d,Z;G d-d. d.Z<dS )/    N)abstractmethod)AnyCallableNewTypeOptionalTypeVarUnion)overrideSelf)TracingContext)
FakeTensorFakeTensorModeTensor)MetaConverterMetaTensorDescMetaTensorDescriberSymNode)ShapeEnv)no_dispatch	_SymNodeTc                	       s   e Zd ZdZdejddf fddZedede	e
def e	edf f fd	d
Zededee fddZededefddZedededefddZ  ZS )GraphPicklerzb
    GraphPickler is a Pickler which helps pickling fx graph - in particular
    GraphModule.
    filereturnNc                    s(   t  | tt | _tdd| _d S )NF)Z	copy_data)super__init___UnpickleStateTokenobject_unpickle_stater   _meta_tensor_describer)selfr   	__class__ F/var/www/auris/lib/python3.10/site-packages/torch/fx/_graph_pickler.pyr       s   zGraphPickler.__init__obj.c                 C   s   t |trt| |S t |tjjrt| |S t |tjj	tjj
fr)t| |S t |tr4t| |S t |tjr@t| |S t |tjjrMt| |S t |tjjrVJ t| | }r`|S tS N)
isinstancer   _TensorPickleDatareduce_helpertorchfxGraphModule_GraphModulePickleData_opsZOperatorBaseOpOverloadPacket_OpPickleDatar   _ShapeEnvPickleDataSymInt_SymNodePickleData_guardsr   _TracingContextPickleDataNode_TorchNumpyPickleDataNotImplemented)r    r%   reducer#   r#   r$   reducer_override-   s    

zGraphPickler.reducer_overridec                 C   s   || j u rdS d S )Nunpickle_state)r   )r    r%   r#   r#   r$   persistent_idX   s   
zGraphPickler.persistent_idc                 C   sF   t  }| |}|| | W  d   S 1 sw   Y  dS )z#
        Pickle an object.
        N)ioBytesIOdumpgetvalue)clsr%   streampicklerr#   r#   r$   dumps_   s
   

$zGraphPickler.dumpsdata	fake_modec                 C   sH   t |}t| }t||}| W  d   S 1 sw   Y  dS )z%
        Unpickle an object.
        N)_UnpickleStater=   r>   _GraphUnpicklerload)rE   rF   staterB   Z	unpicklerr#   r#   r$   loadsi   s
   
$zGraphPickler.loads)__name__
__module____qualname____doc__r=   r>   r   r	   r   tupler   r   r:   r   strr<   classmethodbytesrD   staticmethodr   rK   __classcell__r#   r#   r!   r$   r      s    *	 r   c                   @   s   e Zd ZdeddfddZdS )rG   rF   r   Nc                 C   s   || _ t | _d S r&   )rF   r   meta_converter)r    rF   r#   r#   r$   r   u   s   z_UnpickleState.__init__)rL   rM   rN   r   r   r#   r#   r#   r$   rG   t   s    rG   r   c                       sB   e Zd Zdejdeddf fddZededefdd	Z	  Z
S )
rH   rB   r;   r   Nc                    s   t  | || _d S r&   )r   r   r   )r    rB   r;   r!   r#   r$   r      s   
z_GraphUnpickler.__init__pidc                 C   s   |dkr| j S td)Nr;   zInvalid persistent ID)r   pickleUnpicklingError)r    rW   r#   r#   r$   persistent_load   s   
z_GraphUnpickler.persistent_load)rL   rM   rN   r=   r>   rG   r   r	   r   rZ   rU   r#   r#   r!   r$   rH      s    rH   c                   @   sx   e Zd ZU eeef ed< edede	de
eeege	f e
eef f fddZde	ddfd	d
Zdede	fddZdS )r1   rE   rC   r%   r   c                 C      | j | ||jffS r&   unpickler   rA   rC   r%   r#   r#   r$   r)      s   z!_ShapeEnvPickleData.reduce_helperenvNc                 C   s*   |j rJ |j | _| jd= | jd= d S )NZtracked_fakesZfake_tensor_cache)Z_translation_validation_enabled__dict__copyrE   )r    r_   r#   r#   r$   r      s   
z_ShapeEnvPickleData.__init__r;   c                 C   sB   |j sJ |j jsJ | j D ]\}}t|j j|| q|j jS r&   )rF   	shape_envrE   itemssetattr)r    r;   kvr#   r#   r$   r]      s
   
z_ShapeEnvPickleData.unpickle)rL   rM   rN   dictrQ   r   __annotations__rR   r   r   rP   r   r
   rG   r   r)   r   r]   r#   r#   r#   r$   r1      s   
 	r1   c                   @   sv   e Zd Zedededeeee	gef eee
f f fddZdeddfdd	Zdefd
dZde	dejfddZdS )r3   rC   r%   r   c                 C   s8   | |j |jf}t|tjrtj|fS tdt| )NzUnhandled SymNode type )	noder   r'   r*   r2   r3   unpickle_sym_intNotImplementedErrortype)rA   rC   r%   argsr#   r#   r$   r)      s   
z _SymNodePickleData.reduce_helperri   Nc                 C   s$   |j | _|j| _|j| _|j| _d S r&   )Z_exprexprrb   pytypeZ_hinthint)r    ri   r#   r#   r$   r      s   z_SymNodePickleData.__init__c                 C   s0   ddl m} | jd usJ || j| j| j| jS )Nr   r   )torch.fx.experimental.sym_noder   rb   rn   ro   rp   )r    r   r#   r#   r$   _to_sym_node   s   z_SymNodePickleData._to_sym_noder;   c                 C   s   t |  S r&   )r*   r2   rr   r    r;   r#   r#   r$   rj      s   z#_SymNodePickleData.unpickle_sym_int)rL   rM   rN   rR   r   r   rP   r   r
   rG   r   r)   r   r   rr   r*   r2   rj   r#   r#   r#   r$   r3      s    r3   c                   @   sx   e Zd ZU ee ed< edededee	e
egef ee
ef f fddZdededd	fd
dZdedefddZd	S )r(   metadatarC   r%   r   c                 C   s   | j | |j||jffS r&   )r]   r   r   r^   r#   r#   r$   r)      s   
z_TensorPickleData.reduce_helper	describertNc                 C   s|   | |}|jrt|jtjjjsJ tj|d d| _	t
jD ]}|dv r%qt| j	|d u s;J d| dt| j	| qd S )NrF   )rF   	view_funcz
not None: z: )Zdescribe_tensorrx   r'   r*   Z_subclassesZ
meta_utilsZ_FakeTensorViewFuncdataclassesreplacert   r   Z_UNSERIALIZABLEgetattr)r    ru   rv   rt   re   r#   r#   r$   r      s   

z_TensorPickleData.__init__r;   c                    sX   t j| j jd}dtg tjf dttjt	f dt
f fdd} j| jj|d d S )Nrw   make_meta_tdevicer   c                    s:   t   t j|  |W  d    S 1 sw   Y  d S r&   )r   r   rF   )r|   r}   r;   r#   r$   	with_fake   s   $z-_TensorPickleData.unpickle.<locals>.with_fake)ry   rz   rt   rF   r   r*   r   r   r}   rQ   r   rV   Zmeta_tensorrb   )r    r;   rt   r   r#   r~   r$   r]      s$   
z_TensorPickleData.unpickle)rL   rM   rN   r   r   rh   rR   r   rP   r   r
   rG   r   r)   r   r   r   r]   r#   r#   r#   r$   r(      s   
 
r(   c                   @   s   e Zd Zedededeeee	e
gef ee	ef f  fddZdededdfd	d
Zde
dedef fddZededee	 fddZdS )r7   rC   r%   r   c                 C   s"   |  | }r| j||jffS d S r&   )from_objectr]   r   )rA   rC   r%   rE   r#   r#   r$   r)   	  s   z#_TorchNumpyPickleData.reduce_helpermodnameNc                 C      || _ || _d S r&   )r   r   )r    r   r   r#   r#   r$   r        
z_TorchNumpyPickleData.__init__r;   .c                 C   s&   t t| j| j}tjjj	 | S r&   )
r{   	importlibimport_moduler   r   r*   _dynamo	variablesmiscZget_np_to_tnp_map)r    r;   npr#   r#   r$   r]     s   z_TorchNumpyPickleData.unpickletnpc                 C   s   t |sd S tjjj }z|| }sW d S W n
 ty#   Y d S w t|dd  }s.d}t|dd  }s8d S |tt	
||ksDJ | ||S )NrM   numpyrL   )callabler*   r   r   r   Zget_tnp_to_np_mapget	TypeErrorr{   r   r   )rA   r   Z	tnp_to_npr   r   r   r#   r#   r$   r     s    
z!_TorchNumpyPickleData.from_object)rL   rM   rN   rR   r   r   r   rP   r   r
   rG   r   r)   rQ   r   r]   r   r#   r#   r#   r$   r7     s"    r7   c                   @   sv   e Zd Zededejjdee	e
egejjf ee
ef f fddZdejjddfdd	Zd
edejjfddZdS )r-   rC   r%   r   c                 C   r[   r&   r\   r^   r#   r#   r$   r)   5  s   z$_GraphModulePickleData.reduce_helpergmNc                 C   sF   t |tjjjr| }n| }|j | _	| j	d= t
|j| _d S )N_graph)r'   r*   r+   Z_lazy_graph_moduleZ_LazyGraphModuleZ_real_recompileZ	recompiler`   ra   gm_dict_GraphPickleDatar   graph)r    r   Z_python_coder#   r#   r$   r   A  s   
z_GraphModulePickleData.__init__r;   c                 C   s.   t jjt jj}| j|_| j|||_|S r&   )	r*   r+   r,   __new__r   r`   r   r]   r   )r    r;   r   r#   r#   r$   r]   K  s   z_GraphModulePickleData.unpickle)rL   rM   rN   rR   r   r*   r+   r,   rP   r   r
   rG   r   r)   r   r]   r#   r#   r#   r$   r-   4  s    

r-   c                   @   s`   e Zd Zdejjdeejjd f ddfddZdejjded ejjf de	dejjfd	d
Z
dS )_NodePickleDatari   mappingr   Nc                    sn   t tjj fdd|j| _t tjj fdd|j| _|j| _|j| _t	
|j| _|j| _|j| _d S )Nc                        |  S r&   r#   nr   r#   r$   <lambda>V      z*_NodePickleData.__init__.<locals>.<lambda>c                    r   r&   r#   r   r   r#   r$   r   X  r   )pytreetree_map_onlyr*   r+   r6   rm   kwargsr   opr0   rX   targetrl   meta)r    ri   r   r#   r   r$   r   S  s   z_NodePickleData.__init__r   r;   c                    sx   t t fdd| j}t t fdd| j}| j|}t|s)t|t	s)J |
| j|||| j| j}| j|_|S )Nc                    r   r&   r#   r   r   r#   r$   r   l  r   z*_NodePickleData.unpickle.<locals>.<lambda>c                    r   r&   r#   r   r   r#   r$   r   n  r   )r   r   r   rm   r   r   r]   r   r'   rQ   Zcreate_noder   r   rl   r   )r    r   r   r;   rm   r   r   ri   r#   r   r$   r]   f  s   z_NodePickleData.unpickle)rL   rM   rN   r*   r+   r6   rg   r   GraphrG   r]   r#   r#   r#   r$   r   R  s"    
r   c                
   @   s   e Zd Zedededeeegef ee	 f fddZ
ededd fddZeded	eed
 ed f dd fddZededefddZededefddZedededefddZdS )r0   rC   r   r   c                 C   s   |  |}|j|jffS r&   )rX   r]   r   )rA   rC   r   resultr#   r#   r$   r)   x  s   
z_OpPickleData.reduce_helperc                 C   s   t |tr	t|S tjj|}t |tjjr| 	|t
S t |tjjr*| 	|tS |dr<|dd\}}t||S |drM|dd\}}t|S tdt| d| d| )N)z	builtins.zmath.ztorch..   z	operator.zTARGET:  )r'   rQ   _OpStrPickleDatar*   r+   r6   Z_pretty_print_targetr.   
OpOverload
_pickle_op_OpOverloadPickleDatar/   _OpOverloadPacketPickleData
startswithsplit_OpBuiltinPickleData_OpOperatorPickleDatark   rl   )rA   r   r   rootdetail_r#   r#   r$   rX     s   



z_OpPickleData.pickler   dataclsr   r   c                 C   s,   |  dsddlm} |d|  || S )Nztorch.ops.atenr   )BypassFxGraphCachez"Unable to pickle non-standard op: )r   Ztorch._inductor.codecacher   )r   r   r   r#   r#   r$   r     s   
z_OpPickleData._pickle_opr;   c                 C   s   d S r&   r#   rs   r#   r#   r$   r]     s   z_OpPickleData.unpicklec                 C   s8   d|v r| dd\}}t | }| ||S t | S )zC
        Like `globals()[name]` but supports dotted names.
        r   r   )r   globals_getattr_by_name)rA   r   r   restr   r#   r#   r$   _lookup_global_by_name  s
   

z$_OpPickleData._lookup_global_by_namer   c                 C   s4   d|v r| dd\}}t| |} d|v st| |S )zG
        Like `getattr(root, name)` but supports dotted names.
        r   r   )r   r{   )r   r   r   r#   r#   r$   r     s
   

z_OpPickleData._getattr_by_nameN)rL   rM   rN   rR   r   r   rP   r   rG   r   r)   rX   rT   rQ   r   rl   r   r   r]   r   r   r#   r#   r#   r$   r0   w  s6    r0   c                   @   s0   e Zd ZdeddfddZdedefddZdS )	r   r   r   Nc                 C   
   || _ d S r&   r   r    r   r#   r#   r$   r        
z_OpStrPickleData.__init__r;   c                 C   s   | j S r&   r   rs   r#   r#   r$   r]     s   z_OpStrPickleData.unpickle)rL   rM   rN   rQ   r   rG   r]   r#   r#   r#   r$   r         r   c                   @   4   e Zd ZdeddfddZdedejjfddZ	dS )	r   r   r   Nc                 C   r   r&   r   r   r#   r#   r$   r     r   z_OpOverloadPickleData.__init__r;   c                 C   "   |  | j}t|tjjsJ |S r&   )r   r   r'   r*   r.   r   r    r;   r%   r#   r#   r$   r]        z_OpOverloadPickleData.unpickle)
rL   rM   rN   rQ   r   rG   r*   r.   r   r]   r#   r#   r#   r$   r         r   c                   @   r   )	r   r   r   Nc                 C   r   r&   r   r   r#   r#   r$   r     r   z$_OpOverloadPacketPickleData.__init__r;   c                 C   r   r&   )r   r   r'   r*   r.   r/   r   r#   r#   r$   r]     r   z$_OpOverloadPacketPickleData.unpickle)
rL   rM   rN   rQ   r   rG   r*   r.   r/   r]   r#   r#   r#   r$   r     r   r   c                   @   s4   e Zd ZdededdfddZdedefdd	ZdS )
r   r   r   r   Nc                 C   r   r&   )r   r   )r    r   r   r#   r#   r$   r     r   z_OpBuiltinPickleData.__init__r;   c                 C   sR   | j dkrt| jS | j dkrdd l}| || jS | j dkr'| t| jS t)Nbuiltinsmathr   r*   )r   __builtins__r   r   r   r   r*   rk   )r    r;   r   r#   r#   r$   r]     s   


z_OpBuiltinPickleData.unpicklerL   rM   rN   rQ   r   rG   r   r]   r#   r#   r#   r$   r     s    r   c                   @   s0   e Zd ZdeddfddZdedefddZdS )	r   r   r   Nc                 C   r   r&   r   r   r#   r#   r$   r     r   z_OpOperatorPickleData.__init__r;   c                 C   s   dd l }| || jS )Nr   )operatorr   r   )r    r;   r   r#   r#   r$   r]     s   z_OpOperatorPickleData.unpickler   r#   r#   r#   r$   r     r   r   c                   @   s@   e Zd ZdejjddfddZdejjdedejjfdd	Z	dS )
r   r   r   Nc                 C   s@   |j | _|j| _i }|jD ]	}t||||< qt| | _d S r&   )Z_tracer_cls
tracer_clsZ_tracer_extrastracer_extrasnodesr   rP   values)r    r   r   ri   r#   r#   r$   r     s   
z_GraphPickleData.__init__r   r;   c                 C   s:   t j|| j| j}i }| jD ]}||||||< q|S r&   )r*   r+   r   r   r   r   r]   )r    r   r;   r   r   ndr#   r#   r$   r]     s
   
z_GraphPickleData.unpickle)
rL   rM   rN   r*   r+   r   r   r,   rG   r]   r#   r#   r#   r$   r     s    r   c                   @   sn   e Zd Zededejjdee	e
egejjf ee
ef f fddZdeddfdd	Zd
edefddZdS )r5   rC   r%   r   c                 C   r[   r&   r\   r^   r#   r#   r$   r)     s
   z'_TracingContextPickleData.reduce_helpercontextNc                 C   sL   |j | _ |j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _d S r&   )	module_contextframe_summary_stackloc_in_frameaot_graph_nameparams_flatparams_flat_unwrap_subclassesparams_unwrapped_to_flat_indexoutput_strides#force_unspec_int_unbacked_size_like)r    r   r#   r#   r$   r   #  s   z"_TracingContextPickleData.__init__r;   c                 C   sV   t |j}| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j	|_	| j
|_
|S r&   )r   rF   r   r   r   r   r   r   r   r   r   )r    r;   r   r#   r#   r$   r]   9  s   
z"_TracingContextPickleData.unpickle)rL   rM   rN   rR   r   r*   r4   r   rP   r   r
   rG   r   r)   r   r]   r#   r#   r#   r$   r5     s    
r5   )=ry   r   r=   rX   abcr   typingr   r   r   r   r   r   Ztyping_extensionsr	   r
   r*   Ztorch.utils._pytreeutilsZ_pytreer   Ztorch._guardsr   Ztorch._subclasses.fake_tensorr   r   r   Ztorch._subclasses.meta_utilsr   r   r   rq   r   Z%torch.fx.experimental.symbolic_shapesr   Ztorch.utils._mode_utilsr   r2   ZSymFloatr   Picklerr   rG   r   r   	UnpicklerrH   r1   r3   r(   r7   r-   r   r0   r   r   r   r   r   r   r5   r#   r#   r#   r$   <module>   sD     Z
>,%D


 