
    VhQ                        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c 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jJ                  ejL                        Z' G d dejP                        Z) G d d      Z* e	de+      Z, G d dejZ                        Z. G d d      Z/ G d d      Z0 G d d      Z1 G d d      Z2 G d d      Z3 G d d      Z4 G d d       Z5 G d! d"e5      Z6 G d# d$e5      Z7 G d% d&e5      Z8 G d' d(e5      Z9 G d) d*e5      Z: G d+ d,      Z; G d- d.      Z<y)/    N)abstractmethod)AnyCallableNewTypeOptionalTypeVarUnion)overrideSelf)TracingContext)
FakeTensorFakeTensorModeTensor)MetaConverterMetaTensorDescMetaTensorDescriberSymNode)ShapeEnv)no_dispatch	_SymNodeTc            	            e Zd ZdZdej
                  ddf fdZedede	e
def   e	edf   f   fd       Zededee   fd	       Zededefd
       Zedededefd       Z xZS )GraphPicklerzb
    GraphPickler is a Pickler which helps pickling fx graph - in particular
    GraphModule.
    filereturnNc                 v    t         |   |       t        t                     | _        t        d      | _        y )NF)	copy_data)super__init___UnpickleStateTokenobject_unpickle_stater   _meta_tensor_describer)selfr   	__class__s     G/home/dcms/DCMS/lib/python3.12/site-packages/torch/fx/_graph_pickler.pyr   zGraphPickler.__init__    s0      368< ':E&J#    obj.c                    t        |t              rt        j                  | |      S t        |t        j
                  j                        rt        j                  | |      S t        |t        j                  j                  t        j                  j                  f      rt        j                  | |      S t        |t              rt        j                  | |      S t        |t        j                        rt        j                  | |      S t        |t        j                   j"                        rt$        j                  | |      S t        |t        j
                  j&                        rJ t(        j                  | |      x}r|S t*        S N)
isinstancer   _TensorPickleDatareduce_helpertorchfxGraphModule_GraphModulePickleData_opsOperatorBaseOpOverloadPacket_OpPickleDatar   _ShapeEnvPickleDataSymInt_SymNodePickleData_guardsr   _TracingContextPickleDataNode_TorchNumpyPickleDataNotImplemented)r$   r(   reduces      r&   reducer_overridezGraphPickler.reducer_override-   s"   * c:&$224==UXX112)77cBBejj55uzz7R7RST ..tS99X&&44T3??U\\*%33D#>>U]]99:,::4EE "#uxx}}555.<<T3GGvG "!r'   c                 "    || j                   u ryy )Nunpickle_state)r"   )r$   r(   s     r&   persistent_idzGraphPickler.persistent_idX   s    $&&&#r'   c                     t        j                         5 } | |      }|j                  |       |j                         cddd       S # 1 sw Y   yxY w)z#
        Pickle an object.
        N)ioBytesIOdumpgetvalue)clsr(   streampicklers       r&   dumpszGraphPickler.dumps_   sC    
 ZZ\ 	%V&kGLL??$	% 	% 	%s   )AAdata	fake_modec                     t        |      }t        j                  |       5 }t        ||      }|j	                         cddd       S # 1 sw Y   yxY w)z%
        Unpickle an object.
        N)_UnpickleStaterD   rE   _GraphUnpicklerload)rL   rM   staterI   	unpicklers        r&   loadszGraphPickler.loadsi   sG    
 y)ZZ 	$'6I>>#	$ 	$ 	$s   AA)__name__
__module____qualname____doc__rD   rE   r   r
   r!   tupler   r   r?   r   strrB   classmethodbytesrK   staticmethodr   rT   __classcell__r%   s   @r&   r   r      s    
KRZZ KD K ("("	xS!5c?2	3(" ("T  HSM   % %5 % % $E $n $ $ $r'   r   c                       e Zd ZdeddfdZy)rO   rM   r   Nc                 0    || _         t               | _        y r*   )rM   r   meta_converter)r$   rM   s     r&   r   z_UnpickleState.__init__u   s    "9Fr'   )rU   rV   rW   r   r    r'   r&   rO   rO   t   s    I. IT Ir'   rO   r    c                   Z     e Zd Zdej                  deddf fdZededefd       Z	 xZ
S )rP   rI   rA   r   Nc                 2    t         |   |       || _        y r*   )r   r   r"   )r$   rI   rA   r%   s      r&   r   z_GraphUnpickler.__init__   s     -r'   pidc                 N    |dk(  r| j                   S t        j                  d      )NrA   zInvalid persistent ID)r"   pickleUnpicklingError)r$   rf   s     r&   persistent_loadz_GraphUnpickler.persistent_load   s)    ""'''(()@AAr'   )rU   rV   rW   rD   rE   rO   r   r
   r!   rj   r^   r_   s   @r&   rP   rP      sG    .rzz .> .d . B6 Bf B Br'   rP   c                       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       Zde	ddfdZd	ede	fd
Zy)r6   rL   rJ   r(   r   c                 B    | j                    | |      |j                  ffS r*   unpickler"   rH   rJ   r(   s      r&   r-   z!_ShapeEnvPickleData.reduce_helper   s"     ||c#h(?(?@@@r'   envNc                     |j                   rJ |j                  j                         | _        | j                  d= | j                  d= y )Ntracked_fakesfake_tensor_cache)_translation_validation_enabled__dict__copyrL   )r$   rp   s     r&   r   z_ShapeEnvPickleData.__init__   s@     6666LL%%'	IIo&II)*r'   rA   c                     |j                   sJ |j                   j                  sJ | j                  j                         D ]&  \  }}t	        |j                   j                  ||       ( |j                   j                  S r*   )rM   	shape_envrL   itemssetattr)r$   rA   kvs       r&   rn   z_ShapeEnvPickleData.unpickle   sp    ''''''1111IIOO% 	>DAqN,,661=	> ''111r'   )rU   rV   rW   dictrZ   r!   __annotations__r[   r   r   rY   r   r   rO   r    r-   r   rn   rc   r'   r&   r6   r6      s    
sF{
A"A)1A	$'12E$@S:S4TT
A A+H + +2~ 2( 2r'   r6   c                       e Zd Zedededeeee	gef   eee
f   f   fd       ZdeddfdZdefdZd	e	dej                   fd
Zy)r8   rJ   r(   r   c                      | |j                         |j                  f}t        |t        j                        rt
        j                  |fS t        dt        |             )NzUnhandled SymNode type )	noder"   r+   r.   r7   r8   unpickle_sym_intNotImplementedErrortype)rH   rJ   r(   argss       r&   r-   z _SymNodePickleData.reduce_helper   sR     CHHw667c5<<(%66<<%(?S	{&KLLr'   r   Nc                     |j                   | _        |j                  | _        |j                  | _        |j                  | _        y r*   )_exprexprrx   pytype_hinthint)r$   r   s     r&   r   z_SymNodePickleData.__init__   s.    JJ	kkJJ	r'   c                     ddl m} | j                  J  || j                  | j                  | j                  | j
                        S )Nr   r   )torch.fx.experimental.sym_noder   rx   r   r   r   )r$   r   s     r&   _to_sym_nodez_SymNodePickleData._to_sym_node   s6    :~~)))tyy$..$++tyyIIr'   rA   c                 H    t        j                  | j                               S r*   )r.   r7   r   r$   rA   s     r&   r   z#_SymNodePickleData.unpickle_sym_int   s    ||D--/00r'   )rU   rV   rW   r[   r   r   rY   r   r   rO   r    r-   r   r   r   r.   r7   r   rc   r'   r&   r8   r8      s    MM M 
$'23U4AT;T5UU
	M MW  Jg J1~ 1%,, 1r'   r8   c                       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       Zdededdfd	Zd
edefdZy)r,   metadatarJ   r(   r   c                 X    | j                    | |j                  |      |j                  ffS r*   )rn   r#   r"   ro   s      r&   r-   z_TensorPickleData.reduce_helper   s3     ||..4##
 
 	
r'   	describertNc           	         |j                  |      }|j                  r:t        |j                  t        j                  j
                  j                        sJ t        j                  |d       | _	        t        j                  D ]>  }|dv rt        | j                  |      J d| dt        | j                  |               y )NrM   )rM   	view_funcz
not None: z: )describe_tensorr   r+   r.   _subclasses
meta_utils_FakeTensorViewFuncdataclassesreplacer   r   _UNSERIALIZABLEgetattr)r$   r   r   r   r{   s        r&   r   z_TensorPickleData.__init__   s    
 ,,Q/ %% 1 1 < < P P*
 	
 
 $++HE  // 	=A..q)1=A3b!: ;<=1		=r'   rA   c                 D   t        j                  | j                  j                        }dt        g t
        j                  f   dt        t
        j                  t        f   dt        ffd}j                  j                  |j                  j                  |d d       S )Nr   make_meta_tdevicer   c                 |    t               5  t        j                   |        |      cd d d        S # 1 sw Y   y xY wr*   )r   r   rM   )r   r   rA   s     r&   	with_fakez-_TensorPickleData.unpickle.<locals>.with_fake   s8      !",,M  s   2;)r   r   r   rM   r   r.   r   r	   r   rZ   r   rb   meta_tensorrx   )r$   rA   r   r   s    `  r&   rn   z_TensorPickleData.unpickle   s    &&MM$..

	!"ell"23	=B5<<QTCT=U		 ,,88$$..
 	
r'   )rU   rV   rW   r   r   r~   r[   r   rY   r   r   rO   r    r-   r   r   r   rn   rc   r'   r&   r,   r,      s    Z((
"
)3
	$'34eDBU<U6VV

 
="5 =& =T =,
~ 
* 
r'   r,   c                       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       ZdededdfdZd	e
ded
ef   fdZededee	   fd       Zy)r<   rJ   r(   r   c                 ^    | j                  |      x}r| j                  ||j                  ffS y r*   )from_objectrn   r"   )rH   rJ   r(   rL   s       r&   r-   z#_TorchNumpyPickleData.reduce_helper	  s5     ??3''4'LL4)@)@"ABBr'   modnameNc                      || _         || _        y r*   )r   r   )r$   r   r   s      r&   r   z_TorchNumpyPickleData.__init__  s    	r'   rA   .c                     t        t        j                  | j                        | j                        }t
        j                  j                  j                  j                         |   S r*   )
r   	importlibimport_moduler   r   r.   _dynamo	variablesmiscget_np_to_tnp_map)r$   rA   nps      r&   rn   z_TorchNumpyPickleData.unpickle  sE    Y,,TXX6		B}}&&++==?CCr'   tnpc                 d   t        |      sy t        j                  j                  j                  j                         }	 |j                  |      x}sy 	 t        |dd       x}sd}t        |dd       x}sy |t        t        j                  |      |      k(  sJ  | ||      S # t        $ r Y y w xY w)NrV   numpyrU   )callabler.   r   r   r   get_tnp_to_np_mapget	TypeErrorr   r   r   )rH   r   	tnp_to_npr   r   r   s         r&   r   z!_TorchNumpyPickleData.from_object  s    }MM++00BBD		#--,,B, -
 r<666CJ555WY44S94@@@@3~  		s    B# #	B/.B/)rU   rV   rW   r[   r   r!   r   rY   r   r   rO   r    r-   rZ   r   rn   r   rc   r'   r&   r<   r<     s    
"
)/
	dN+V34eDBU<U6VV	


 
C s t D~ D(3;:O D f $  r'   r<   c                      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       Zdej                  j                  ddfdZdedej                  j                  fd	Zy)
r1   rJ   r(   r   c                 B    | j                    | |      |j                  ffS r*   rm   ro   s      r&   r-   z$_GraphModulePickleData.reduce_helper5  s*     ||H##
 
 	
r'   gmNc                 .   t        |t        j                  j                  j                        r|j                         }n|j                         }|j                  j                         | _	        | j                  d= t        |j                        | _        y )N_graph)r+   r.   r/   _lazy_graph_module_LazyGraphModule_real_recompile	recompileru   rv   gm_dict_GraphPickleDatar   graph)r$   r   _python_codes      r&   r   z_GraphModulePickleData.__init__A  se    b%((55FFG--/L<<>L{{'')LL"%bii0
r'   rA   c                     t         j                  j                  j                  t         j                  j                        }| j                  |_        | j                  j                  ||      |_        |S r*   )	r.   r/   r0   __new__r   ru   r   rn   r   )r$   rA   r   s      r&   rn   z_GraphModulePickleData.unpickleK  sN    XX!!))%((*>*>?llJJ''N;		r'   )rU   rV   rW   r[   r   r.   r/   r0   rY   r   r   rO   r    r-   r   rn   rc   r'   r&   r1   r1   4  s    	
"	
).)=)=	
	$')=)==>d''(	*
	
 	
1588// 1D 1~ %((:N:N r'   r1   c                      e Zd Zdej                  j
                  deej                  j
                  d f   ddfdZdej                  j                  ded ej                  j
                  f   de	dej                  j
                  fdZ
y)	_NodePickleDatar   mappingr   Nc                    t        j                  t        j                  j                  fd|j
                        | _        t        j                  t        j                  j                  fd|j                        | _        |j                  | _        |j                  | _        t        j                  |j                        | _        |j                  | _        |j                  | _        y )Nc                     |    S r*   rc   nr   s    r&   <lambda>z*_NodePickleData.__init__.<locals>.<lambda>V  s    '!* r'   c                     |    S r*   rc   r   s    r&   r   z*_NodePickleData.__init__.<locals>.<lambda>X  s    WQZ r'   )pytreetree_map_onlyr.   r/   r;   r   kwargsr   opr5   rh   targetr   meta)r$   r   r   s     `r&   r   z_NodePickleData.__init__S  s     ((8LdiiX	**HHMM/
 II	''#**4;;7 II	 II	r'   r   rA   c                    t        j                  t        fd| j                        }t        j                  t        fd| j                        }| j
                  j                  |      }t        |      st        |t              sJ |j                  | j                  |||| j                  | j                        }| j                  |_        |S )Nc                     |    S r*   rc   r   s    r&   r   z*_NodePickleData.unpickle.<locals>.<lambda>l  s    wqz r'   c                     |    S r*   rc   r   s    r&   r   z*_NodePickleData.unpickle.<locals>.<lambda>n  s    wqz r'   )r   r   r   r   r   r   rn   r   r+   rZ   create_noder   r   r   r   )r$   r   r   rA   r   r   r   r   s     `     r&   rn   z_NodePickleData.unpicklef  s     ##O5I499U%%14;;
 %%n5:fc#:::  &$		499UII	r'   )rU   rV   rW   r.   r/   r;   r}   r   GraphrO   rn   rc   r'   r&   r   r   R  s    HHMM,0@Q1Q,R	&xx~~ '67 '	
 
r'   r   c            
           e Zd Zedededeeegef   ee	   f   fd       Z
ededd fd       Zededeed   ed	   f   dd fd
       Zededefd       Zededefd       Zedededefd       Zy)r5   rJ   r   r   c                 V    | j                  |      }|j                  |j                  ffS r*   )rh   rn   r"   )rH   rJ   r   results       r&   r-   z_OpPickleData.reduce_helperx  s)     B'"9"9!;<<r'   c                 r   t        |t              rt        |      S t        j                  j
                  j                  |      }t        |t        j                  j                        r| j                  |t              S t        |t        j                  j                        r| j                  |t              S |j                  d      r!|j                  dd      \  }}t        ||      S |j                  d      r |j                  dd      \  }}t!        |      S t#        dt%        |       d| d|       )N)z	builtins.zmath.ztorch..   z	operator.zTARGET:  )r+   rZ   _OpStrPickleDatar.   r/   r;   _pretty_print_targetr2   
OpOverload
_pickle_op_OpOverloadPickleDatar4   _OpOverloadPacketPickleData
startswithsplit_OpBuiltinPickleData_OpOperatorPickleDatar   r   )rH   r   r   rootdetail_s         r&   rh   z_OpPickleData.pickle  s    b##B''xx}}11"5b%**//0>>$(=>>EJJ778>>$(CDD__=>::c1-LD&'f55__[)

3*IAv(00 &b
!B4q&GHHr'   r   dataclsr   r   c                 V    | j                  d      sddlm}  |d|         ||       S )Nztorch.ops.atenr   )BypassFxGraphCachez"Unable to pickle non-standard op: )r   torch._inductor.codecacher   )r   r   r   s      r&   r   z_OpPickleData._pickle_op  s1     /0D$'I$%PQQt}r'   rA   c                      y r*   rc   r   s     r&   rn   z_OpPickleData.unpickle  s    r'   c                     d|v r4|j                  dd      \  }}t               |   }| j                  ||      S t               |   S )zC
        Like `globals()[name]` but supports dotted names.
        r   r   )r   globals_getattr_by_name)rH   r   r   restr   s        r&   _lookup_global_by_namez$_OpPickleData._lookup_global_by_name  sI    
 $;

3*IC9S>D''d339T?"r'   r   c                 n    d|v r&|j                  dd      \  }}t        | |      } d|v r&t        | |      S )zG
        Like `getattr(root, name)` but supports dotted names.
        r   r   )r   r   )r   r   r   s      r&   r   z_OpPickleData._getattr_by_name  sC    
 Tk

3*IC4%D Tk tT""r'   N)rU   rV   rW   r[   r   r!   rY   r   rO   r    r-   rh   r]   rZ   r	   r   r   r   rn   r   r   rc   r'   r&   r5   r5   w  s#   ="=(.=	x(&0159L3MM	N= = I I? I I& 

()40M+NN


 

 
 ~ &   	## 	#& 	# 	# #v #S #V # #r'   r5   c                   ,    e Zd ZdeddfdZdedefdZy)r   r   r   Nc                     || _         y r*   r   r$   r   s     r&   r   z_OpStrPickleData.__init__  	    	r'   rA   c                     | j                   S r*   r  r   s     r&   rn   z_OpStrPickleData.unpickle  s    yyr'   )rU   rV   rW   rZ   r   rO   rn   rc   r'   r&   r   r     s(    S T ~ # r'   r   c                   T    e Zd ZdeddfdZdedej                  j                  fdZ	y)r   r   r   Nc                     || _         y r*   r  r  s     r&   r   z_OpOverloadPickleData.__init__  r  r'   rA   c                     | j                  | j                        }t        |t        j                  j
                        sJ |S r*   )r   r   r+   r.   r2   r   r$   rA   r(   s      r&   rn   z_OpOverloadPickleData.unpickle  s5    ))$))4#uzz44555
r'   )
rU   rV   rW   rZ   r   rO   r.   r2   r   rn   rc   r'   r&   r   r     s2    S T ~ %**:O:O r'   r   c                   T    e Zd ZdeddfdZdedej                  j                  fdZ	y)r   r   r   Nc                     || _         y r*   r  r  s     r&   r   z$_OpOverloadPacketPickleData.__init__  r  r'   rA   c                     | j                  | j                        }t        |t        j                  j
                        sJ |S r*   )r   r   r+   r.   r2   r4   r  s      r&   rn   z$_OpOverloadPacketPickleData.unpickle  s5    ))$))4#uzz::;;;
r'   )
rU   rV   rW   rZ   r   rO   r.   r2   r4   rn   rc   r'   r&   r   r     s2    S T ~ %**:U:U r'   r   c                   0    e Zd ZdededdfdZdedefdZy)r   r   r   r   Nc                      || _         || _        y r*   )r   r   )r$   r   r   s      r&   r   z_OpBuiltinPickleData.__init__  s    		r'   rA   c                 &   | j                   dk(  rt        j                  | j                        S | j                   dk(  r dd l}| j                  || j                        S | j                   dk(  r | j                  t        | j                        S t        )Nbuiltinsmathr   r.   )r   __builtins__r   r   r  r   r.   r   )r$   rA   r  s      r&   rn   z_OpBuiltinPickleData.unpickle  sr    99
"##DII..YY& ((tyy99YY'!((		::%%r'   rU   rV   rW   rZ   r   rO   r!   rn   rc   r'   r&   r   r     s/    S   
&~ 
&& 
&r'   r   c                   ,    e Zd ZdeddfdZdedefdZy)r   r   r   Nc                     || _         y r*   r  r  s     r&   r   z_OpOperatorPickleData.__init__  r  r'   rA   c                 B    dd l }| j                  || j                        S )Nr   )operatorr   r   )r$   rA   r  s      r&   rn   z_OpOperatorPickleData.unpickle  s    $$Xtyy99r'   r  rc   r'   r&   r   r     s(    S T :~ :& :r'   r   c                       e Zd Zdej                  j
                  ddfdZdej                  j                  dedej                  j
                  fdZ	y)r   r   r   Nc                     |j                   | _        |j                  | _        i }|j                  D ]  }t        ||      ||<    t        |j                               | _        y r*   )_tracer_cls
tracer_cls_tracer_extrastracer_extrasnodesr   rY   values)r$   r   r  r   s       r&   r   z_GraphPickleData.__init__  sW    ++"1168KK 	7D)$6E$K	75<<>*
r'   r   rA   c                     t         j                  j                  || j                  | j                        }i }| j
                  D ]  }|j                  |||      ||<    |S r*   )r.   r/   r   r  r  r  rn   )r$   r   rA   r   r  nds         r&   rn   z_GraphPickleData.unpickle  s[     r4??D4F4FG68** 	BBE5.AE"I	B r'   )
rU   rV   rW   r.   r/   r   r   r0   rO   rn   rc   r'   r&   r   r     sL    +ehhnn + +&	((&&	8F			r'   r   c                       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       ZdeddfdZdedefd	Zy)
r:   rJ   r(   r   c                 B    | j                    | |      |j                  ffS r*   rm   ro   s      r&   r-   z'_TracingContextPickleData.reduce_helper  s*     LLC''
 	
r'   contextNc                 6   |j                   | _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        y 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#  s     r&   r   z"_TracingContextPickleData.__init__#  s    %44#*#>#> #00%44"..-4-R-R*.5.T.T+%4477 	0r'   rA   c                 b   t        |j                        }| j                  |_        | j                  |_        | j                  |_        | j
                  |_        | j                  |_        | j                  |_        | j                  |_        | j                  |_	        | j                  |_
        |S r*   )r   rM   r%  r&  r'  r(  r)  r*  r+  r,  r-  )r$   rA   r#  s      r&   rn   z"_TracingContextPickleData.unpickle9  s     !9!9:!%!4!4&*&>&>##00!%!4!4"..040R0R-151T1T.!%!4!444 	3 r'   )rU   rV   rW   r[   r   r.   r9   r   rY   r   r   rO   r    r-   r   rn   rc   r'   r&   r:   r:     s    
"
).)E)E
	$')E)EEFd''(	*

 

 
4 
,~ . r'   r:   )=r   r   rD   rh   abcr   typingr   r   r   r   r   r	   typing_extensionsr
   r   r.   torch.utils._pytreeutils_pytreer   torch._guardsr   torch._subclasses.fake_tensorr   r   r   torch._subclasses.meta_utilsr   r   r   r   r   %torch.fx.experimental.symbolic_shapesr   torch.utils._mode_utilsr   r7   SymFloatr   Picklerr   rO   r!   r    	UnpicklerrP   r6   r8   r,   r<   r1   r   r5   r   r   r   r   r   r   r:   rc   r'   r&   <module>r=     s<     	   C C ,  $ $ ( L L 
 3 : / Ku~~>	W$6>> W$tI I 3V< 
Bf&& 
B2 2>1 1>;
 ;
|) )X <" "JA# A#H} M - &= &$:M : @3 3r'   