o
    j9:j                     @   s  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mZmZ d dlmZmZ d dlmZ e ZedurKe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#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j0Z1de2de3fddZ4de2de3fddZ5ej6G dd dZ7dEddZ8de9dej:e9 fddZ;de
g df fddZ<e j=ded fd d!Z>G d"d# d#ej?Z@G d$d% d%ZAed&e9ZBG d'd( d(ejCZDG d)d* d*ZEG d+d, d,ZFG d-d. d.ZGG d/d0 d0ZHG d1d2 d2ZIG d3d4 d4ZJG d5d6 d6ZKG d7d8 d8eKZLG d9d: d:eKZMG d;d< d<eKZNG d=d> d>eKZOG d?d@ d@eKZPG dAdB dBZQG dCdD dDZRdS )F    N)abstractmethod)Callable	Generator)AnyNewTypeTypeVar)overrideSelf)import_dill)TracingContext)AOTCompiledArtifact)FakeScriptObject)
FakeTensorFakeTensorModeTensor)MetaConverterMetaTensorDescMetaTensorDescriber)SymNode)ShapeEnv)no_dispatch	_SymNodeTnamereturnc                 C   s
   |  dS )z
    An ops filter which allows pickle-safe ops. Pickle-safe ops are built-in
    ones where it will be possible to unpickle on any machine which has PyTorch.
    )ztorch.ops.atenztorch.ops.fbgemm)
startswithr    r   ^/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/fx/_graph_pickler.py_ops_filter_safe'   s   r   keyc                 C   s   | dvS )z
    A metadata filter which allows pickle-safe node metadata. These often times contain
    stacks with pointers to unserializable objects, so we clear them out.
    )source_fn_stacknn_module_stackfwd_source_fn_stackr   )r   r   r   r   _node_metadata_key_filter_safe5   s   r#   c                   @   sN   e Zd ZU eZeegef dB ed< e	Z
eegef dB ed< dZeed< dS )OptionsN
ops_filternode_metadata_key_filterFignore_raw_node)__name__
__module____qualname__r   r%   r   strbool__annotations__r#   r&   r'   r   r   r   r   r$   =   s
   
 r$   c                   C      d S Nr   r   r   r   r   _unpickle_as_noneJ   s   r0   referentc                 C   s
   t | S r/   )weakrefref)r1   r   r   r   _unpickle_as_weakrefN      
r4   c                   C   s   dd S )Nc                   S   r.   r/   r   r   r   r   r   <lambda>S   s    z+_unpickle_as_dead_weakref.<locals>.<lambda>r   r   r   r   r   _unpickle_as_dead_weakrefR   s   r7   c                	   c   sP    t tjv rd V  d S tt dd dd  zd V  W tt  d S tt  w )Nc                 S   s   | j | j| jgd fS r/   )startstopstep)xr   r   r   r6   ]   s    z-patch_pytree_map_over_slice.<locals>.<lambda>c                 S   s   t |  S r/   )slice)r;   cr   r   r   r6   ]       )r<   pytreeSUPPORTED_NODES_private_register_pytree_node_deregister_pytree_noder   r   r   r   patch_pytree_map_over_sliceV   s   
rC   c                       s   e Zd ZdZddejdedB 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dB fddZedde	dedB defddZededede	fddZe	dddddde	dddededededB fddZ  ZS )GraphPicklerzb
    GraphPickler is a Pickler which helps pickling fx graph - in particular
    GraphModule.
    Nfileoptionsr   c                    sN   t d urt j|dd nt | |pt | _tt | _tdd| _	d S )NT)byrefF)	copy_data)
dillsuper__init__r$   rF   _UnpickleStateTokenobject_unpickle_stater   _meta_tensor_describer)selfrE   rF   	__class__r   r   rK   m   s   zGraphPickler.__init__obj.c                 C   sF  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rnddlm} t|d}|d urj|t|rjtS tdfS t |tjr| }|d urt|ffS tdfS t |tjjr| j j!rtdfS t"dt#| | }r|S tS )Nr   )is_opaque_value_typereal_objr   z#Unexpected raw Node during pickling)$
isinstancer   _TensorPickleDatareduce_helpertorchfxGraphModule_GraphModulePickleData_opsOperatorBaseOpOverloadPacket_OpPickleDatar   _ShapeEnvPickleDataSymInt_SymNodePickleData_guardsr   _TracingContextPickleDatar   torch._library.opaque_objectrT   rM   __getattribute__typeNotImplementedr0   r2   r3   r4   r7   NoderF   r'   AssertionError_TorchNumpyPickleData)rP   rS   rT   rU   r1   reducer   r   r   reducer_override~   s<   



zGraphPickler.reducer_overridec                 C   s   || j u rdS d S )Nunpickle_state)rN   )rP   rS   r   r   r   persistent_id   s   
zGraphPickler.persistent_idc              	   C   s~   t  2 t }| ||}|| | W  d   W  d   S 1 s(w   Y  W d   dS 1 s8w   Y  dS )z#
        Pickle an object.
        N)rC   ioBytesIOdumpgetvalue)clsrS   rF   streampicklerr   r   r   dumps   s
   

RzGraphPickler.dumpsdata	fake_modec              
   C   s   ddl m} t U |d8 t|}t| }t||}| W  d   W  d   W  d   S 1 s:w   Y  W d   n1 sIw   Y  W d   dS W d   dS 1 saw   Y  dS )z%
        Unpickle an object.
        r   )dynamo_timedGraphPickler.loadsN)torch._dynamo.utilsr{   rC   _UnpickleStaterq   rr   _GraphUnpicklerload)ry   rz   r{   staterv   	unpicklerr   r   r   loads   s   
Pr|   P   2   T)	max_depthmax_iter_itemsverbosezOptions | Noner   r   r   c             	      s   pt   t t dtddffdddtdtdB f fdddtd	td
tdtdB f	fdd		|dd}|S )a  
        Find the first leaf that GraphPickler.dumps cannot serialize and return its path.

        This is GraphPickler-aware and avoids infinite loops by:
          - Traversing builtin containers directly (dict/list/tuple/set) instead of
            exploring their __reduce_ex__ tuples.
          - Only using __reduce_ex__ / __reduce__ for "opaque" objects.
          - Bounding recursion depth and iterator expansion.

        Args:
            obj: The object to attempt to pickle and debug.
            options: Optional Options instance for the GraphPickler.
            max_depth: Maximum recursion depth before stopping traversal.
            max_iter_items: Maximum number of items to materialize from iterators.
            verbose: If True, prints detailed traversal information.

        Returns:
            A string representing the path to the first unpicklable leaf,
            or None if the object is fully picklable.
        msgr   Nc                    s    rt |  d S d S r/   )print)r   )r   r   r   log  s   z%GraphPickler.debug_dumps.<locals>.logoc              
      s<   z	  |  W d S  ty } z|W  Y d }~S d }~ww r/   )rx   	Exception)r   e)ru   rF   r   r   fail_exc  s   z*GraphPickler.debug_dumps.<locals>.fail_excpathdepthc              
      s  |krd|  d| dt |  d |d S t| }|v r#d S | d| }| d| dt |  d  | }|d u rL| d d S | dt |  d	|  t| tr~|  D ]\}}|| d
|d|d }|r{|  S qc|S t| ttfrt| D ]\}	}|| d
|	 d|d }|r|  S q|S t| t	t
frt| D ]\}	}|| d
|	 d|d }|r|  S q|S t| dr2t | jdr2zttt| d }
W n ty   d }
Y nw |
d ur2t|
kr| d d  |
d  }
t|
D ]\}	}|| d
|	 d|d }|r.|  S q|S z| }| dt |  W n tyb } z| d|  |W  Y d }~S d }~ww |tur|\}}| dt|  t|D ]\}	}|| d|	 d|d }|r|  S q{t| rt| D ]5}zt| |j}W n ty   | d|j  Y   S w || d|j |d }|r|  S q|S t| dd }t|r$z| }| dt |  W n  ty } z| d|  |d W  Y d }~S d }~ww ||d |d }|r$|S t| drLt|  D ]\}}|| d| |d }|rH|  S q0|S t| drx| jD ] }t| |rtt| || d| |d }|rt|  S qU|S d }z/t| dr| tj}| dt |  nt| dr|   }| dt |  W n ty } z| d |  |W  Y d }~S d }~ww t|trt|D ]!\}	}|d u rݐq҈|| d!|	 d|d }|r|  S q|S )"Nz  zDepth limit at z ()z (depth_limit)z	Walking: u   ✓ Pickles fine alonez[FAIL pickle] z -> []   __iter__iteratoru   ⚠ Iterator has more than z items, only checking first zreducer_override -> u   💥 reducer_override crashed: zUsing custom reduce, args=z.reduce_args[.__getstate__z__getstate__ -> u   💥 __getstate__ failed: z.__getstate__()__dict__	__slots____reduce_ex__z__reduce_ex__ -> 
__reduce__z__reduce__ -> u   💥 reduce protocol failed: z.__reduce__[)!rh   idaddrV   dictitemslisttuple	enumerateset	frozensethasattrr(   endswith	itertoolsisliceiterr   lenrn   ri   dataclassesis_dataclassfieldsgetattrr   callablevarsr   r   pickleHIGHEST_PROTOCOLr   )r   r   r   r   indentr   kvbadiprefixrede2_argsafgetstater   e3r   slotreduce_tuplee4part)r   r   r   r   rw   visitedwalkr   r   r     s  "






 
z&GraphPickler.debug_dumps.<locals>.walkrootr   )r$   rq   rr   r   r+   r   BaseExceptionint)ru   rS   rF   r   r   r   r   r   )
ru   r   r   r   r   rF   rw   r   r   r   r   debug_dumps   s   
. zGraphPickler.debug_dumpsr/   )r(   r)   r*   __doc__rq   rr   r$   rK   r   rM   r   r   r   rn   r+   rp   classmethodbytesrx   staticmethodr   r   r   r,   r   __classcell__r   r   rQ   r   rD   g   sD    "?	rD   c                   @   s   e Zd ZdeddfddZdS )r~   rz   r   Nc                 C   s   || _ t | _d S r/   )rz   r   meta_converter)rP   rz   r   r   r   rK     s   z_UnpickleState.__init__)r(   r)   r*   r   rK   r   r   r   r   r~     s    r~   rL   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 )
r   rv   ro   r   Nc                    s   t  | || _d S r/   )rJ   rK   rN   )rP   rv   ro   rQ   r   r   rK     s   
z_GraphUnpickler.__init__pidc                 C   s   |dkr| j S td)Nro   zInvalid persistent ID)rN   r   UnpicklingError)rP   r   r   r   r   persistent_load  s   
z_GraphUnpickler.persistent_load)r(   r)   r*   rq   rr   r~   rK   r   rM   r   r   r   r   rQ   r   r     s    r   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 )ra   ry   rw   rS   r   c                 C      | j | ||jffS r/   unpicklerN   ru   rw   rS   r   r   r   rX     s   z!_ShapeEnvPickleData.reduce_helperenvNc                 C   s.   |j rtd|j | _| jd= | jd= d S )Nz4Translation validation must be disabled for picklingtracked_fakesfake_tensor_cache)_translation_validation_enabledrk   r   copyry   )rP   r   r   r   r   rK     s
   z_ShapeEnvPickleData.__init__ro   c                 C   sJ   |j std|j jstd| j D ]\}}t|j j|| q|j jS )Nz#unpickle_state.fake_mode is not setz-unpickle_state.fake_mode.shape_env is not set)rz   rk   	shape_envry   r   setattr)rP   ro   r   r   r   r   r   r     s   z_ShapeEnvPickleData.unpickle)r(   r)   r*   r   r+   rM   r-   r   rD   r   r   r   r	   r~   rL   rX   rK   r   r   r   r   r   ra     s   
 
ra   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 )rc   rw   rS   r   c                 C   s8   | |j |jf}t|tjrtj|fS tdt| )NzUnhandled SymNode type )	noderN   rV   rY   rb   rc   unpickle_sym_intNotImplementedErrorrh   )ru   rw   rS   r   r   r   r   rX     s   
z _SymNodePickleData.reduce_helperr   Nc                 C   s$   |j | _|j| _|j| _|j| _d S r/   )_exprexprr   pytype_hinthint)rP   r   r   r   r   rK     s   z_SymNodePickleData.__init__c                 C   s(   | j d u r	tdt| j| j | j| jS )Nzshape_env is None)r   rk   r   r   r   r   )rP   r   r   r   _to_sym_node  s   
z_SymNodePickleData._to_sym_nodero   c                 C   s   t |  S r/   )rY   rb   r   rP   ro   r   r   r   r        z#_SymNodePickleData.unpickle_sym_int)r(   r)   r*   r   rD   r   r   r   r	   r~   rL   rX   r   rK   r   rY   rb   r   r   r   r   r   rc     s    rc   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 )rW   metadatarw   rS   r   c                 C   s   | j | |j||jffS r/   )r   rO   rN   r   r   r   r   rX     s   
z_TensorPickleData.reduce_helper	describertNc                 C   s   | |}|jrt|jtjjjstdt|j t	j
|d d| _tjD ]}|dv r-q&t| j|d urCtd| dt| j| q&d S )Nz3view_func must be None or _FakeTensorViewFunc, got rz   )rz   	view_funcz
not None: z: )describe_tensorr   rV   rY   _subclasses
meta_utils_FakeTensorViewFuncrk   rh   r   replacer   r   _UNSERIALIZABLEr   )rP   r   r   r   r   r   r   r   rK     s"   

z_TensorPickleData.__init__ro   c                    s   t j| j jd}|jr!|jd ur!t j|j jd}t j||d}dtg tjf dtj	t
B dtf fdd} j| jj|d d S )Nr   )basemake_meta_tdevicer   c                    s:   t   t j|  |W  d    S 1 sw   Y  d S r/   )r   r   rz   )r   r   ro   r   r   	with_fake,  s   $z-_TensorPickleData.unpickle.<locals>.with_fake)r   r   r   rz   is_viewr   r   rY   r   r   r+   r   r   meta_tensorr   )rP   ro   r   new_baser   r   r   r   r     s0   z_TensorPickleData.unpickle)r(   r)   r*   r   r   r-   r   rD   r   r   r	   r~   rL   rX   r   r   rK   r   r   r   r   r   rW     s   
 
rW   c                   @   s   e Zd Zedededeeee	gef eee
f f dB 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dB fddZdS )rl   rw   rS   r   Nc                 C   s"   |  | }r| j||jffS d S r/   )from_objectr   rN   )ru   rw   rS   ry   r   r   r   rX   A  s   	z#_TorchNumpyPickleData.reduce_helpermodr   c                 C      || _ || _d S r/   )r   r   )rP   r   r   r   r   r   rK   O     
z_TorchNumpyPickleData.__init__ro   .c                 C   s&   t t| j| j}tjjj	 | S r/   )
r   	importlibimport_moduler   r   rY   _dynamo	variablesmiscget_np_to_tnp_map)rP   ro   npr   r   r   r   S  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rLtd| d| | ||S )Nr)   numpyr(   zNumpy object mismatch for r   )r   rY   r  r  r  get_tnp_to_np_mapget	TypeErrorr   r  r  rk   )ru   r
  	tnp_to_npr	  r   r   r   r   r   r   W  s&   
z!_TorchNumpyPickleData.from_object)r(   r)   r*   r   rD   rM   r   r   r	   r~   rL   rX   r+   rK   r   r   r   r   r   r   rl   @  s"    rl   c                   @   sz   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eddfd	d
ZdedejjfddZdS )r\   rw   rS   r   c                 C   s   | j | ||j|jffS r/   )r   rF   rN   r   r   r   r   rX   s  s   
z$_GraphModulePickleData.reduce_helpergmrF   Nc                 C   s^   t |tjjjr| }n| }t|dr| | _	n|j
 | _	| j	d= t|j|| _d S )Nr   _graph)rV   rY   rZ   _lazy_graph_module_LazyGraphModule_real_recompile	recompiler   r   gm_dictr   r   _GraphPickleDatar  graph)rP   r  rF   _python_coder   r   r   rK     s   

z_GraphModulePickleData.__init__ro   c                 C   s.   t jjt jj}| j|_| j|||_|S r/   )	rY   rZ   r[   __new__r  r   r  r   r  )rP   ro   r  r   r   r   r     s   z_GraphModulePickleData.unpickle)r(   r)   r*   r   rD   rY   rZ   r[   r   r   r	   r~   rL   rX   r$   rK   r   r   r   r   r   r\   r  s    
r\   c                   @   sd   e Zd Zdejjdeejjd f de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 )_NodePickleDatar   mappingrF   r   Nc                    s   t tjj fdd|j| _t tjj fdd|j| _|j| _|j| _t	
|j| _|j| _fdd|j D | _d S )Nc                        |  S r/   r   nr  r   r   r6     r>   z*_NodePickleData.__init__.<locals>.<lambda>c                    r  r/   r   r  r   r   r   r6     r>   c                    s&   i | ]\}} j r  |r||qS r   )r&   ).0r   r   )rF   r   r   
<dictcomp>  s    z,_NodePickleData.__init__.<locals>.<dictcomp>)r?   tree_map_onlyrY   rZ   rj   r   kwargsr   opr`   r   targetrh   metar   )rP   r   r  rF   r   )r  rF   r   rK     s   
z_NodePickleData.__init__r  ro   c                    s   t t fdd| j}t t fdd| j}| j|}t|s0t|t	s0t
dt| || j|||| j| j}| j|_|S )Nc                    r  r/   r   r  r   r   r   r6     r>   z*_NodePickleData.unpickle.<locals>.<lambda>c                    r  r/   r   r  r   r   r   r6     r>   z$target must be callable or str, got )r?   r#  r  r   r$  r&  r   r   rV   r+   rk   rh   create_noder%  r   r'  )rP   r  r  ro   r   r$  r&  r   r   r   r   r     s   z_NodePickleData.unpickle)r(   r)   r*   rY   rZ   rj   r   r$   rK   Graphr~   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edd fddZed	ed
ed ed B de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 )r`   rw   r%  r   c                 C   s   |  ||j}|j|jffS r/   )r   rF   r   rN   )ru   rw   r%  resultr   r   r   rX     s   z_OpPickleData.reduce_helperrF   c                 C   s   t |tr	t|S t t|dd tr0t|dstd|j}t |ts,tdt| t	|S t
jj|}t |t
jjrE| |t|S t |t
jjrS| |t|S |tjrf|dd\}}t||S tdt| d| d| )N__wrapped__z op missing __wrapped__ attributez"Expected AOTCompiledArtifact, got r   r   zTARGET:  )rV   r+   _OpStrPickleDatar   r   r   rk   r+  rh   _OpPrecompiledPickleDatarY   rZ   rj   _pretty_print_targetr]   
OpOverload
_pickle_op_OpOverloadPickleDatar_   _OpOverloadPacketPickleDatar   _OpFunctionPickleDataSUPPORTED_ROOTSsplitr   )ru   r%  rF   artifactr   r   detailr   r   r   r     s(   



z_OpPickleData.pickler   dataclsr2  r3  c                 C   s4   |j  }r|| sddlm} |d|  || S )Nr   )BypassFxGraphCachez"Unable to pickle non-standard op: )r%   torch._inductor.codecacher:  )r   r9  rF   r%   r:  r   r   r   r1    s   z_OpPickleData._pickle_opro   c                 C   r.   r/   r   r   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   )r6  globals_getattr_by_name)ru   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   )r6  r   )r   r   r   r   r   r   r=    s
   

z_OpPickleData._getattr_by_nameN)r(   r)   r*   r   rD   rM   r   r   r~   rL   rX   r$   r   r   r+   rh   r1  r   r   r?  r=  r   r   r   r   r`     s6    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   
   || _ d S r/   r   rP   r   r   r   r   rK     r5   z_OpStrPickleData.__init__ro   c                 C   s   | j S r/   r   r   r   r   r   r     s   z_OpStrPickleData.unpickle)r(   r)   r*   r+   rK   r~   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 )	r2  r   r   Nc                 C   r@  r/   r   rA  r   r   r   rK     r5   z_OpOverloadPickleData.__init__ro   c                 C   0   |  | j}t|tjjstdt| |S )NzExpected OpOverload, got )r?  r   rV   rY   r]   r0  rk   rh   rP   ro   rS   r   r   r   r        z_OpOverloadPickleData.unpickle)
r(   r)   r*   r+   rK   r~   rY   r]   r0  r   r   r   r   r   r2        r2  c                   @   rC  )	r3  r   r   Nc                 C   r@  r/   r   rA  r   r   r   rK   "  r5   z$_OpOverloadPacketPickleData.__init__ro   c                 C   rD  )NzExpected OpOverloadPacket, got )r?  r   rV   rY   r]   r_   rk   rh   rE  r   r   r   r   %  rF  z$_OpOverloadPacketPickleData.unpickle)
r(   r)   r*   r+   rK   r~   rY   r]   r_   r   r   r   r   r   r3  !  rG  r3  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.  r7  r   Nc                 C   s   |  | _d S r/   )	serializecontents)rP   r7  r   r   r   rK   -  r   z!_OpPrecompiledPickleData.__init__ro   c                    s8   t | j dd l}| dtdtf fdd}|S )Nr   r   r   c                     s    |  S r/   r   )r   precompiled_artifactr   r   wrapped4  s   z2_OpPrecompiledPickleData.unpickle.<locals>.wrapped)r   deserializerI  	functoolswrapsr   )rP   ro   rN  rL  r   rJ  r   r   0  s
   z!_OpPrecompiledPickleData.unpickle)r(   r)   r*   r   rK   r~   rM   r   r   r   r   r   r.  ,  rB  r.  c                   @   s<   e Zd ZdZdZdededdfddZd	edefd
dZ	dS )r4  z
    Supports pickling a set of standard/common functions
    These must be prefixed with the full namespace in order to properly
    be pickled (i.e `einops.rearrange` and not `from einops import rearrange`)
    )z	builtins.zmath.ztorch.z	operator.zeinops.r   r   r   Nc                 C   r  r/   )r   r   )rP   r   r   r   r   r   rK   E  r  z_OpFunctionPickleData.__init__ro   c                 C   s   | j dkrt| jS | j dkrdd l}| || jS | j dkr'| t| jS | j dkr7dd l}| || jS | j dkrGdd l}| || jS t	)Nbuiltinsmathr   rY   operatoreinops)
r   __builtins__r  r   rQ  r=  rY   rR  rS  r   )rP   ro   rQ  rR  rS  r   r   r   r   I  s   




z_OpFunctionPickleData.unpickle)
r(   r)   r*   r   r5  r+   rK   r~   rM   r   r   r   r   r   r4  ;  s
    r4  c                   @   sD   e Zd ZdejjdeddfddZdejjde	dejjfd	d
Z
dS )r  r  rF   r   Nc                 C   sJ   |j | _|j| _i }|jD ]
}t|||||< qt| | _|j| _d S r/   )	_tracer_cls
tracer_cls_tracer_extrastracer_extrasnodesr  r   values_codegen)rP   r  rF   rY  r   r   r   r   rK   _  s   
z_GraphPickleData.__init__r  ro   c                 C   sL   t j|| j| j}i }| jD ]}||||||< qt| dr$| j|_|S )Nr[  )	rY   rZ   r)  rV  rX  rY  r   r   r[  )rP   r  ro   r  rY  ndr   r   r   r   r  s   

z_GraphPickleData.unpickle)r(   r)   r*   rY   rZ   r)  r$   rK   r[   r~   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 )re   rw   rS   r   c                 C   r   r/   r   r   r   r   r   rX     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)rP   r]  r   r   r   rK     s   z"_TracingContextPickleData.__init__ro   c                 C   sV   t |j}| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j	|_	| j
|_
|S r/   )r   rz   r^  r_  r`  ra  rb  rc  rd  re  rf  )rP   ro   r]  r   r   r   r     s   
z"_TracingContextPickleData.unpickle)r(   r)   r*   r   rD   rY   rd   r   r   r   r	   r~   rL   rX   rK   r   r   r   r   r   re     s    
re   )r   N)S
contextlibr   r  rq   r   r   r2   abcr   collections.abcr   r   typingr   r   r   typing_extensionsr   r	   torch.utils._import_utilsr
   rI   rY   torch.utils._pytreeutils_pytreer?   torch._guardsr   "torch._inductor.standalone_compiler   "torch._library.fake_class_registryr   torch._subclasses.fake_tensorr   r   r   torch._subclasses.meta_utilsr   r   r   torch.fx.experimental.sym_noder   %torch.fx.experimental.symbolic_shapesr   torch.utils._mode_utilsr   rb   SymFloatr   r+   r,   r   r#   	dataclassr$   r0   rM   r3   r4   r7   contextmanagerrC   PicklerrD   r~   rL   	Unpicklerr   ra   rc   rW   rl   r\   r  r`   r-  r2  r3  r.  r4  r  re   r   r   r   r   <module>   sn    
  6
"J2!0K#"