
    '}h                        d dl Z d dlZd dl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mZmZmZ d dlZd dlmc mZ d dlmc mZ d dlmZ d dlmZmZmZmZmZ d dlm Z  d d	lm!Z!m"Z" g d
Z# G d de      Z$	 d6deejJ                  ejL                  f   dejN                  jP                  de)de$de*f
dZ+ G d dejN                  jP                        Z, G d de jZ                        Z. G d dejN                  jP                        Z/	 d7dedee.   de/fdZ0dej"                  jb                  ddfdZ2d Z3d e)d!e)de)fd"Z4d#ejN                  jP                  d$ejN                  jP                  fd%Z5d&ejN                  jP                  de)fd'Z6d&ejN                  jP                  dej"                  jn                  fd(Z8d&ejN                  jP                  dej"                  jn                  fd)Z9d*ejN                  jP                  de)d+ejN                  jP                  fd,Z: G d- d.      Z;d/ej"                  jb                  d0e/fd1Z<dejN                  jP                  d2ee)e)f   d3ee)   fd4Z=d5 Z>y)8    N)deepcopy)Enum)chain)AnycastDictListOptionalUnion)reorder_kwargs)ConstantArgumentExportedProgramModuleCallSignatureSymIntArgumentTensorArgument)is_fx_tracing)
GetAttrKeySequenceKey)InterpreterModuleUnflattenedModule	unflattenFlatArgsAdapterc                       e Zd ZdZdZdZy)	_AttrKind	parameterbufferconstantN)__name__
__module____qualname__	PARAMETERBUFFERCONSTANT     U/var/www/html/test/engine/venv/lib/python3.12/site-packages/torch/export/unflatten.pyr   r      s    IFHr%   r   from_obj	to_moduletarget	attr_kind
persistentc                 l   |j                  d      ^ }}|D ]>  }t        ||d       }|+t        j                  j	                         }t        |||       |}@ |t        j                  k(  r9t        | t        j                  j                        sJ |j                  ||        y |t        j                  k(  r1t        | t        j                        sJ |j                  || |       y |t        j                  k(  r:t        | t        j                  t        j                  f      sJ t        |||        y y )N.)r+   )splitgetattrtorchnnModulesetattrr   r!   
isinstance	Parameterregister_parameterr"   Tensorregister_bufferr#   ScriptObject)	r'   r(   r)   r*   r+   prefixfielditemts	            r&   _assign_attrr>   "   s    \\#&NVU ItT*9!AItQ'	 I'''(EHH$6$6777$$UH5	i&&	&(ELL111!!%j!I	i((	((U\\53E3E$FGGG	5(+ 
)r%   c                   \     e Zd ZdZdej
                  j                  f fdZd Zd Z	 xZ
S )r   zA module that uses torch.fx.Interpreter to execute instead of the usual
    codegen that GraphModule uses. This provides better stack trace information
    and makes it easier to debug execution.
    graphc                 R    t         |           || _        | | j                  _        y N)super__init__r@   owning_module)selfr@   	__class__s     r&   rD   zInterpreterModule.__init__C   s#     	
#'

 r%   c                    | j                   J d       t        j                  j                         r | j                   |i |S |rt	        |      }| j
                  t        |      d  }|D ]  }||v s|j                  ||           t        |      t        |      k(  sJ t        |      t        | j
                        k(  sJ t        |      }t        j                  j                  | | j                        j                  |ddiS )Nz&Didn't finalize this InterpreterModuler@   enable_io_processingF)graph_moduler0   compileris_dynamo_compilinglist	arg_nameslenappendtuplefxInterpreterr@   run)rF   argskwargsarg_listkwarg_names
kwarg_names         r&   forwardzInterpreterModule.forwardK   s     ,V.VV,>>--/ %4$$d5f55
  :"nnS]_="- <J!V+ z(:;< ;'3v;6668}DNN(;;;;X88''DJJ'?CC,1 r%   c                 T   t         j                  j                  | | j                        | j                  d<   | j                  j                          g | _        | j                  j                  D ]7  }|j                  dk(  s| j                  j                  |j                         9 y )NrK   placeholder)r0   rS   GraphModuler@   __dict__lintrO   nodesoprQ   r)   rF   nodes     r&   finalizezInterpreterModule.finalizeh   sy     ).(<(<T4::(Nn%

 JJ$$ 	3Dww-'%%dkk2	3r%   )r   r   r    __doc__r0   rS   GraphrD   r[   re   __classcell__rG   s   @r&   r   r   =   s'    
(xx~~(:3r%   r   c            
       z    e Zd ZdZej
                  dej                  dej                  dee	   dee	   fd       Z
y)r   zN
    Adapts input arguments with ``input_spec`` to align ``target_spec``.
    target_spec
input_spec
input_argsreturnc                      y)z=NOTE: This adapter may mutate given ``input_args_with_path``.Nr$   )rF   rk   rl   rm   s       r&   adaptzFlatArgsAdapter.adapt   s     	r%   N)r   r   r    rf   abcabstractmethodpytreeTreeSpecr	   r   rp   r$   r%   r&   r   r   z   sW     	__ OO I	
 
c r%   r   c                   8     e Zd Z	 ddedee   f fdZd Z xZS )r   export_moduleflat_args_adapterc                 r   t         |           |j                  j                  t	        d      t        |j                        }t        |j                        | _        t        j                  j                         | _        t        |j                        | _
        || _        d| _        t        || j                         t        ||        |j                  | _        g | _        |j"                  }| j                  j$                  D ]O  }t        j&                  j)                  ||   j+                               }t-        || |t.        j0                         Q t3        | j                  j4                        }| j                  j6                  D ]Y  }||v r d}|j8                  |   j+                         }nd}||   j+                         }t-        || |t.        j:                  |       [ t=        | j                  j>                  | j                  j@                        D ]X  }	|j8                  |	   }
tC        |
t        jD                        r|
j+                         }
t-        |
| |	t.        jF                         Z i | j                  jH                  | j                  jJ                  | j                  jL                  | j                  jN                  }tQ        | |g        | jS                         D ]b  }tC        |t        j                  jT                        s(|j                  jV                  D ]"  }|jX                  dk7  r|jZ                  |vr"J  d | j                  jV                  D cg c]  }|jX                  dk(  s| c}| _.        d| _/        | j                  d   j`                  dk(  sJ y c c}w )	Nz%Unflattening on JointExportModule NYIF)r*   T)r*   r+   r]   r    )1rC   rD   graph_signaturebackward_signature
ValueErrorr   r@   r0   rS   rg   module_call_graphrw   adapted_inplace_buffer_mutations_outline_submodulesrange_constraintsequality_constraints
state_dict
parametersr1   r5   cloner>   r   r!   setnon_persistent_buffersbuffers	constantsr"   r   lifted_tensor_constantslifted_custom_objsr4   r7   r#   inputs_to_parametersinputs_to_buffers!inputs_to_lifted_tensor_constantsinputs_to_lifted_custom_objs_sink_paramsmodulesr^   ra   rb   nameinput_placeholderscheck_input_constraintsfqn)rF   rv   rw   export_graphr   r   clonedr   r+   r   r   inputs_to_statemodulerd   rG   s                 r&   rD   zUnflattenedModule.__init__   sM   
 	((;;GDEE 3 34'(E(EFXX^^%
!)-*I*I!J!2!,0D0DEL$/!.!@!@*,!"--
((33 	DXX''
4(8(>(>(@AF#--		 "%T%9%9%P%P!Q((00 	D--"
&006<<>!
#D)//1#**%	    88  33
 	C %..s3H(ELL1#>>+#,,		+
""77+
""44+
 ""DD+
 ""??	+
 	T?B/lln 	8Ffehh&:&:;** 877m+yy7778	8 "ZZ--#
M1ID#
 (,$%%a(,,222	#
s   -N4N4c                    | j                   d   j                  }t        ||j                        }t	        j
                  ||f      \  }}|D cg c]  }|d   	 }}t               r_t        j                  j                  | | j                        j                  |ddi}	t        |	t              rt        |	      dk(  r|	d   S |	S ||j                  k7  r| j                  st!        d| dd|j                          | j"                  t%        d	      | j                  st!        d
       | j"                  j'                  |j                  ||      }d| _        t        |      |j                  j(                  k7  r.t%        dt        |       d|j                  j(                         | j*                  r\ddlm}
 | j                  du r(|D cg c]  }t1        d      t3        d      f|f }}n|} |
| j4                  || j6                         t        j                  j                  | | j                        j                  |ddi}t	        j8                  ||j:                        S c c}w c c}w )Nr      rI   rJ   FzGInput treespec does not match with exported module's: 
Input treespec: z. zExported module treespec: zeThere is no flat args adapter sepcified. Are you sure you are calling this with the right arguments? z5Adapting flat arg to match exported module's treespec)rk   rl   rm   Tz<Flat args adaption failed, number of args mismatch Adatped: z 
Exported module: )"_check_input_constraints_for_graph)idxz<unknown location>r   )r}   	signaturer   in_specrs   tree_flatten_with_pathr   r0   rS   rT   r@   rU   r4   rR   rP   r~   printrw   	TypeErrorrp   
num_leavesr   torch._export.utilsr   r   r   r   r   tree_unflattenout_spec)rF   rV   rW   r   reordered_kwargsflat_args_with_pathr   x	flat_args
return_valr   argnew_flat_args_with_pathtree_outs                 r&   r[   zUnflattenedModule.forward   s   **1-77	)&)2C2CD'-'D'D#$(
$W $77aQqT7	7?--d$**-EII16J *e,ZA1E!!}$i'''<<''.ir301B1B0CD
 %%-S 
 ||QR 2288 ) 1 1&( 9 	
  $y>Y%6%6%A%AA#$$'	N#3 4,,5,=,=,H,H+IK  '' O||t#  )+ "a(*:N*OPRUV+' +
 +>'.'')@$BXBX 88''DJJ'?CC
-2
 $$Xy/A/ABBy 8^+s   I,!I1rB   )	r   r   r    r   r
   r   rD   r[   rh   ri   s   @r&   r   r      s/     8<X3&X3 $O4X3tDCr%   r   r   rw   rn   c                     t        | |      S )a  Unflatten an ExportedProgram, producing a module with the same module
    hierarchy as the original eager module. This can be useful if you are trying
    to use :mod:`torch.export` with another system that expects a module
    hierachy instead of the flat graph that :mod:`torch.export` usually produces.

    .. note:: The args/kwargs of unflattened modules will not necessarily match
        the eager module, so doing a module swap (e.g. :code:`self.submod =
        new_mod`) will not necessarily work. If you need to swap a module out, you
        need to set the :code:`preserve_module_call_signature` parameter of
        :func:`torch.export.export`.

    Args:
        module (ExportedProgram): The ExportedProgram to unflatten.
        flat_args_adapter (Optional[FlatArgsAdapter]): Adapt flat args if input TreeSpec does not match with exported module's.

    Returns:
        An instance of :class:`UnflattenedModule`, which has the same module
        hierarchy as the original eager module pre-export.
    )r   )r   rw   s     r&   r   r   ,  s    , V%677r%   r@   c                    t        t        t        | j                                    }|j                  dk(  rt        |j                        dk(  sJ |j                  d   }|j                  }|dt        |       }|j                  j                         D ci c]  \  }}||
 }}}| j                  D 	ci c]  }	|	j                  dk(  s|	j                  |	! }
}	|D ]  }||j                     }||   }|
|   }| j                  |      5  | j                  dt        j                  j                  j                   ||f      |j"                  j                         D ]  \  }}|j"                  |<    	 ddd       |j%                  fd        t'        |t        |      d       }|f|_        yc c}}w c c}	w # 1 sw Y   KxY w)a  Transform buffer mutations from their functionalized form into a copy_
    node in the graph.

    Functionalization represents buffer mutation by passing the buffer as an input and output. So for example, the eager code:
        def forward(self, x):
            self.buffer += x
            return x * x

    Will become a graph that looks like:
        def forward(self, buffer, x):
            mutated_buffer = aten.add(buffer, x)
            mul = aten.mul(x, x)
            return (mutated_buffer, mul)

    We want to inplace this into something that looks like the original eager code:
        def forward(self, buffer, x):
            mutated_buffer = aten.add(buffer, x)
            buffer.copy_(mutated_buffer)
            mul = aten.mul(x, x)
            return (mul,)
    outputr   r   Nr]   call_functionc                     | uS rB   r$   )r   new_nodes    r&   <lambda>z+_inplace_buffer_mutations.<locals>.<lambda>r  s    1H;L r%   )nextiterreversedra   rb   rP   rV   buffers_to_mutater   itemsr   inserting_aftercreate_noder0   opsatencopy_metareplace_all_uses_withrR   )r@   rz   output_nodereturn_argsmutation_node_to_buffer	mutationskvbuffers_to_inputsrd   input_name_to_nodemutationbuffer_name
input_name
input_nodeuser_outputsr   s                   @r&   r   r   E  s   , tHU[[123K>>X%#k.>.>*?1*DDD""1%K-??:c"9:;I*9*K*K*Q*Q*ST$!QATT$)KK 477m3K		4   N-hmm<&{3
'
3
""8, 	%((!5!5
H7MH !++- %1#$a %		% 	&&x1LMN" C/023L &(K3 U	% 	%s   F46F:F:A)F??G	c                 V    t        |       t        |      k  xr |dt        |        | k(  S )z2Check whether `candidate` is a prefix of `target`.N)rP   )	candidater)   s     r&   
_is_prefixr   }  s+    y>CK'QF3CS^,D	,QQr%   
parent_fqn	child_fqnc                     | dk(  r|S | j                  d      }|j                  d      }|d t        |       |k(  sJ d| d|  d       dj                  |t        |      d        S )Nry   r-   zChild module 'z(' is not a descendant of parent module '')r.   rP   join)r   r   parent_splitchild_splits       r&   _compute_accessorr     s    R##C(L//#&K 	'c,'(L8Y		{"J:,VWXY888KL 1 3455r%   r   yc                     dt         j                  j                  dt        fd} || j                         ||j                        k(  sJ y )Nr@   rn   c                 V  
 g }i 
dt         f
fd}t        | j                        D ]  \  }}t        j                  ||j
                        D cg c]  }t        |       }}|t        j                  ||j                        j                         D cg c]  \  }}| d|  c}}z  }|j                  dk(  r|j                  nd}	|j                  | d|j                   d|	 dd	j                  |       d
       |
t        |      <    dj                  |      S c c}w c c}}w )Nrn   c                     t        | t        j                  j                        rdt	        t        |                z   S t	        |       S )N%)r4   r0   rS   Nodestrid)r   	nodes_idxs    r&   arg_dumpz?_verify_graph_equivalence.<locals>.graph_dump.<locals>.arg_dump  s7    #uxx}}-S2c7!3444s8Or%   =r   ry   z: [z](z, )
)r   	enumeratera   rs   tree_maprV   rW   r   rb   r)   rQ   r   r   )r@   retr   ird   r   	args_dumpkeyvaluer)   r   s             @r&   
graph_dumpz-_verify_graph_equivalence.<locals>.graph_dump  s   $&		S 	
 !- 	$GAt-3__Xtyy-QRcSRIR"(//(DKK"H"N"N"PC %q  I %)GG$>T[[BFJJ!Btwwiq499Y3G2HJK"#Ibh	$ yy~ Ss   D D%
)r0   rS   rg   r   r@   )r   r   r   s      r&   _verify_graph_equivalencer     s?    %((.. S ( agg*QWW"5555r%   gmc                 v    d}t        | d|       r|dz  }t        | d|       rd| }t        | ||       |S )Nr   _spec_r   )hasattrr3   )r   specr   r   s       r&   	_add_specr     sN    	A
"qcl
#	Q "qcl
#A3<DBdKr%   c                     t        | |      }| j                  j                  |      }| j                  j                  t        j
                  ||f      S rB   )r   r@   get_attrr   	fx_pytreetree_flatten_spec)r   rd   r   r   	spec_nodes        r&   _generate_flattenr     sD    RD!!$'I88!!)"="=i?PQQr%   c                     t        | |      }| j                  j                  |      }| j                  j                  t        j
                  ||f      S rB   )r   r@   r   r   rs   r   )r   ra   r   r   r   s        r&   _generate_unflattenr     sD    RD!!$'I88!!&"7"7%9KLLr%   modmodule_to_addc                 "   |j                  d      ^ }}|D ]d  }t        | |d       }|+t        j                  j	                         }t        | ||       t        |t        j                  j                        s y|} f | j                  ||       y )Nr-   F)r.   r/   r0   r1   r2   r3   r4   
add_module)r   r)   r  r:   r;   r<   submods          r&   _add_submoduler    s|    \\#&NVU 
dD)>XX__&FCv&&%((//2
 NN5-(r%   c                       e Zd Z	 ddeeef   deej                  j                     fdZ
d Zd Zd Zd Zd	 Zd
 Zd Zy)_ModuleFrameNr}   r   c
                 |   || _         || _        || _        || _        || _        || _        || _        || _        d| _        | j
                  d   | _	        |	|	| _
        n,t        t        j                  j                               | _
        | j                  | j                  v r| j                  | j                     | _        n*d | _        | j                  | j                  | j                  <   | j                  j                   | _        i | _        i | _        d | _        |yt)        |j                  | j                        }
t+        |j                  |
| j                  | j                  n| j                         |j                   j-                  |
      | _        |j/                  | j                        }|f| j                  X|j0                  j2                  dk(  sJ |j0                  j4                  d   }|j0                  j4                  d   }|j6                  J |j6                  J | j                   j9                  d       5  g }t;        |j2                        D ]/  }|j=                  | j                   j?                  d|              1 i }|j6                  D ]   }| j                   j?                  |      ||<   " tA        | j                  tC        |      |f|j0                        }tE        |jF                        D ]  \  }}| j                   jI                  dtJ        jL                  ||ftO        |tP              s|jR                  nd| 	      }tO        |tP              retU        jT                  | j                  |jR                     jV                        |_+        || j$                  | j                  |jR                     <    	 d d d        | j                  j                   jY                  | j&                        5  g }|jF                  D ]  }tO        |tP              r|jZ                  |j=                  d        1tO        |t\        t^        f      sJ |j=                  | j                  ja                  | j                  |jR                                   tc        | j                  j                  ||j0                        }| j                  j                   je                  tJ        jL                  |df      }| j                  j                   je                  tJ        jL                  |df      }t;        |j2                        D cg c]8  }| j                  j                   je                  tJ        jL                  ||f      : }}|j6                  D ci c]9  }|| j                  j                   je                  tJ        jL                  ||f      ; }}d d d        | j&                  J tC              | j&                  _3        | j&                  _4        y y y # 1 sw Y   SxY wc c}w c c}w # 1 sw Y   \xY w)
NF   r   r   _positional_arg_r   
_constant_)rb   r)   rV   r   )5
flat_graphra   
seen_nodesseen_modulesparentmodule_stack	module_idr}   verboser   r   r   r0   rS   rg   cached_graph_moduler@   node_mapnode_to_placeholderparent_call_moduler   r  call_modulegetr   num_childrenchildren_specscontextr   rangerQ   r]   r   rR   r   inputsr   operatorgetitemr4   r   r   copyr   inserting_beforer   r   r   remap_inputr   r   rV   rW   )rF   r  ra   r  r  r  r  r  r}   r   accessorr   	args_speckwargs_spec	arg_nodesr   kwarg_nodesr   r   r   flat_arg_nodeinput_nodesinputinputs_node	args_nodekwargs_noder   r   s                               r&   rD   z_ModuleFrame.__init__  s    %
$(("!2$$R( DK+EHHNN,<=DK>>T...'+'8'8'HD$'+D$04Ddnn-[[&&
 =?#% ;?(TXX>H++3 -- '-ll&>&>x&HD#%))$((3	 T[[%<$$11Q666!))88;I#++::1=K$$,,,&&222++D1 X	 !7!78 WC$$TZZ%;%;>Nse<T%UVW '// ED(,

(>(>t(DK%E-KK9%{3%%	
 !*)*:*: ; XHC$(JJ$:$:*'//'-)#/?@ !XX)#/ %; %M "#'78 )-4??3883L3Q3Q)RM&JWD,,T__SXX-FGXX4 ""33D4K4KL  =?&-- E!%)9:u{{?R#**40)%..1QRRR#** KK33DOOEJJ4OP 2KK&&%% !KK--;;$${A&6	 #kk//==$${A&6
 #9#9#9: KK%%33H4D4DyRSnU	  )00	  t{{((66 ((;*:  7 B **666+0+;D##(-8D##*I &= X Xb7   s8   FXE	X2
=X(X2>X-X2X%(
X22X;c                 `   |j                   | j                  u sJ | j                   j                  d       5  | j                   j                  |j                  |j
                        }d d d        t        j                  |j                        _        || j                  |<   y # 1 sw Y   =xY w)N)	type_expr)	r@   r  r"  r]   r   typer!  r   r  )rF   r   placeholder_nodes      r&   add_placeholderz_ModuleFrame.add_placeholderK  s    ww$//)))ZZ((. 	P#zz55aff5O	P !%		!&& 1&6  #	P 	Ps   2B$$B-c                 N   |j                   | j                  u sJ || j                  v r| j                  |   S || j                  vrR| j	                  |       | j
                  5| j
                  j                  d| j                  j                  |             | j                  |   S )Nr   )	r@   r  r  r  r3  r  
insert_argr  r#  )rF   r   s     r&   r#  z_ModuleFrame.remap_inputU  s    ww$//)))==##D,,,  #&&2 ''221dkk6M6Ma6PQ''**r%   c                 p    g } j                   j                   j                        }|ԉ j                  |j                  D ]N  }t        |t        t        f      r)|j                   j                  |j                            Bt        d|        t         j                  t         fd|D              |j                        }t!         j                  j                   j"                  |j                        }|}ng } j$                  j'                         D ]\  }|j(                  D ]K  }|j                   j                  vs|j                  |       |j                   j$                  |           \ ^  j"                  }t+        |      dk(  r|d   }t        |t,        t.        j0                  j2                  f      sJ  j4                  j7                  |       |y t        |t.        j0                  j2                        r|j8                  j                  d      n(|D 	cg c]  }	|	j8                  j                  d       c}	|j8                  d<   t+        |      dk(  r|| j                  j$                  |d   <   nt;        |      D ]r  \  }
}t.        j0                  j=                  |      |
   j>                  }|j8                  j                  d      |j8                  d<   | j                  j$                  |<   t  j@                  !tC         j@                   j                         y y c c}	w )Nz'Unsupported data type for output node: c              3   j   K   | ]*  }j                   j                  |j                         , y wrB   )r  r  r   ).0r   rF   s     r&   	<genexpr>z0_ModuleFrame.finalize_outputs.<locals>.<genexpr>p  s/       MM$//&++">?s   03r   r   val)"r}   r  r   r  outputsr4   r   r   rQ   r  r   RuntimeErrorr   r   rR   r   r   r  r  keysusersrP   rN   r0   rS   r   r@   r   r   r   Proxyrd   r  r   )rF   orig_outputsr   r   tree_out_node
parent_outgraph_outputs	orig_node	user_nodeor   orig_output	proxy_outs   `            r&   finalize_outputsz_ModuleFrame.finalize_outputsa  s   **..txx8	 T[[%<#++ f~~&FG ''(DE&A&J 	 0 ".  ""M 3D""D$;$;Y=O=O3J HUMM!]]//1 	!* I ~~T__<$++I6%,,T]]9-EF 00J=!Q& -a 0-$)>???

-(  -7 ""5)-:;!&&**U#; 	 |!i&74>DKK  a1"+L"9 >;!HHNN:6q9>>	(3(8(8(<(<U(C	u%4=$$[1	> ##/%d&>&>L 0 <s   &"L3c                     | j                  d|j                                | j                  j                  || j                        | j
                  |<   || j                  |j                  <   y )Ncopying)r   format_noder@   	node_copyr#  r  r  r   rc   s     r&   	copy_nodez_ModuleFrame.copy_node  sP    

9d..01"jj2249I9IJd%)		"r%   c                     d}| j                   j                  D ]A  }| j                  ||j                  j	                  d      |j                                |dz  }C d}| j                  |   }|j                  dk(  r5| j                  |       |dz  }| j                  |   }|j                  dk(  r5| j                  |       | j                   j                  D ]#  }|j                  dk(  s| j                  |       % y )Nr   nn_module_stackr   r]   r   )	r  ra   r   r   r  rL  rb   rN  run_from)rF   r   rd   node_idxs       r&   	run_outerz_ModuleFrame.run_outer  s    OO)) 	DJJq$))--(9:D<L<L<NOFA	
 zz(#gg&NN4 MH::h'D gg&
 	h OO)) 	%Dww("t$	%r%   c                 4    | j                   rt        |i | y y rB   )r  r   )rF   rV   rW   s      r&   r   z_ModuleFrame.print  s    <<4"6" r%   c                 T   d}|t        | j                        k  r| j                  |   }|j                  dk7  sJ | j                          | j                  d||j	                                | j                  | j
                         |j                  dk(  r,t        | j
                        dk(  r|S | j                          |S d|j                  v r0|j                  d   j                         D cg c]  \  }}|	 c}}n| j
                  }|d t        | j
                         | j
                  k7  rI| j                          | j                  d| j                         | j                  | j                         |S |J t        | j
                  |      r|t        | j
                           }| j                  d|       t        | j                  | j                  | j                  | j                  | | j
                  |gz   t!        |j                  d   j#                               t        | j
                           | j$                        j'                  |      }|dz  }^|| j
                  k(  sJ | j)                  |       |dz  }|t        | j                        k  ry y c c}}w )	Nr   r]   STEPr   r   rP  	outliningzCreating new stack frame for)rP   ra   rb   r   rL  r  rI  r   valuesr   r@   r   r  r  r  r  rN   r=  r}   rQ  rN  )rF   rR  
module_idxrd   pathtynode_module_stacknext_modules           r&   rQ  z_ModuleFrame.run_from  sT   
TZZ(::h'D77m+++JJLJJvx)9)9);<JJt(()ww("t(()Q. $O %%' %		1 '+ii0A&B&I&I&KL($L&& 
 !!93t'8'8#9:d>O>OO %%'

;1

4::&$000$++->? 0D4E4E0FG

9;G (OOJJOO%%%%5#45::<=c$BSBS>TU**	 (8$  a
 %(9(9999NN4 MHy TZZ(& Ms   1J$rB   )r   r   r    r   r   r   r
   r0   r1   r2   rD   r3  r#  rI  rN  rS  r   rQ  r$   r%   r&   r  r    sb     -1y9  %8 89y9 )y9v7
+@MD*
%*#?r%   r  
orig_graphroot_modulec                     i }i }t        | t        | j                        ||d dgd|j                  D ci c]%  }|j                  r|j
                  |j                  ' c}|	      j                          y c c}w )Nry   )r   )r  rR   ra   r}   r   r   rS  )r^  r_  r  r  entrys        r&   r   r     s{    +-J/1Lj	
 %66	
 IIu&	

  ik	
s   *A5r   scopec                    | j                   j                         D ]8  \  }}t        t        t        j
                  j                  |      ||gz          : t        | d      sy| j                  }t        t        d |j                              }|d   }t        d |j                        }|D ])  }	t        t        fd|	j                              |	_        + |D ]  }	|	j                  vrt        |	j                         dkD  rĉ|	j                     j#                  d      }
|
dt        |       |k7  rZ|
t        |      d }t%        | |      }t'        |t        j(                  t        j*                  f      sJ |j-                  |      5  |j/                  d	dj1                  |            }ddd       |	j3                  d
       |j5                  |	        t'        | t6              r| j9                          yy# 1 sw Y   RxY w)aT  Sink params, buffers, and constants from graph inputs into get_attr nodes.

    Exported modules are purely functional, so they pass their parameters and
    buffers in as inputs to the graph.

    To replicate eager's semantics, we need to get them from the module state
    via get_attr instead.

    module: GraphModule, potentially containining nested submodules.
    inputs_to_state: mapping graph input names to the corresponding key in the state_dict.
    scope: tracks where we are in the module hierarchy, so that we can emit the
        right `getattr(self, "foo.bar")` calls, etc.
    r@   Nc                      | j                   dk(  S )Nr]   rb   ns    r&   r   z_sink_params.<locals>.<lambda>3  s    144=#8 r%   r	  c                      | j                   dk(  S )Nr  re  rf  s    r&   r   z_sink_params.<locals>.<lambda>7  s    )> r%   c                      | j                   vS rB   r   )rg  r   s    r&   r   z_sink_params.<locals>.<lambda>9  s    166+H r%   r   r-   r   T)propagate_meta)_modulesr   r   r   r0   r1   r2   r   r@   rN   filterra   rR   rV   r   rP   r>  r.   _recursive_getattrr4   r7   r9   r   r   r   r   
erase_noder   re   )r   r   rb  r   	submoduler@   r  the_last_inputcall_module_nodesrd   
state_name	attr_path
state_attrr   s    `            r&   r   r     s   ( "??002 XiT%((//95QUPVWX 67#LLE&8%++FGFBZN >L! V&!H$))TU	V  99O+tzz?Q(399#>J ,CJ'50"3u:<0I+FI>Jj5<<9K9K*LMMM &&~6 N ,,Z)9LMN &&x&E12 &+, -N Ns   "H  H		c                 ,    |D ]  }t        | |      }  | S rB   )r/   )objrs  attrs      r&   rm  rm  X  s$     !c4 ! Jr%   )TrB   )?rq   r!  r  r   enumr   	itertoolsr   typingr   r   r   r	   r
   r   r0   torch.fx._pytreerS   _pytreer   torch.utils._pytreeutilsrs   torch.export._tree_utilsr   torch.export.exported_programr   r   r   r   r   torch.fx._symbolic_tracer   r   r   __all__r   r7   r9   r1   r2   r   boolr>   r   ABCr   r   r   rg   r   r   r   r   r   r   r   r   r  r  r   r   rm  r$   r%   r&   <module>r     s_   
      9 9  $ $ $ $ 3  3 7
T  ,ELL%"4"445,xx, , 	,
 ,6:3 :3zcgg  _C _CF MQ88080I8825)UXX^^ 5) 5)pR
6# 6# 6# 66 6UXX__ 60%((// C R%((// R%((-- RMEHHOO MUXX]] M) ) )UXX__ )$q qh	EHHNN AR (>HHOO>#s(^> 9>Br%   