
    9jS                        d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
 d dlmZmZmZmZ d dlZd dlZd dlZd dlmc mZ d dlmZmZmZ d dlmZ d dlmZm Z  d dl!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dlm-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7 erd dl8m9Z9  ed      Z: ejv                  e<      Z=de/dedef   dedede/f
dZ>g dZ?de@de@fdZA	 dEdej                  j                  deDdej                  j                  fdZEdej                  j                  ddfd ZF G d! d"ej                  j                        ZI ed#d$d%g      ZJ G d& d'ej                  j                        ZLd(ej                  j                  d)edef   d*ed+   d,ededed-eMe@ef   eNe   z  eOe   z  dz  ddfd.ZPd/ej                  j                  ddfd0ZQd1ej                  j                  ddfd2ZR G d3 d4      ZS G d5 d6eT      ZU G d7 d8      ZV G d9 d:      ZWd;ed<edeNedf   deMe@ef   dej                  j                  f
d=ZX G d> d?ej                  j                  j                        Z[	 dFd@edef   dAeOe,   dz  dedef   fdBZ\dddCd<edef   dAeOe,   dz  d-eMe@ef   eNe   z  eOe   z  dz  dedej                  j                  f   fdDZ]y)G    N)
namedtuple)CallableIterableSequence)AnyOptionalTYPE_CHECKINGTypeVar)CaptureOutputfullgraph_captureget_traced_fn)disable)argument_namescheck_user_input_output)UserErrorType)dynamo_timedget_metrics_context)_compiling_state_context)TracingContext)_RelaxedConstraint
Constraint)Node)ConstraintViolationError
DimDynamicStatelessSymbolicContext)_PyTreeCodeGen_PyTreeInfo)ArgumentTarget)FakeTensorModeTconstraint_violation_errorfunc.argskwargsreturnc                     ddl m}m} t        j                  |      } |||f|      }| j
                  r || j
                  d   |      f| _        | S )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           _/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/functional_export.pypost_process_error_msgr0   (   s\     H  &H'vA!&&7<<Q?AQR+
"' &%    ))__export_root__)z_export_root. )z._export_rootr4   textc                 J    | }t         D ]  \  }}|j                  ||      } |S )z;Generic utility to clean export_root patterns from strings.)EXPORT_ROOT_REPLACEMENTSreplace)r5   resultpatternreplacements       r/   clean_export_root_stringr<   D   s0    F 8 656Mr1   graph_moduleis_inline_builtinc                    dt         t        t        t        t        f   f   dt         t        t        t        t        f   f   ffd}dt        t           dt        t           fd}| j
                  j                  D ]  }d|j                  v r0 ||j                  d   j                               |j                  d<   |j                  j                  dd      }|s` ||j                               |j                  d<    d| j                  v rMi }| j                  d   j                         D ]  \  }}t        |      |t        |      <    || j                  d<   | S )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                     d| v r| d= i }| j                         D ]-  \  }\  }}t        |      }t        |      }r|dk(  r'||f||<   / |S )NL__self____export_rootz	L['self'])itemsr<   )r@   cleaned_stackkey
child_namechild_class	clean_key
clean_namer>   s          r/   _process_nn_module_stackzEclean_nn_module_stack_and_source_fn.<locals>._process_nn_module_stackh   s}     $6 89 .=.C.C.E 	A*C**k05I 2*=J !Z;%>(2K'@M)$	A r1   source_fn_stackc                    g }| D ]w  }t        |t              rTt        |      dk(  rF|\  }}t        |t              rt	        |      }|j                  ||f       U|j                  |       g|j                  |       y |S )N   )
isinstancetuplelenstrr<   append)rK   rD   itemnameclsrI   s         r/   _process_source_fnz?clean_nn_module_stack_and_source_fn.<locals>._process_source_fn~   s    # 
	+D$&3t9> 	cdC(!9$!?J!((*c):;!((. $$T*
	+ r1   N dynamo_flat_name_to_original_fqn)dictrQ   rO   r!   r   graphnodesmetacopygetrC   r<   )	r=   r>   rJ   rV   noderK   clean_name_to_original_fqn	flat_nameoriginal_fqns	    `       r/   #clean_nn_module_stack_and_source_fnrb   L   sZ   8c5a=01	c5a= 	!,HQK HQK   ""(( V		)+C		+,113,DII'( ))--(94@+=o>R>R>T+UDII'(V *\->->>%'"'3'8'8.(

%'	#I| )6 ''?	'JK	 ' 	<= r1   c                 J   i }| j                   j                  D ]  }|j                  dk(  r|j                  }t	        |      }||k7  r||_        t        | |      sJ t        j                  j                  j                  | |      }t        j                  j                  j                  || |       t        j                  j                  j                  | |       |j                  dk(  s|j                  }t        |t              sJ t	        |      }t        |t              sJ t	        |j                        }||k(  r*||v r||   |_        ||_        A| j                  |      }| j!                  |       | j#                  ||       ||_        ||_        |||<    y)z3Remove export_root artifacts from FX graph in-placeget_attrcall_moduleN)rY   rZ   optargetr<   hasattrtorchfxr=   	_get_attr_assign_attr	_del_attrrN   rQ   rT   get_submoduledelete_submoduleadd_submodule)r=   clean_named_module_mapr^   
old_target
new_targetparamnew_namerg   s           r/   clean_export_rootrv      sw   
 .0 ""(( <77j J1*=JZ'(|Z888--77jQ%%225,
S%%//jI77m#Jj#...1*=Jj#.../		:HZ' 334Z@$	!//
;F))*5&&z6:$DK DI1;":.?<r1   c                   <     e Zd Zdededdf fdZdeddfdZ xZS )	ModuleToTracefooin_specr&   Nc                 >    t         |           || _        || _        y N)super__init___export_rootrz   )selfry   rz   	__class__s      r/   r~   zModuleToTrace.__init__   s    r1   	flat_argsExportTracerOutputc                     t        j                  || j                        \  }} | j                  |i |}t        j                  |      \  }}t        ||      S r|   )pytreetree_unflattenrz   r   tree_flattenr   )r   r   r$   r%   resout_flatout_specs          r/   forwardzModuleToTrace.forward   sU    ,,YEfd00#005(!(H55r1   )__name__
__module____qualname__r   r~   r   __classcell__r   s   @r/   rx   rx      s1    C # $ 
6# 6*> 6r1   rx   r   r   r   c                   t    e Zd ZdZ	 	 ddej
                  j                  dee   dee	e
      dee
e
f   dee
eeef   f   dedz  d	ee
ef   dz  d
df fdZd fdZddZdedeedf   deeef   d
ef fdZdedee   deeef   d
ef fdZded
ef fdZd
ej
                  j                  f fdZ xZS )DynamoGraphTransformerzZGraph 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_modegraph_inputsr&   c                    t         	|   |       t        |      t        |      k(  sJ || _        || _        || _        || _        || _        |xs i | _        |j                  j                  D cg c]  }|j                  dk(  s| c}| _        t        d |j                  j                  D              | _        i | _        | j!                          i | _        | j%                          y c c}w )Nplaceholderc              3   @   K   | ]  }|j                   d k(  s|  yw)outputN)rf   ).0ns     r/   	<genexpr>z2DynamoGraphTransformer.__init__.<locals>.<genexpr>   s     RaAQRs   )r}   r~   rP   r   r   r   r   r   r   rY   rZ   rf   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   r   s
            r/   r~   zDynamoGraphTransformer.__init__   s     	 )*c+.>>>>&&<#!2 0"(.B )/(:(:T1addm>SQTR6<<+=+=RR :<%%' #%((* Us   0C+C+c                    t        t        | j                              D ]%  }t        |   d| di       }|| j
                  v rw| j
                  |   }|t        | j                        k  rP| j                  |   }|j                  j                         D ]$  \  }}|dk7  s||j                  j                  |<   & | j                  t        | j                  |   t        j                        r| j                  j                  | j                  |   t        t        t        | j                  |   j                               D cg c]3  }|| j"                  |   v rt$        j&                  nt$        j(                  5 c}dgt        | j                  |   j                         z              |j                  j                  d<   npt+        | j                  |   d      r1| j                  |   j,                  |j                  j                  d<   n&| j                  |   |j                  j                  d<   || j.                  |<   ( yc c}w )zKCreate new placeholder nodes for flattened inputs with proper fake tensors.arg_ valN)dynamic_sizesconstraint_sizes)symbolic_context)rangerP   r   r}   r   r   r   r[   rC   r^   r   rN   ri   Tensorfrom_tensorr   shaper   r   DYNAMICSTATICrh   r   r   )	r   ir   graph_placeholder_idxorig_placeholderrE   valuedr   s	           r/   r   z/DynamoGraphTransformer._create_flattened_inputs  s!   s4++,- &	2A'-QCj"bAK D***(,(>(>q(A%(3t/@/@+AA'+'8'89N'O$&6&;&;&A&A&C ?
U%<9>K,,11#6?
 ~~)j  #U\\/ 04~~/I/I$$Q'%= &+3t/?/?/B/H/H+I%J' !" $%(C(CA(F#F !+ 2 2%/%6%6!7' +/#d6F6Fq6I6O6O2P)P
& 0J 0  %%e, ))!,e4/3/?/?/B/F/F  %%e,/3/?/?/B  %%e, '2D  #M&	2*'s   8I
c                     | j                   j                         D ]K  \  }}|t        | j                        k  s| j                  |   }| j                  |   }|| j
                  |<   M y)z1Create mapping from old placeholders to new ones.N)r   rC   rP   r   r   r   )r   user_input_idxr   old_placeholdernew_placeholders        r/   r   z2DynamoGraphTransformer._create_placeholder_mapping1  sn     6:5K5K5Q5Q5S 	K1N1$s4+<+<'=="&"3"34I"J"&"6"6~"F;J''8		Kr1   rg   r$   .r%   c                    | j                   | j                  v r| j                  | j                      }dD ]K  }|| j                   j                  v s| j                   j                  |   |j                  j                  |<   M d| j                   j                  v rHd|j                  j                  vr0| j                   j                  d   |j                  j                  d<   |S | j                  j                  | j                         }|| j                  v rK| j                  |   }t        |t        j                  j                  j                        s| j                   j                  j                  d      xs% | j                   j                  j                  d      }|d| }	t        |t        j                        r| j                  j                  |	|       nt!        | j                  |	|       | j"                  j%                  d|	di       }
| j                   j                  j'                         |
j                  _        ||
j                  j                  d<   |
S t(        | U  |||      S )z1Replace old placeholders with new flattened ones.)tensor_dictexample_valueunbacked_bindingsr   r   
_captured_rd   r   )current_noder   r[   r^   r   indexr   rN   ri   _dynamosourceGetItemSourcer]   r   r   register_buffersetattrtracercreate_proxyr\   r}   r   )r   rg   r$   r%   new_argrE   placeholder_idxr   example_val	attr_namer9   r   s              r/   r   z"DynamoGraphTransformer.placeholder;  s   
  7 77--d.?.?@G M I$++000-1->->-C-CC-HGLL%%c*I
 ))...5@Q@Q3Q+/+<+<+A+A%+H!!%(N #//55d6G6GHO$"3"33**?;!&%--*>*>*L*LM"&"3"3"8"8"<"<# #E**//33OD   #.&00A$B	%k5<<@ KK77	;O#DKKKH!%!9!9*iQSUW!X+/+<+<+A+A+F+F+H(2=((/%7&vtV<<r1   c                 ~   |d   }g }t        | j                  j                               D ]u  }| j                  |   \  }}|dk(  r|j                  ||          /|dk(  r+|j                  }	|j                  | j
                  |	          _|dk(  se|j                  |       w t        
|   |t        |      fi       S )z/Transform output according to graph_output_map.r   	graph_outinputconstant)	sortedr   keysrR   r   r   r}   r   rO   )r   rg   r$   r%   original_outputsnew_outputsr   output_typer   	input_idxr   s             r/   r   zDynamoGraphTransformer.outputc  s      7 --2245 		(A#44Q7Kk)""#3C#89'II	""4#7#7	#BC
*""3'		( w~fu['9&;R@@r1   r   c                 `   || _         t        | 	  |      }t        |d      r|j                  |ur|dD ]7  }||j
                  v s|j
                  |   |j                  j
                  |<   9 |j                  dk7  r1t        |d      r%|j                  j                  |j                         |S )z.Run node transformation and preserve metadata.r^   )r   r   r   r   rT   )	r   r}   run_noderh   r^   r[   rf   _renamerT   )r   r   r9   rE   r   s       r/   r   zDynamoGraphTransformer.run_nodex  s    !!$ 66"v{{!';D 8!&&=,-FF3KFKK$$S)8
 ttxGAv$6##AFF+r1   c                 H   t         |          }t        | j                  d      r|d| j                  j                  v r&| j                  j                  d   |j                  d<   d| j                  j                  v r&| j                  j                  d   |j                  d<   |S )z:Perform the graph transformation and copy module metadata.r[   rW   dynamo_compile_id)r}   	transformrh   r   r[   )r   	result_gmr   s     r/   r   z DynamoGraphTransformer.transform  s    G%'	 4;;'1T[[5E5EEEI[[EUEU6F	AB
 #dkk&6&666:kk6F6F'7	23
 r1   )NN)r&   N)r   r   r   __doc__ri   rj   GraphModulelistr   setintrX   rO   rQ   r~   r   r   r   r   r   r   r   r   r   r   r   r   s   @r/   r   r      sJ   d !%.2+$$+ #Y+ !%SX	+
  S>+ sE#s(O34+ :+ 38nt++ 
+B(2TK&=&=$)(C-$8&=BFsCx.&=	&=PAA$,SMA;?S>A	A*$ 3 "588//  r1   r   module_to_traceorig_callabler   r    graph_capture_outputdynamic_shapesc           	         d }	 t        |       \  }}	|j                  j                  |j                         t        |dd       x}`|j                  x}Qt        | j                  t        j                  j                  t        j                  j                  z        s|j                          |j                         }|j                  t!        j"                  |      |||      }|r.|j$                  r|j$                  d   |z   f|_        n-|f|_        n$|rt	        |      }nt&        j)                  d|       |j*                  D ]]  }t        |t,        j.                        st	        dj1                  t3        j4                  |j6                  |                d| d      }_ |rt9        ||||      }|y # t        $ r}
|
}Y d }
~
d }
~
ww xY w)N	shape_envr   z#Summary of dimension constraints:%sr4   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_constraintsrN   r   ri   _opsOpOverloadPacket
OpOverloadsolveforced_specializationsprettify_resultsr+   r,   r$   loginfovar_to_rangesympyIntegerjoin	tracebackformat_listvar_to_stackr0   )r   r   r   r   r$   r%   r   r"   fnr3   er   r   r   msgks                   r/   &_suggest_or_raise_constraint_violationr    s    "&'o.A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.*	 "%;&tV&
" )(	 "_ $ '%&"'s   3F: :	GGG
shuffle_gmc                     | j                   j                          | j                          t        | j	                               D ]  \  }}t        | |       t        | ||         y r|   )rY   eliminate_dead_code	recompiler   named_buffersdelattrr   )r  rT   buffers      r/   _normalize_shuffle_graphr    sW    ((*Z5578 *f
D!
D&)*r1   gmc                     | j                   j                  D ].  }|j                  dk(  s|j                  d   |j                  d<   0 y )Nr   r   r   )rY   rZ   rf   r[   )r  r^   s     r/   normalize_graph_moduler    s<     :77m##yy9DIIe:r1   c                   b    e Zd Zdededee   ddfdZdeedf   deeedf   e	eef   f   fd	Z
y)
InputProcessorrootnum_argskwarg_namesr&   Nc                 .    || _         || _        || _        y r|   )r  r  r  )r   r  r  r  s       r/   r~   zInputProcessor.__init__  s     	 &r1   inputs.c                    |}i }t        |      | j                  kD  r;t        t        | j                  || j                  d              }|d | j                   }| j
                  t        | j
                  t        j                  j                        rt        | j
                  j                  j                  t              sJ t        | j
                  j                  j                  j                  d      sJ | j
                  j                  j                  j                  j                  | u sJ | j
                  g|}||fS )Ninput_processor)rP   r  rX   zipr  r  rN   ri   rj   r   rY   _codegen_DynamoBytecodeCodeGenrh   dynamo_bytecode_flattenr  )r   r  r$   r%   s       r/   __call__zInputProcessor.__call__  s    t9t}}$#d..T]]_0EFGF$--(D99 $))UXX%9%9:!$))//":":<RSSSIIOO,,DDFW   IIOO,,DDTT II%%DV|r1   )r   r   r   objectr   r   rQ   r~   rO   rX   r  r   r1   r/   r  r    sk    '' ' #Y	'
 
'FCK(	uVS[!4V#44	5r1   r  c                       e Zd Zy)YieldN)r   r   r   r   r1   r/   r  r    s    r1   r  c                   V    e Zd Zdededeeef   ddfdZ e	d      d	edefd
       Z
y)DynamoBytecodeFlattenr  out	f_globalsr&   Nc                 <    || _         || _        || _        d | _        y r|   )r  r"  r#  	gm_inputsr   r  r"  r#  s       r/   r~   zDynamoBytecodeFlatten.__init__  s!      /"15r1   *do not trace internal dynamo graph capturereasonr  c                     dt         dd f fd} j                  |      \  }}	   j                  j                  | j                        |i | t        # t
        $ r  j                  J  j                  cY S w xY w)Nexample_inputsr&   c                      | _         t        r|   )r%  r  )r+  r   s    r/   backend_dummyz5DynamoBytecodeFlatten.__call__.<locals>.backend_dummy'  s    +DNKr1   compiled_fnextra_globals)r  r  r"  forward_callabler#  r  r%  RuntimeError)r   r  r-  r$   r%   s   `    r/   r  zDynamoBytecodeFlatten.__call__%  s    	6 	d 	 ++F3f	"DHH%%) &    	">>--->>!	"s   -A #A>=A>)r   r   r   r  r   rX   rQ   r  r~   dynamo_disabler  r   r1   r/   r!  r!    s_    	6'	6 	6 V$		6
 
	6 GH 6  Ir1   r!  c                   j    e Zd Zdededeeef   ddfdZ e	d      d	e
e   d
eedf   defd       Zy)DynamoBytecodeUnflattenr  r"  r#  r&   Nc                 .    || _         || _        || _        y r|   )r  r"  r#  r&  s       r/   r~   z DynamoBytecodeUnflatten.__init__7  s      /"r1   r'  r(  	flat_outsr  .c                 $   dt         dt        t            ffd}| j                  |      \  }}t        j                  j                         5   | j                  j                  || j                        |i |}d d d        |S # 1 sw Y   S xY w)Nr+  r&   c                      S r|   r   )r+  r7  s    r/   r-  z7DynamoBytecodeUnflatten.__call__.<locals>.backend_dummyE  s	    r1   r.  )	r  r   r  ri   _C_DisableTorchDispatchr"  r1  r#  )r   r7  r  r-  r$   r%   resultss    `     r/   r  z DynamoBytecodeUnflatten.__call__A  s    	6 	hv6F 	 ++F3fXX++- 	dhh//) 0 G	 		 s   .BB)r   r   r   r  r   rX   rQ   r  r~   r3  r   rO   r  r   r1   r/   r5  r5  6  sw    #'# # V$	#
 
# GH!&)383E	 Ir1   r5  r"  modc                 	   | j                   J | j                   }t        j                  j                  j	                  |      \  }}t        j                  ||f      }t        j                  j                  j                  |t        j                         | j                  j                  }|j                  t        |t        j                  j                         r3|j"                  _        |j$                  _        t'        fd|j(                  D              sJ j(                  j+                  |j(                         |j,                  _        t.        j0                  dk\  r.dd l}	|	j5                  t        j                  j                         }
n%t7        t        j                  j                   dd       }
|j8                  j;                         D ]  \  }}|
s	||
vs|j8                  |<    |j<                  j?                         _        |j@                  j?                         _         |jB                  j?                         _!        |jD                  j?                         _"        j<                  sj@                  rt7        dd       J t        jF                  t        jH                  j                  jJ                        sJ jF                  jL                  J dtN        dtN        dtN        fd	}|jF                  _&        t        |t        j                  j                         rn|}tQ        |tS        |      tU        |jW                                     }tY        || |      }t[        || |      }t]        t_        ta        jb                  |      ||      ||      jd                  _3        ti               tk        d
      rJ tk        d      rJ |_6        |_7        tq        d       js                          | j                  jt                  jv                  jx                  jz                  d<   | j                   J | j                   j|                  jz                  d<   djz                  d   _?        t        jz                  d         }| j                   j                  |_A        |jz                  d<   S )Nc              3   8   K   | ]  }t        |         y wr|   )rh   )r   mr=   s     r/   r   z7create_fx_graph_from_captured_output.<locals>.<genexpr>b  s     GAw|Q//Gs   )      r   __annotations___wrapped_callr$   r%   r&   c                    d| j                   vsJ | j                  | j                  t        |       j                  dt
        dt
        dt
        ffd}	 t        j                  ||       | _        i | _        i | _        t        t        |       | &  |i || j                   j                  d       | _        | _        S # | j                   j                  d       | _        | _        w xY w)Nr   r$   r%   r&   c                 8    | _         | _         | g|i |S r|   )_forward_hooks_forward_pre_hooks)r   r$   r%   	fwd_hooksfwd_pre_hooksoriginal_forwards      r/   patched_forwardzZcreate_fx_graph_from_captured_output.<locals>.dynamo_wrapped_call.<locals>.patched_forward  s(    *3D'.;D++DB4B6BBr1   )__dict__rG  rH  typer   r  types
MethodTyper}   r  pop)r   r$   r%   rL  rI  rJ  rK  s       @@@r/   dynamo_wrapped_callzAcreate_fx_graph_from_captured_output.<locals>.dynamo_wrapped_call}  s     555 //	 $ 7 7#':#5#5 C C6 Cf C
<#(#3#3OT#JDL*,D'.0D+ dT;TLVLMM%%i0*3D'.;D+ MM%%i0*3D'.;D+s   A C +C1_dynamo_bytecode_flatten_dynamo_bytecode_unflatten_param_name_to_sourcemodule_call_specsr   Ttracing_context)Bbackend_inputri   r   convert_framer   r   tree_leaves
eval_framer   r   INVALID_INPUTr   r#  r=   rN   nnModule_parameters_buffersall_modulesupdate_non_persistent_buffers_setsysversion_infoannotationlibget_annotationsr   rM  rC   rG  r\   rH  _backward_hooks_backward_pre_hooksrD  rj   _WrappedCallcls_callr  r  rP   r   r   r!  r5  r  r   r+   r,   rY   r  r  rh   rS  rT  r	  r  output_graphexport_metadatamodule_call_specr[   r   allow_non_fake_inputsr   tensor_to_context)r"  r=  r$   r%   rX  r3   r  flat_real_argsr#  rg  annotationsrT   r   rR  r  r  dynamo_bytecode_unflattenrW  r=   s                     @r/   $create_fx_graph_from_captured_outputru  P  s    (((%%Mmm))77<GAt''v7N	MM4433 ((22I --L$(#'#3#3  $GGGGG$$T]]3373S3S0w& '77HK!%((//3DdKK==..0 	4KD%t;6.3%%d+	4 '+&9&9&>&>&@#*.*A*A*F*F*H''+';';'@'@'B$+/+C+C+H+H+J(&&,*I*I
 <$?KKK**EHH,A,A,N,N    --66>>>< <6 <f <4 3FL&&/%dEHHOO<<$D$T3t9d6;;=6IJO3OS)T 7i X"8w((-tV<!#L
 <(|%?@@@|%ABBB,CL).GL+L12  --==NN )* (((%(%6%6%@%@Lk";?Lk"8$\%6%6{%CDO(+(9(9(K(KO%+:L'(r1   c            	       
    e Zd Zdee   dededdf fdZdedefdZd	edefd
Z	dddee   dede
def fdZdee   dee   de
defdZddddej                  j                  j                   dedz  dedz  defdZ xZS )r  orig_arg_namesr  rt  r&   Nc                 h    t         |           || _        || _        || _        d| _        d | _        y )NF)r}   r~   rw  r  rt  
wrap_tuple_inputs)r   rw  r  rt  r   s       r/   r~   z_DynamoBytecodeCodeGen.__init__  s6     	,'>$)B&/3r1   r  c                 2    || _          | j                  | }|S r|   )rz  r  )r   r  r<  s      r/   process_inputsz%_DynamoBytecodeCodeGen.process_inputs  s     .$..7r1   outputsc                 j    | j                  || j                        }| j                  r|f}d | _        |S r|   )rt  rz  ry  )r   r}  r<  s      r/   process_outputsz&_DynamoBytecodeCodeGen.process_outputs  s2    00$,,G??jGr1   Fexpanded_def	free_varsmaybe_return_annotationr  c                    | j                   }t        |      dkD  r|d   dk(  nd}|r|j                  dd       t        |   |d d  ||      }t        |      dkD  r|| j                  |||      z  }|S )Nr   r   Fr  )rw  rP   insertr}   
gen_fn_defgen_var_bindings)r   r  r  r  fn_argshas_orig_selffn_definitionr   s          r/   r  z!_DynamoBytecodeCodeGen.gen_fn_def  s     %%25g,2Bv-Q'*AJ/l + 
 y>AT227I|TTMr1   r  c                    |D cg c](  }|j                  d      d   j                  d      d   * }}t        |      dk(  rd}n)t        |      dk(  r	|d    d}ndj                  |       }d| ddj                  |       d	S c c}w )
N:r   #r4      , z
    _fn_args = (z)
    z,, = self._dynamo_bytecode_flatten(*_fn_args))splitrP   r   )r   r  r  r  xwithout_annotationfn_signatures          r/   r  z'_DynamoBytecodeCodeGen.gen_var_bindings  s     FOOaggcl1o33C8;OOw<1L\Q%aj\,L"ii01L 	YY!"##OS 	S Ps   -B)descsrepr_fnoutput_argsr  r  c          	          |t         }ddj                  |D cg c]
  } ||       c}       d}| j                  rd| d}d| S c c}w )Nz!self._dynamo_bytecode_unflatten((r  z,), _fn_args)(z,)zreturn )reprr   ry  )r   r  r  r  areturneds         r/   generate_outputz&_DynamoBytecodeCodeGen.generate_output  sa     ?G6tyyVaAbQR'!*Ab7c6ddqr??8*B'H
## Bcs   A	
)r   r   r   r   rQ   r   r~   r   r|  r  boolr  r  ri   rj   r^   r   r  r  r   r   s   @r/   r  r    s   4S	4 "*	4 $,4 
4c c 
s s  #9 "%
  
&SCyS-1#YSFJS	S$  $"$XX]]++$ }	$
 t$ 
$r1   r  r   constraintsc                 z    t         t        j                  j                        rdt        j                  dt
        fd}d}g } j                  j                  D ]G  }|j                  r|sd}|j                  d       |j                  |j                   ||      z          I ddj                  |       d	dj                   j                  j                  D cg c]  }|j                   d
|j                    c}       d}i }t        |d i|       |d    dt        dt        dt        f fd}|S c c}w )Nargr&   c                 B    | j                         rd| j                  S y)N=r4   )has_default_valuedefault_value)r  s    r/   default_annotationz;dynamo_graph_capture_for_export.<locals>.default_annotation  s%    $$&3,,/00r1   FT*z
def op_overload_wrapper(r  z):
    return op(r  z)
rf   op_overload_wrapperr$   r%   c            
         t         j                  j                  j                  rJ t	               5  t         j                  j                  j                  dd      5  t               5  t        d      5  t        | |      }d d d        d d d        d d d        d d d        t        | |      }|S # 1 sw Y   1xY w# 1 sw Y   5xY w# 1 sw Y   9xY w# 1 sw Y   =xY w)NFwarn)replay_side_effectsside_effect_replay_policyr   )r  )
ri   r   configinstall_free_tensorsr   patchr   r   r   ru  )r$   r%   r"  r=   r  r   s       r/   innerz.dynamo_graph_capture_for_export.<locals>.inner  s    ==''<<<<$&	MM  &&$)V ' 	
  !	 ,-	 $'	C	 	 	 	 <CT6R	 	 	 	 	 	 	 	sS   ,CC)C5B5	CCC5B>:CC
CC	CC")rN   ri   r   r   r   rQ   _schema	arguments
kwarg_onlyrR   rT   r   execr   )	r   r  r  has_kwarg_onlyarg_listr  func_strr"  r  s	   ``       r/   dynamo_graph_capture_for_exportr    s2    "ejj++,	ENN 	s 	
 ::'' 	@C~~n!%$OOCHH'9#'>>?		@
8,- .yybjj>R>RSsSXXJaz2STU V Xbz3'&'S C C & L3 Ts   "D8)r  r   c                p     ||dt         dt         dt        j                  j                  f fd}|S )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                     t               5  t        j                  | |f      \  }}t        |t        j
                         t        |      }t        t        j                  j                        rj                  n}}}ddlm}  |        t        j                  j                  j!                  ddddddddt        j                  j                  j"                  	      }	t%               5  t'        d      5  |	5  t)        |t+        |      d      }
|
j,                  j.                  J g }|
j0                  C|
j0                  j2                  }|
j0                  j4                  }|
j0                  j6                  }nt        j8                  j;                  t        j                  j                         t        j8                  j=                               }|j>                  jA                  d        |jC                          d }tE        ||||
| ||       |
j,                  j.                  jF                  }|jH                  }|jJ                  }|jL                  }|jN                  }d d d        d d d        d d d        |D cg c]  }|xs dD ch c]w  }|jP                  tS        |      k(  r]t        |tT              sM|jV                  jX                  jZ                  |jV                  jX                  j\                  k7  r|j^                  y c} }}}i }D ]N  }||   }t        |t        j                  j`                  jb                        s7te        |      ||jf                  <   P |ji                         D ]  \  }}|   ||<    tk        ||||      jm                         }to        tq        ts        tu        jv                  |      | |      |            |j>                  _<        |jC                          t{        |d       t}        |       |j~                  d	<   ||j~                  d
<   |cd d d        S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}}w # 1 sw Y   y xY w)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_metadatar  r   )r   _is_export_deprecated_do_not_user   rV  r   )@r   r   r   r   r   r\  rx   rN   ri   r]  r^  r   r4   r  r   r  r  install_free_tensors_for_exportr   r   r   rO   r   rm  rX  r=   r   r+  rj   r   GraphrY   r   r  r  rn  graph_input_idx_to_local_sourceoutput_return_typer   ro  t_ididr   constraint_rangevrlowerupperdimr   r   rP   r   rC   r   r   r   r   r   r+   r,   r  rb   rv   r[   )r$   r%   r   rz   r   r   r  r   r  dynamo_config_ctxr"  r+  rY   r   rn  r   r   r   ro  r  cr   r   inpr   real_idx	graph_idxtransformed_graph_constraints_dynamic_shapesr=  s                               r/   r  z/_dynamo_graph_capture_for_export.<locals>.innerS  s0   %' @	%#)#6#6f~#F K#K1L1LM+C9O+5c588??+KCKKQTM3?K   G % 4 4 : :#!%)-).15'+8<*. &+]]%9%9%Y%Y !; !$ $%(D01(D "(D
 (#+& ,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 Q(D (D (Dj %&  */R"Q% *1.@ A..11771;M;M;P;P;V;VV EE&" &" 13# M%c*femm&:&:&H&HI69:K6L%fll3M
 (9'>'>'@ B#)(6y(AH%B !7&! ! ik  0>"7#4#4]#CT6R0##, '')/0A4H/0:J""#672;"";/$A@	% @	%@(D (D (D (D (D (DX&W@	% @	%s   C"Q,.Q:Q=E(P:	%Q-Q5Q,Q&A<Q!Q&=Q,C"Q,:Q?QQQQ	Q,!Q&&Q,,Q5)r   ri   rj   r   )r=  r  r   r  r  r  s   `   @@r/    _dynamo_graph_capture_for_exportr  5  s?    6 %OLB%S B%C B%EHH,@,@ B%H Lr1   )Fr|   )^r+   loggingre  r   rO  collectionsr   collections.abcr   r   r   typingr   r   r	   r
   r   ri   torch.fxtorch.utils._pytreeutils_pytreer   torch._dynamo.convert_framer   r   r   torch._dynamo.decoratorsr   r3  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.symbolic_shapesr   r   r   torch.fx.graphr   r   torch.fx.noder   r   torch._subclasses.fake_tensorr    r!   	getLoggerr   r   r0   r7   rQ   r<   rj   r   r  rb   rv   r]  r^  rx   r   Transformerr   rX   rO   r   r  r  r  r  	Exceptionr  r!  r5  ru  rY   CodeGenr  r  r  r   r1   r/   <module>r     s     
   " 8 8 8 8    $ $ W W > L + A 8 ( F  
 7 * <CLg!& 8&
38
& & 	&
 &* 3 3  CHY((&&Y;?Y
XXYx'<EHH$8$8 '<T '<T
6EHHOO 
6   4{J6OP {UXX11 {|A)XX__A)CH%A) ()A) (	A)
 A) A) cNU3Z/$s);dBA) 
A)H*)=)= *$ *:uxx33 : : D	I 	 : 4e	e e(-c3heAEc3he
XXePJ$UXX^^33 J$^ ,0-c-j!D(- c3h-f ,0EI	b	#s(	b j!D(b cNU3Z/$s);dB	b
 c588'''(br1   