
    ȅi                     X   S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJrJrJrJrJr  S SKrS SKrS SKrS SKJs  Jr  S SKJr  S SKJrJrJr  S SKJ r J!r!  S S	K"J#r#  S S
K$J%r%J&r&  S SK'J(r(  S SK)J*r*  S SK+J,r,J-r-  S SKJ.r.  S SK/J0r0  S SK1J2r2J3r3J4r4J5r5  S SK6J7r7J8r8J9r9  S SK:J;r;J<r<  S SKJ=r=  \(       a  S SK>J?r?  \" S5      r@\R                  " \B5      rCS\2S\S\4   S\S\S\24
S jrD/ SQrES\FS\F4S jrG SAS \R                  R                  S!\JS\R                  R                  4S" jjrKS \R                  R                  SS4S# jrL " S$ S%\R                  R                  5      rO\" S&S'S(/5      rP " S) S*\R                  R                  5      rRS+\R                  R                  S,\S\4   S-\S.   S/\S\S\S0\\\S\F\4   \T\   \U\   4      SS4S1 jrVS2\R                  R                  SS4S3 jrW\" S4S59 " S6 S75      5       rXS8\S9\S\T\S4   S\S\F\4   S\X4
S: jrYS;\R                  R                  SS4S< jrZ SBS9\S\4   S=\\U\-      S\S\4   4S> jjr[SSS?.S9\S\4   S=\\U\-      S0\\\S\F\4   \T\   \U\   4      S\S\R                  R                  4   4S@ jjr\g)C    N)
namedtuple)CallableIterableSequence)	dataclass)AnyOptionalTYPE_CHECKINGTypeVarUnion)enable_python_dispatcher)CaptureOutputfullgraph_captureget_traced_fn)argument_namescheck_user_input_output)UserErrorType)dynamo_timedget_metrics_context)_compiling_state_context)TracingContext)_RelaxedConstraint
Constraint)Node)make_fx)ConstraintViolationError
DimDynamicShapeEnvStatelessSymbolicContext)_ExportCodeGen_PyTreeCodeGen_PyTreeInfo)ArgumentTarget)TreeSpec)FakeTensorModeTconstraint_violation_errorfunc.argskwargsreturnc                     SSK JnJn  [        R                  " U5      nU" X#4U5      nU R
                  (       a  U" U R
                  S   U5      4U l        U $ )z
Because we trace a different callable, the sources are all messed up.
Manually patch them so the error message looks correct.
r   )_get_input_paths_replace_sources)torch.export._unliftr.   r/   inspect	signaturer*   )r(   r)   r*   r+   r.   r/   orig_sigflat_input_pathss           Y/home/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/functional_export.pypost_process_error_msgr6   +   sZ     H  &H'A!&&7<<Q?AQR+
"' &%    ))__export_root__)z_export_root. )z._export_rootr:   textc                 J    U n[          H  u  p#UR                  X#5      nM     U$ )z;Generic utility to clean export_root patterns from strings.)EXPORT_ROOT_REPLACEMENTSreplace)r;   resultpatternreplacements       r5   clean_export_root_stringrB   G   s'    F 85 !9Mr7   graph_moduleis_inline_builtinc                   ^ S[         [        [        [        [        4   4   S[         [        [        [        [        4   4   4U4S jjnS[        [           S[        [           4S jnU R
                  R                   H  nSUR                  ;   a0  U" UR                  S   R                  5       5      UR                  S'   UR                  R                  SS5      nU(       d  Mh  U" UR                  5       5      UR                  S'   M     SU R                  ;   aN  0 nU R                  S   R                  5        H  u  px[        U5      U[        U5      '   M     UU R                  S'   U $ )a  
Clean up nn_module_stack metadata by removing export_root references.

Removes the _export_root module references from nn_module_stack metadata
in graph nodes, which are artifacts from the export process. Fixes two patterns:

1. Keys: Removes "__export_root_" and "__modules['_export_root']_" prefixes
   - Normal case: "L__self____export_root_child" -> "L__self__child"
   - inline_builtin case: Uses numeric ID strings like "140468831433840"

2. Values: Removes "._export_root" and "._modules['_export_root']" from child names
   e.g., "L['self']._export_root.child" -> "L['self'].child"
   e.g., "L['self']._modules['_export_root'].child" -> "L['self'].child"

Also removes the root export entry "L__self____export_root" entirely.

Args:
    graph_module: The GraphModule to clean up
    is_inline_builtin: If True, keys are numeric ID strings and self references
                      (L['self']) are filtered out

Returns:
    The cleaned GraphModule (modified in-place)
nn_module_stackr,   c                    > SU ;   a  U S	 0 nU R                  5        H2  u  nu  p4[        U5      n[        U5      nT(       a  US:X  a  M-  Xd4X'   M4     U$ )NL__self____export_rootz	L['self'])itemsrB   )rF   cleaned_stackkey
child_namechild_class	clean_key
clean_namerD   s          r5   _process_nn_module_stackEclean_nn_module_stack_and_source_fn.<locals>._process_nn_module_stackk   sq     $6 89 .=.C.C.E*C**05I 2*=J !Z;%>(2'@M$ /F r7   source_fn_stackc                    / nU  H  n[        U[        5      (       aZ  [        U5      S:X  aK  Uu  p4[        U[        5      (       a  [	        U5      nUR                  XT45        M_  UR                  U5        Mr  UR                  U5        M     U$ )N   )
isinstancetuplelenstrrB   append)rR   rJ   itemnameclsrO   s         r5   _process_source_fn?clean_nn_module_stack_and_source_fn.<locals>._process_source_fn   s}    #D$&&3t9> 	dC((!9$!?J!((*):; "((.$$T* $ r7   N dynamo_flat_name_to_original_fqn)dictrX   rV   r'   r   graphnodesmetacopygetrI   rB   )	rC   rD   rP   r]   noderR   clean_name_to_original_fqn	flat_nameoriginal_fqns	    `       r5   #clean_nn_module_stack_and_source_fnrj   O   sS   8c5a=01	c5a= 	!,HQK HQK   ""((		)+C		+,113,DII'( ))--(94@?+=o>R>R>T+UDII'( ) *\->->>%'"'3'8'8.(

%'(#I )6 ''?	'JK( ' 	<= r7   c                 b   0 nU R                   R                   GH  nUR                  S:X  a  UR                  n[	        U5      nXC:w  a  XBl        [        X5      (       d   e[        R                  R                  R                  X5      n[        R                  R                  R                  XPU5        [        R                  R                  R                  X5        UR                  S:X  d  M  UR                  n[        U[        5      (       d   e[	        U5      n[        U[        5      (       d   e[	        UR                  5      nXC:X  a  GM8  X1;   a  X   Ul        Xbl        GMO  U R                  U5      nU R!                  U5        U R#                  XG5        XBl        Xbl        XAU'   GM     g)z3Remove export_root artifacts from FX graph in-placeget_attrcall_moduleN)ra   rb   optargetrB   hasattrtorchfxrC   	_get_attr_assign_attr	_del_attrrU   rX   r[   get_submoduledelete_submoduleadd_submodule)rC   clean_named_module_maprf   
old_target
new_targetparamnew_namero   s           r5   clean_export_rootr~      s]   
 .0 ""((77j J1*=J'(|8888--77Q%%225
S%%//I77m#Jj#....1*=Jj#..../		:H' 34@$	!//
;F))*5&&z:$K I1;:.? )r7   c                   J   ^  \ rS rSrS\S\SS4U 4S jjrS\SS4S	 jrS
rU =r$ )ModuleToTrace   fooin_specr,   Nc                 :   > [         TU ]  5         Xl        X l        g N)super__init___export_rootr   )selfr   r   	__class__s      r5   r   ModuleToTrace.__init__   s    r7   	flat_argsExportTracerOutputc                     [         R                  " XR                  5      u  p#U R                  " U0 UD6n[         R                  " U5      u  pV[        XV5      $ r   )pytreetree_unflattenr   r   tree_flattenr   )r   r   r*   r+   resout_flatout_specs          r5   forwardModuleToTrace.forward   sK    ,,YE00#005!(55r7   )r   r   )	__name__
__module____qualname____firstlineno__r   r   r   __static_attributes____classcell__r   s   @r5   r   r      s6    C # $ 
6# 6*> 6 6r7   r   r   r   r   c                     ^  \ rS rSrSr SS\R                  R                  S\\	   S\\
\      S\\\4   S\\\\\	4   4   S	\\	   S
S4U 4S jjjrSU 4S jjrSS jrS\S\\S4   S\\\	4   S
\	4U 4S jjrS\S\\	   S\\\	4   S
\	4U 4S jjrS\S
\	4U 4S jjrS
\R                  R                  4U 4S jjrSrU =r$ )DynamoGraphTransformer   zZGraph transformer for dynamo export that flattens inputs/outputs without complex matching.Nmoduleflat_inputsflat_args_dynamic_dimsgraph_input_ordergraph_output_map	fake_moder,   c                   > [         TU ]  U5        [        U5      [        U5      :X  d   eX l        X0l        X@l        XPl        X`l        UR                  R                   Vs/ s H  owR                  S:X  d  M  UPM     snU l        [        S UR                  R                   5       5      U l        0 U l        U R                  5         0 U l        U R#                  5         g s  snf )Nplaceholderc              3   H   #    U  H  oR                   S :X  d  M  Uv   M     g7f)outputN)rn   ).0ns     r5   	<genexpr>2DynamoGraphTransformer.__init__.<locals>.<genexpr>   s     R+=aAQ+=s   "	")r   r   rW   r   r   r   r   r   ra   rb   rn   placeholdersnextoutput_nodenew_input_nodes_create_flattened_inputsold_to_new_mapping_create_placeholder_mapping)	r   r   r   r   r   r   r   r   r   s	           r5   r   DynamoGraphTransformer.__init__   s     	 )*c+.>>>>&&<#!2 0" )/(:(:T(:1ddm>SQ(:TR6<<+=+=RR :<%%' #%((* Us   !C 8C c                   > [        [        U R                  5      5       GH3  n[        TU ]  SU 3S0 5      nXR
                  ;   az  U R
                  U   nU[        U R                  5      :  aR  U R                  U   nUR                  R                  5        H%  u  pVUS:w  d  M  XbR                  R                  U'   M'     U R                  Gb  [        U R                  U   [        R                  5      (       a  U R                  R                  U R                  U   [        [        [        U R                  U   R                   5      5       Vs/ s H5  nXpR"                  U   ;   a  [$        R&                  O[$        R(                  PM7     snS/[        U R                  U   R                   5      -  S9S9UR                  R                  S'   Ou[+        U R                  U   S5      (       a1  U R                  U   R,                  UR                  R                  S'   O&U R                  U   UR                  R                  S'   X R.                  U'   GM6     gs  snf )zKCreate new placeholder nodes for flattened inputs with proper fake tensors.arg_ valN)dynamic_sizesconstraint_sizes)symbolic_context)rangerW   r   r   r   r   r   rc   rI   rf   r   rU   rq   Tensorfrom_tensorr   shaper   r   DYNAMICSTATICrp   r   r   )	r   ir   graph_placeholder_idxorig_placeholderrK   valuedr   s	           r5   r   /DynamoGraphTransformer._create_flattened_inputs  s   s4++,-A'-QCj"bAK ***(,(>(>q(A%(3t/@/@+AA'+'8'89N'O$&6&;&;&A&A&C
%<9>,,11#6 'D
 ~~)j  #U\\/ / 04~~/I/I$$Q'%= &+3t/?/?/B/H/H+I%J' &K $%(C(CA(F#F !+ 2 2%/%6%6!7 &K' +/#d6F6Fq6I6O6O2P)P
& 0J 0  %%e, ))!,e44/3/?/?/B/F/F  %%e,/3/?/?/B  %%e, '2  #M .*'s   <Ic                     U R                   R                  5        HL  u  pU[        U R                  5      :  d  M   U R                  U   nU R                  U   nX@R
                  U'   MN     g)z1Create mapping from old placeholders to new ones.N)r   rI   rW   r   r   r   )r   user_input_idxr   old_placeholdernew_placeholders        r5   r   2DynamoGraphTransformer._create_placeholder_mapping2  sc     6:5K5K5Q5Q5S1N$s4+<+<'=="&"3"34I"J"&"6"6~"F;J''8	 6Tr7   ro   r*   .r+   c                   > U R                   U R                  ;   a  U R                  U R                      nS HN  nXPR                   R                  ;   d  M  U R                   R                  U   UR                  R                  U'   MP     SU R                   R                  ;   aJ  SUR                  R                  ;  a0  U R                   R                  S   UR                  R                  S'   U$ [        TU ]  XU5      $ )z1Replace old placeholders with new flattened ones.)tensor_dictexample_valueunbacked_bindingsr   )current_noder   rc   rf   r   r   )r   ro   r*   r+   new_argrK   r   s         r5   r   "DynamoGraphTransformer.placeholder<  s    
  7 77--d.?.?@G M++000-1->->-C-CC-HGLL%%c* M
 ))...5@Q@Q3Q+/+<+<+A+A%+H!!%(N 7&vV<<r7   c                   > US   n/ n[        U R                  R                  5       5       Hz  nU R                  U   u  pxUS:X  a  UR                  XH   5        M/  US:X  a,  UR                  n	UR                  U R
                  U	   5        Ma  US:X  d  Mi  UR                  U5        M|     [        T
U ]  U[        U5      40 5      $ )z/Transform output according to graph_output_map.r   	graph_outinputconstant)	sortedr   keysrY   indexr   r   r   rV   )r   ro   r*   r+   original_outputsnew_outputsr   output_typer   	input_idxr   s             r5   r   DynamoGraphTransformer.outputR  s      7 --2245A#44Q7Kk)""#3#89'II	""4#7#7	#BC
*""3' 6 w~fu['9&;R@@r7   r   c                 ~  > Xl         [        TU ]	  U5      n[        US5      (       a  UR                  ULa  S H:  nX1R
                  ;   d  M  UR
                  U   UR                  R
                  U'   M<     UR                  S:w  a6  [        US5      (       a%  UR                  R                  UR                  5        U$ )z.Run node transformation and preserve metadata.rf   )r   r   r   r   r[   )	r   r   run_noderp   rf   rc   rn   _renamer[   )r   r   r?   rK   r   s       r5   r   DynamoGraphTransformer.run_nodeg  s    !!$ 66""v{{!';D&&=,-FF3KFKK$$S) E
 ttxGAv$6$6##AFF+r7   c                 Z  > [         TU ]  5       n[        U R                  S5      (       a  SU R                  R                  ;   a&  U R                  R                  S   UR                  S'   SU R                  R                  ;   a&  U R                  R                  S   UR                  S'   U$ )z:Perform the graph transformation and copy module metadata.rc   r_   dynamo_compile_id)r   	transformrp   r   rc   )r   	result_gmr   s     r5   r    DynamoGraphTransformer.transformx  s    G%'	 4;;''1T[[5E5EEEI[[EUEU 7F	AB #dkk&6&666:kk6F6F (7	23 r7   )
r   r   r   r   r   r   r   r   r   r   r   r,   N)r   r   r   r   __doc__rq   rr   GraphModulelistr   setintr`   rV   rX   r	   r   r   r   r$   r#   r   r   r   r   r   r   r   r   r   s   @r5   r   r      s3   d $(+$$+ #Y+ !%SX	+
  S>+ sE#s(O34+ C=+ 
+ +>(2TK==$)(C-$8=BFsCx.=	=,AA$,SMA;?S>A	A*$ 3 "588//  r7   r   module_to_traceorig_callabler   r&   graph_capture_outputdynamic_shapesc           	         S n [        U 5      u  pUR                  R                  UR                  5        [        USS 5      =nGb  UR                  =nGbo  [        U R                  [        R                  R                  [        R                  R                  -  5      (       Gd   UR                  5         UR                  5       nUR                  [         R"                  " U5      UUU5      nU(       a3  UR$                  (       a  UR$                  S   U-   4Ul        O2U4Ul        O)U(       a  [	        U5      nO[&        R)                  SU5        UR*                   He  n[        U[,        R.                  5      (       d  M$  [	        SR1                  [2        R4                  " UR6                  U   5      5       SU S35      nMg     U(       a  [9        XqXE5      nUeg ! [         a  n
U
n S n
A
GNS n
A
ff = f)N	shape_envr   z#Summary of dimension constraints:%sr:   zk
It appears that you're trying to set a constraint on a value which we evaluated to have a static value of z0. Set TORCH_LOGS="+export" for more information.)r   r   build_guards__code__r   getattrdim_constraintsrU   r   rq   _opsOpOverloadPacket
OpOverloadsolveforced_specializationsprettify_resultsr1   r2   r*   loginfovar_to_rangesympyIntegerjoin	tracebackformat_listvar_to_stackr6   )r   r   r   r   r*   r+   r   r(   fnr9   er   r   r   msgks                   r5   &_suggest_or_raise_constraint_violationr    s    "&'o.11>>r{{K
 id;	;H ) 9 99_F##JJ''%***?*??
 

 	!0!G!G!I..m,&"	
 &)...33A6<3*/ 47&*/%-Ec-J*9 ''A!U]]++-Ewwy44Y5K5KA5NOPQ RJJK MEE.* ( "%;&t&
" )(	 "_ $ '%&"'s   2G 
G3&G..G3
shuffle_gmc                     U R                   R                  5         U R                  5         [        U R	                  5       5       H  u  p[        X5        [        XU5        M     g r   )ra   eliminate_dead_code	recompiler   named_buffersdelattrsetattr)r  r[   buffers      r5   _normalize_shuffle_graphr    sL    ((*Z5578
!
&) 9r7   T)frozenc                      \ rS rSr% \R
                  R                  \S'   \\S'   \R
                  R                  \S'   \	\S'   \\S'   \R
                  R                  \S'   Sr
\\R                  R                     \S	'   S
rg)PyTreeifyOutputi  rC   r   in_shuffle_graphnum_flat_argsr   out_shuffle_graphNrootr   )r   r   r   r   rq   rr   r   __annotations__r%   r   r  r	   nnModuler   r   r7   r5   r  r    s[    ((&&&hh***xx+++&*D(588??
#*r7   r  outmodc           
      8  ^ ^^^^^^^ T R                   c   eT R                   nSn[        T[        R                  R                  5      (       a	  T4U-   nTnO7[
        R                  " T5      (       a  TR                  4U-   nTR                  n[        R                  " X#45      u  mm[        R                  R                  R                  TU(       a  SOSS [        R                  5        T R                  R                   m " S S["        5      m " UUUUUU 4S jS[        R                  R                  5      n[        R                  R$                  R'                  T5      mT(       a  TR(                  c  [+        5       Tl        [-        U" 5       SS	S
9" T6 n[/        U5        [1        [3        [5        UR6                  R8                  R:                  5      5      5      m " UUUU U4S jS[        R                  R                  5      nU" 5       n	/ TQ[        R<                  " [        R>                  R@                  U4S jTRB                  S   5      Qn
[        R                  R$                  R'                  U
5      mT(       a  TR(                  c  [+        5       Tl        [E        5          [-        U	SS	S
9" U
6 nSSS5        [/        W5        U	RF                  c   e[I        UR6                  TU[K        T5      U	RF                  UUS9$ ! , (       d  f       NT= f)aY  
Given a dynamo capture output, return a callable graph module that
contain the following information:
1. input/output pytree spec
2. input/output shuffle functions
Input shuffle functions are the converters taking pytree falttened inputs
and reorder them to the calling convention of dynamo raw graph module.
Output shuffle functions are the converters taking the outputs of the
dynamo raw graph module and convert them to the pytree format.

This function will replay any side effects that happened during the bytecode,
so it is important to check against side effects before calling this function.
N   r   c                       \ rS rSrSrg)pytreeify.<locals>.Yieldi
  r   N)r   r   r   r   r   r   r7   r5   Yieldr'  
  s    r7   r(  c                   Z   >^  \ rS rSrSU UU4S jjrS\S\\S4   4UUUU4S jjrSrU =r	$ )	pytreeify.<locals>.InShufflei  r,   c                 ^   > [         TU ]  5         TU l        [        T5      U l        S U l        g r   )r   r   r#  rW   
num_inputs	gm_inputs)r   r   flat_real_argsr#  s    r5   r   %pytreeify.<locals>.InShuffle.__init__  s(    GDH!.1DO!DNr7   flat_proxy_args.c                 @  >^  [         R                  " [        T R                  5       Vs/ s H  o!U   PM	     snT5      u  p4S[        S[        4UU 4S jjn T	R                  UTS9" U0 UD6  [        es  snf ! T a    T R                  c   eT R                  s $ f = f)Nexample_inputsr,   c                     > U Tl         Ter   )r-  )r2  r(  r   s    r5   backend_dummy;pytreeify.<locals>.InShuffle.forward.<locals>.backend_dummy  s    !/r7   compiled_fnextra_globals)r   r   r   r,  r   forward_callabler-  RuntimeError)
r   r0  r   r*   r+   r4  r(  	f_globalsr   r"  s
   `     r5   r   $pytreeify.<locals>.InShuffle.forward  s    !00-24??-CD-C#-CDgLDs s  
&$$ -Y % #!#  E  &~~111~~%&s   A4A9 9!BB)r-  r#  r,  r   )
r   r   r   r   r   r   rV   r   r   r   )r   r(  r;  r.  r   r#  r"  s   @r5   	InShuffler*    s2    	" 	"	C 	E#s(O 	 	 	r7   r=  symbolicT)tracing_modeproxy_module_inputsc                   T   >^  \ rS rSrSU UU4S jjrS\S\\   4UUU4S jjrSrU =r	$ )pytreeify.<locals>.OutShufflei4  r,   c                    > [         TU ]  5         [        T5      U l        [        TR                  S   5      U l        S U l        g )Nr   )r   r   rW   r,  r*   num_outputsr   )r   r   r.  r   s    r5   r   &pytreeify.<locals>.OutShuffle.__init__5  s9    G!.1DO";#3#3A#67D04DMr7   r0  c                 (  >^ ^ [         R                  " [        T R                  5       Vs/ s H  nTU   PM
     snT	5      u  p4S[        S[        4UU 4S jjnT
R                  UTS9" U0 UD6n[         R                  " U5      u  nT l        U$ s  snf )Nr2  r,   c                  z   > [        TR                  5       Vs/ s H  nTTR                  U-      PM     sn$ s  snf r   )r   rD  r,  )r2  r   r0  r   s     r5   r4  <pytreeify.<locals>.OutShuffle.forward.<locals>.backend_dummyA  sC     #4#3#344 $DOOa$784  s   8r6  )r   r   r   r,  r   r9  r   r   )r   r0  r   r*   r+   r4  resultsretr;  r   r"  s   ``      r5   r   %pytreeify.<locals>.OutShuffle.forward<  s    !00-24??-CD-C#-CDgLDs s   **) + G "(!4!4W!=CJ Es   B)r,  rD  r   r   )
r   r   r   r   r   r   r   r   r   r   )r   r;  r.  r   r"  r   s   @r5   
OutShufflerB  4  s)    	5 	5	C 	DI 	 	r7   rL  c                 l   > T(       a  TR                  U R                  S   5      $ U R                  S   $ )Nr   )r   rc   )xr   s    r5   <lambda>pytreeify.<locals>.<lambda>R  s5      ++AFF?,CD )()r7   real)r  )&backend_inputrU   rq   r   r!  r1   ismethod__self__r   r   _dynamo
eval_framer   r   INVALID_INPUTr   r;  	Exceptionutilsdetect_fake_moder   r   r   r  r   iterreversedrC   ra   rb   tree_map_onlyrr   r   r*   r   r   r  rW   )r"  r#  r*   r+   rR  r  r=  r  rL  out_shuffleflat_out_shuffle_argsr  r(  r;  r   r.  r   r   s   ``          @@@@@@r5   	pytreeifyr`    s     (((%%MD#uxx''v}			#		%||$114.ANG	MM44Dqa)*M,G,G ((22I	  EHHOO 4 ##44^DIY((0&j	 	
  -.tH]%?%?%E%E%K%KLMNK UXX__ 2 ,K						HHMM) Q

	 ##445JKIY((0&j		!	## $	

 !" 
$ ./+++""N  
$	#s   .L
Lgmc                     U R                   R                   H1  nUR                  S:X  d  M  UR                  S   UR                  S'   M3     g )Nr   r   r   )ra   rb   rn   rc   )ra  rf   s     r5   normalize_graph_modulerc  p  s7    77m##yy9DIIe r7   constraintsc                 @   ^ ^ S[         S[         S[         4UU 4S jjnU$ )Nr*   r+   r,   c            
      	  >^ [         R                  R                  R                  (       a   e[         R                  R                  R	                  SS9   [        5          [        S5         [        TU UTS9nS S S 5        S S S 5        S S S 5        [        WTX5      nUR                  m[        UR                  5       Vs/ s H,  nTR                  R                  R                  SU 3S 5      PM.     nn[        [!        [#        [$        R&                  " T5      X5      UR(                  UR*                  5      UR,                  UR.                  U[1        UR2                  [         R4                  R6                  5      (       a  TOUR2                  5      TR                  l        [;        T5        UR2                  Gb  UR2                  R<                  R?                  5       Tl        UR2                  R@                  R?                  5       Tl         [C        U4S jUR2                  RD                   5       5      (       d   eTRD                  RG                  UR2                  RD                  5        UR2                  RH                  R?                  5       Tl$        [J        RL                  S:  a.  SS K'nURQ                  [         R4                  R6                  5      nO%[S        [         R4                  R6                  S	S 5      nUR2                  RT                  RW                  5        H$  u  pU(       d  M  X;  d  M  U	TRT                  U'   M&     UR(                  Tl,        UR*                  Tl-        []        TS
5      (       a   e[]        TS5      (       a   eUR,                  Tl/        UR.                  Tl0        [c        TS5        TRe                  5         URf                  Rh                  Rj                  Rl                  TRn                  S'   URp                  c   eURp                  Rr                  TRn                  S'   STRn                  S   l:        [w        TRn                  S   5      n
URp                  Rx                  U
l<        U
TRn                  S'   T$ ! , (       d  f       GN= f! , (       d  f       GN)= f! , (       d  f       GN3= fs  snf )Nwarn)side_effect_replay_policyr   )rd  _tree_leaf_c              3   F   >#    U  H  n[        TU5      (       + v   M     g 7fr   )rp   )r   mrC   s     r5   r   Adynamo_graph_capture_for_export.<locals>.inner.<locals>.<genexpr>  s      O=N7<333=Ns   !)      r   r  _in_shuffle_graph_out_shuffle_graph_param_name_to_sourcemodule_call_specsr   Ttracing_context)=rq   rU  configinstall_free_tensorspatchr   r   r   r`  rC   r   r  ra   _graph_namespacecreate_namer    r"   r   r1   r2   r   r   r  r  rU   r  r   r!  _codegenrc  _parametersrd   _buffersall_modulesupdate_non_persistent_buffers_setsysversion_infoannotationlibget_annotationsr   __dict__rI   _in_spec	_out_specrp   ro  rp  r  r  r   output_graphexport_metadatamodule_call_specrc   rR  r   allow_non_fake_inputsr   tensor_to_context)r*   r+   r"  pytr   tree_leaf_namesr  annotationsr[   r   rs  rC   rd  r#  s              @r5   inner.dynamo_graph_capture_for_export.<locals>.innerz  s   ==''<<<<MM  &&&H!,-#'	C . " I S$/'' 3,,-
- //;;k!<MtT- 	 
 '5w005tD	   !!&sxxAALsxx'
# 	|,88'*xx';';'@'@'BL$$'HH$5$5$:$:$<L!OSXX=N=NOOOOO!!(():):;4499; 4 7*$+;;EHHOOL%ehhoo7H$O"xx00668;4#:27L))$/  9 !$!$<)<====<)=>>>>),)=)=&*-*?*?'56 $$11AARR 	-.   ,,,),):):)D)D+&?C+&<():):;)GH,/,=,=,O,O)/>+,A .- "! IH
sB   R5 R#,R9R#R53S
R R##
R2	-R55
S)r   )r#  rd  r  s   `` r5   dynamo_graph_capture_for_exportr  v  s/    ES EC EC E EN Lr7   )rd  r   c                t   ^ ^^ UmUmS[         S[         S[        R                  R                  4UUU 4S jjnU$ )a  
Improved dynamo graph capture using transformer approach with proper fake tensor handling.

This function creates a capture instance that handles:
1. PyTree flattening/unflattening with proper input ordering
2. Dynamo graph capture with export-specific context
3. FX graph transformation for export compatibility
4. Proper fake tensor metadata preservation
5. Dynamic dimension constraint handling

Notable improvements over manual approach:
- Uses FX Transformer for cleaner graph manipulation
- Properly handles fake tensor metadata and dynamic dimensions
- Preserves all necessary metadata for export
- More robust error handling and edge case management

TODO:
1. Are we actually gonna run the bytecode?
2. Need to attach guards
r*   r+   r,   c                  	  > [        5          [        R                  " X45      u  p#[        U[        R
                  5        [        TU5      n[        T[        R                  R                  5      (       a  TR                  OTnTnTnSSKJn  U" 5         [        R                  R                  R!                  SSSSSSSS[        R                  R                  R"                  S9	n	[%        5          ['        S5         U	   [)        U[+        U5      TSS9n
U
R,                  R.                  c   e/ nU
R0                  bC  U
R0                  R2                  nU
R0                  R4                  nU
R0                  R6                  nO[        R8                  R;                  [        R                  R                  5       [        R8                  R=                  5       5      nUR>                  RA                  S 5        URC                  5         S n[E        UUUU
U UU5        U
R,                  R.                  RF                  nURH                  nURJ                  nURL                  nURN                  nS S S 5        S S S 5        S S S 5        U VVs/ s H  nU=(       d    S Vs1 s H  nURP                  [S        U5      :X  d  M  [        U[T        5      (       a  M5  URV                  RX                  RZ                  URV                  RX                  R\                  :w  d  My  UR^                  iM     snPM     nnn0 nW HU  nUU   n[        U[        R                  R`                  Rb                  5      (       d   e[e        U5      UURf                  '   MW     URi                  5        H  u  nnWU   UU'   M     [k        WUUUWW5      Rm                  5       n[o        [q        [s        [t        Rv                  " U5      X5      UW5      5      UR>                  l<        URC                  5         [{        U[        R                  R                  R|                  5        [        U5        WUR                  S	'   UUR                  S
'   UsS S S 5        $ ! , (       d  f       GN= f! , (       d  f       GN)= f! , (       d  f       GN3= fs  snf s  snnf ! , (       d  f       g = f)Nr%  )resetTF)	specialize_intspecialize_floatassume_static_by_defaultautomatic_dynamic_shapes capture_dynamic_output_shape_opscapture_scalar_outputs'constant_fold_autograd_profiler_enabledlog_graph_in_out_metadataru  r   )rd   _is_export_deprecated_do_not_user   rr  r   )Ar   r   r   r   r   rW  r   rU   rq   r   r!  r   r:   r  rU  rt  rv  install_free_tensors_for_exportr   r   r   rV   r   r  rR  rC   r   r2  rr   r   Graphra   r   r  r  r  graph_input_idx_to_local_sourceoutput_return_typer   r  t_ididr   constraint_rangevrlowerupperdimsourceGetItemSourcerW   r   rI   r   r   r!   r"   r   r1   r2   ry  rj   inline_inbuilt_nn_modulesr~   rc   )r*   r+   r   r   r   r   rd  r   r  dynamo_config_ctxr"  r2  ra   r   r  graph_inputsr   r   r  rN  cr   r   inpr  real_idx	graph_idxtransformed_graph_constraints_dynamic_shapesr#  s                               r5   r  /_dynamo_graph_capture_for_export.<locals>.inner  s#   %'#)#6#6~#F K#K1L1LM+C9O+5c588??+K+KCKKQTM6BK   G % 4 4 : :#!%)-).15'+8<*. &+]]%9%9%Y%Y !; !$ $%01!'#+& ,59	 //<<HHH,.$$0--::E # 1 1 ; ;I%(%6%6%E%EN!HH001BEHHNNDTUEKK&&t,OO% $I6#!" #&":":"G"G"W"W.NN#2#E#E *33#2#C#C K " 2 &h %& %A */R//"Q%  !+1.@ A	 
 ..11771;M;M;P;P;V;VV AEE/ % # & 13#%c*!&%--*>*>*L*LMMMM256G2H!&,,/ $
 (9'>'>'@#)(6y(AH% (A !7&! ! ik  0>"7#4#4]#CTR0##, '')/!5==#7#7#Q#Q /0:J""#672;"";/$} ('F "! 21 &%V&W ('s   C#R>/R!;R>E'Q=	%R-R!5R>R8R36R3A R3R3!R8(ER>=
RR
RR!!
R0	+R>3R88R>>
S)r   rq   rr   r   )r#  rd  r   r  r  r  s   `   @@r5    _dynamo_graph_capture_for_exportr    sE    6 %OL@%S @%C @%EHH,@,@ @% @%D Lr7   )Fr   )]r1   loggingr  r  collectionsr   collections.abcr   r   r   dataclassesr   typingr   r	   r
   r   r   r  rq   torch.fxtorch.utils._pytreerY  _pytreer   torch._dispatch.pythonr   torch._dynamo.convert_framer   r   r   torch._dynamo.eval_framer   r   torch._dynamo.excr   torch._dynamo.utilsr   r   torch._export.utilsr   torch._guardsr   torch.export.dynamic_shapesr   r   r   "torch.fx.experimental.proxy_tensorr   %torch.fx.experimental.symbolic_shapesr   r   r   r   torch.fx.graphr    r!   r"   torch.fx.noder#   r$   r%   torch._subclasses.fake_tensorr&   r'   	getLoggerr   r  r6   r=   rX   rB   rr   r   boolrj   r~   r   r!  r   r   Transformerr   r`   rV   r   r  r  r  r`  rc  r  r  r   r7   r5   <module>r     su     
  " 8 8 ! ? ?    $ $ ; W W L + A 8 ( F  6  G F * ( <CL!& 8&
38
& & 	&
 &* 3 3  CHY((&&Y;?Y
XXYx'<EHH$8$8 '<T '<T
6EHHOO 
6   4{J6OP iUXX11 iXA)XX__A)CH%A) ()A) (	A)
 A) A) U4S>5:tCy#HIJA) 
A)H*)=)= *$ * $+ + +D	D D(-c3hDAEc3hDDN:uxx33 : : /3K	#s(	K$z*+K c3hKb /3MQ	`	#s(	` $z*+` U4S>5:tCy#HIJ	`
 c588'''(`r7   