
    N j             	         % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
JrJr  S SKJrJrJrJr  S SKJrJrJrJr  S SKJr  S SKJrJrJrJrJrJrJrJ r J!r!  S SKJ"r"J#r#J$r$J%r%  S S	K	J&r&  S SK'r'S SK(r'S SK)J*r*  S SK+J*s  J,r-  S SK.J/s  J0r1  S S
K'J2r2J3r3J4r4  S SK5J6r6  S SK7J8r8  S SK9J:r:J;r;  S SK<J=r=  S SK(J>r>  S SK?J@r@  S SKAJBrBJCrCJDrDJErEJFrF  S SKGJHrH  S SKIJJrJ  S SK)JKrKJLrLJMrM  S SKNJOrO  S SKPJQrQJRrRJSrS  S SKTJUrU  S SKVJWrW  S SKXJYrY  S SKZJ[r[J\r\J]r]J^r^J_r_  S SK`Jara  S SKbJcrc  S SKdJereJfrfJgrg  SSKhJiri  SS KjJkrk  \(       a*  S SKlrlS S!KJmrm  S SKnrnS S"KoJprp  S S#K(Jqrq  S S$KrJsrs  S S%KtJuruJvrvJwrw  / S&Qrx\!S'   ry\'R                  \84r{\!\'R                  \84   r|\'R                  R                  r~\'R                  R                  r\GR                   " \5      r\'GR                  GR	                  \S(5      r0 qS)\S*'   Sr\ " S+5      r\ " S,5      r\"" S-5      r\ " S.5      r\$" S/5      r\" \5      r\1GR                   " \'GR"                  S0 S1 S2 S3S49  \'GR"                  \0rSS5 jr\    SS6 j5       r\" 5       r " S7 S85      r\" 5       rS S9KtJrJr   " S: S;\5      rSS< jr " S= S>\GR<                  5      r\" 5       r0 qS?\S@'   SSA jr\SSB j5       r\SSD j5       r\        SSE j5       r\        SSG j5       r        SSH jrSSI jr\c\L   rSJ\SF'   \c\L   rSJ\SK'   \      SSL j5       r\        SSM j5       r\          SSN j5       r\      SSO j5       r\        SSP j5       r\          SSQ j5       r\      SSR j5       r\        SSS j5       r\        SST j5       r\          SSU j5       r\SV 4         SSW jjrSSX jr\GRT                  SSY j5       r S       SSZ jjrSSS\ jjrS\-  \;-  \|-  \i-  \S]   -  \S^   -  \\S]4   -  \4-  \-  \-  \-  rSJ\S]'   SSS_ jjr\S`Sa.     SSb jj5       r\SSc j5       r\SSd j5       rSSe jr          SSf jr          SSg jr\!\L\Sh   \\Sh4   4   r\!\4\Si   \\Si4   4   r          SSj jr\ " Sk SC5      5       r    SSl jr\      SSm j5       r\      SSn j5       r\      SSo j5       r\      SSp j5       r      SSq jr\4\'GR                  GR                  \B4r      SSs jr      SSt jr            SSu jr " Sv Sw5      r\ " Sx Sy5      5       r " Sz S{\M5      r S     SS| jjr    SS} jr\'GR                   S       SS~ jj5       r          SS jrSqS\S'   \    SS j5       r " S S\Y5      r\" \5      r " S S\Y5      r\" \5      r " S Sr\_5      r          SS jr          SS jr " S S\*GR                  GR                  5      r " S S\*GR                  5      r " S S\*GR                  5      r      SS jr        SS jr\SS j5       r " S S\5      r " S S5      r " S S\5      r " S S5      rSqS\S'   \SS j5       r   SS[S[S[S`S[S[S[S.                       SS jjjrSS jrSS jrSS jr        SS jr\SS j5       r          SS jr  S           SS jjrSS jrg)    )annotationsN)defaultdictOrderedDict)Callable	GeneratorMappingSequence)_GeneratorContextManagercontextmanager	ExitStacknullcontext)	dataclass)	AnyConcatenateOptionaloverloadProtocolTYPE_CHECKING	TypeAliasTypeVarUnion)	ParamSpecSelfTypeVarTupleUnpack)WeakKeyDictionary)SymBoolSymIntTensor)enable_python_dispatcher)FakeScriptObject)is_opaque_value
OpaqueType)trace_structured)HigherOrderOperator)fast_detach)
FakeTensorFakeTensorModeget_plain_tensorsis_fakeunset_fake_temporarily)FunctionalTensor)is_sparse_any)GraphModuleProxyTracer)_assign_attr)1_side_effectful_need_to_be_preserved_pre_dispatchArgumentTarget)_extract_tensor_metadata)Module)TorchFunctionMode)_disable_infra_mode
_push_mode_unset_infra_modeautograd_would_have_decomposedTorchDispatchMode)count)Thunk)_WeakHashRefWeakIdKeyDictionaryWeakTensorKeyDictionary   )BackwardState)SymNode)MutableMapping)FunctionalizeCtxWrapper)
OpOverload)PHBase)BoolLikeTypeFloatLikeTypeIntLikeType)PythonKeyTracerdispatch_tracemake_fxDecompositionInterpreterselective_decomposepy_sym_typesget_innermost_proxy_modeget_proxy_modehandle_sym_dispatchmaybe_enable_thunkifymaybe_disable_thunkify)rL   _GraphAppendingTracerExnot_implementedMapping[OpOverload, Callable]CURRENT_DECOMPOSITION_TABLETU_PR_Tsc                    [        U 5      S 4$ N)list)xss    s/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/torch/fx/experimental/proxy_tensor.py<lambda>re      s    R$    c                    [        U 5      $ ra   )tuple)rc   _s     rd   re   re      s    %)rf   c                ~    [        U 5       VVs/ s H  u  p[        R                  " U5      U4PM     snnS 4$ s  snnf ra   )	enumeratepytreeSequenceKey)rc   ixs      rd   re   re      s5    09">&

Q
	#>%>s   $9z
torch.Size)flatten_with_keys_fnserialized_type_namec                n    SR                  S [        U5       5       5      n[        SU SU S3SU 05      $ )z*FX gets confused by varargs, de-confuse it,c              3  ,   #    U  H
  nS U 3v   M     g7f)argN ).0rn   s     rd   	<genexpr>!fake_signature.<locals>.<genexpr>   s     8<a#aS	<s   zlambda z: fn()fn)joinrangeeval)r{   nargsargnamess      rd   fake_signaturer      s:    xx85<88H'(5
!4tRjAArf   c              #  R   #    [         nU =(       d    0 q  [         v   Uq g ! Uq f = f7fra   )rZ   )decomposition_tableold_decomposition_tables     rd   	decomposer      s0     
 :"5";>))&=#&=#s   '  '$'c                      \ rS rSrSrg)
_NoDefault   rv   N__name__
__module____qualname____firstlineno____static_attributes__rv   rf   rd   r   r          rf   r   )rQ   	PySymTypec                       \ rS rSr% S\S'   Srg)_HasMeta   zdict[str, PySymType]metarv   Nr   r   r   r   __annotations__r   rv   rf   rd   r   r      s    
rf   r   c                    [        U S5      (       d  [        S5      eSU R                  ;   =(       a    [        U R                  S   [        5      $ )Nr   z3All nodes traced with proxy_tensor should have metaval)hasattrAssertionErrorr   
isinstancerQ   )nodes    rd   is_sym_noder      s?    4  RSSDIIL*TYYu-=|"LLrf   c                  $    \ rS rSr% SrS\S'   Srg)_DisableUpdateTensorTracker   Fboolvaluerv   N)r   r   r   r   r   r   r   rv   rf   rd   r   r      s    E4rf   r   zdict[int, torch.fx.Node]'_FAKE_TENSOR_ID_TO_PROXY_MAP_FOR_EXPORTc                 "    [         R                  $ )z;
Returns current state of disabling update tensor tracker.
"_disable_update_tensor_tracker_tlsr   rv   rf   rd   /_is_proxy_tensor_update_tensor_tracker_disabledr      s     .333rf   c               #     #    [         R                  n S[         l         Sv   U [         l        g! U [         l        f = f7f)ap  
NOTE "Do not clobber inplace ops"
By default tensor_tracker is updated every time.
This leads to chaining every operation by the FakeTensor.
For example for mutable ops if we have several consecutive mutable operations:

def f(x, y, z):
    x.copy_(y)
    x.copy_(z)
    return x

Default graph result:
def f_graph(x, y, z)
    x_1 = x.copy_(y)
    x_2 = x_1.copy_(z)
    return x_2

This chaining simplifies the fx passes and helps to prevent the reordering.
But in some cases, we want those nodes to be disconnected.
E.g. in case of splitting joint graph into forward and backward.
If first inplace op happened in forward, second in backward,
we want them after split to be properly placed.

Enabling this context manager for copy_ will result in:
def f_graph_2(x, y, z):
    x_1 = x.copy_(y)
    x_2 = x.copy_(z)
    return x

Results of copy_ x1 and x2 will have empty users in the graph.
The reason why this behavior is not enabled for all inplace ops is that
some fx passes (e.g. fx quantization) rely on chaining inplace ops like add_
in their fusions passes.
We could revisit enabling this logic for all inplace ops in future.
TNr   )
orig_values    rd   +_proxy_tensor_disable_update_tensor_trackerr      s6     J 499J/3&,>3=*0:*0s   ?/ ?<?_ProxyTensorc                    g ra   rv   objtracerproxys      rd   set_proxy_slotr      s    TWrf   c                    g ra   rv   r   s      rd   r   r          rf   _PySymProxyTypec                    g ra   rv   r   s      rd   r   r   	  r   rf   c                n   [         R                  SU [        U 5      U5        [        U [        5      (       aZ  [        U[
        5      (       d  [        S[        U5       35      eXR                  ;  d  [        5       (       d  X!R                  U '   g g [        U [        5      (       d  [        U 5      (       a;  [        U[        5      (       d  [        S[        U5       35      eX!R                  U '   g [        U [        5      (       d  [        S[        U 5       35      eXR                  ;  a  [         R"                  " [$        U5      nX!R                  U '   SS Kn[        U R(                  R*                  UR,                  5      (       a-  [/        X 5      UR0                  U R(                  R*                  '   g g g )Nzset_proxy_slot %s (%s) %szExpected _ProxyTensor, got Expected Proxy, got Expected py_sym_types, got r   )logdebugidr   r   r   r   typetensor_trackerr   _AnyScriptObjectr"   r/   script_object_trackerrQ   symnode_trackertypingcastr   sympyr   exprSymbol_SympyExprTrackerValuesympy_expr_tracker)r   r   r   r   s       rd   r   r     s]   
 II)33?#v %.. #>tE{m!LMM ,,,BDD).!!#& E 
C*	,	,0D0D%'' #7U}!EFF,1$$S) #|,, #>tCyk!JKK,,,KK7E*/""3' #((--66;Q<))#((--8 7% -rf   c                    [        U [        [        45      (       d  [        S[	        U 5       35      e[        [        XSS 5      5      $ )Nz Expected Tensor or SymNode, got Fc                    gNTrv   )ri   s    rd   re    has_proxy_slot.<locals>.<lambda>J  s    Trf   )r   r   rD   r   r   r   get_proxy_slotr   r   s     rd   has_proxy_slotr   F  s?    cFG,--?S	{KLLsE>BCCrf   r   _OpaqueObjectProxyTypec                    g ra   rv   r   s     rd   r   r   Q  s     rf   c                    g ra   rv   r   r   defaults      rd   r   r   X  s    
 !rf   c                    g ra   rv   r   r   r   	transforms       rd   r   r   `       rf   c                    g ra   rv   r   s     rd   r   r   i  s     rf   c                    g ra   rv   r   s      rd   r   r   p  s    
 rf   c                    g ra   rv   r   s       rd   r   r   x  r   rf   c                    g ra   rv   r   s     rd   r   r     s     rf   c                    g ra   rv   r   s      rd   r   r     s    
 !$rf   c                    g ra   rv   r   s      rd   r   r     s    
 (+rf   c                    g ra   rv   r   s       rd   r   r     r   rf   c                    U $ ra   rv   ro   s    rd   re   re     s    Arf   c           	     "   [        U [        5      (       a  UR                  nOj[        U [        5      (       d  [	        U 5      (       a  UR
                  nO8[        U [        5      (       d  [        S[        U 5       35      eUR                  nUR                  U 5      nUc  [        U [        5      (       a  U R                  R                  5       (       ap  UR                  R                  U R                  R                  5      =nb  UR                  nO1[!        XR                  R                  U 5        UR                  U 5      nUc?  [        U["        5      (       a(  [%        U  S[        U 5       S['        U 5       SU 35      eU$ U" U5      nU$ )Nr   z (z, z)is not tracked with proxy for )r   r   r   r   r"   r   rQ   r   r   r   getr   is_symbolicr   r   r   _build_proxy_for_sym_exprr   RuntimeErrorr   )r   r   r   r   trackerr   tmpress           rd   r   r     sK    #v''	C)	*	*oc.B.B..#|,, #>tCyk!JKK(( KKE}C6688!! 0044SXX]]CCP		 *&((--EC(}gz**%r$s)Br#wi/NvhW  
E
CJrf   c                *   / n[         R                  R                  [         R                  R                  R                  5      nUc  U$ [        U[        5      (       d  [        S[        U5       35      eUR                  n[        U / S9 H  n[        U[        5      (       a   [         R                  " UR                  5      n[        U[         R                  5      (       d  MY  [        XC5      nUc  Mi  UR!                  UR"                  5        M     U$ )N%Expected ProxyTorchDispatchMode, got )out)torch_C_get_dispatch_mode_TorchDispatchModeKeyPROXYr   ProxyTorchDispatchModer   r   r   r)   r,   _from_functional_tensorelemr   r   appendr   )tproxiesmoder   t_innerproxy_tensors         rd   _get_proxiesr     s    G88&&uxx'E'E'K'KLD|d233DT$ZLQRR[[F$QB/g/0033GLLAG'5<<00%g6#NN<--. 0 Nrf   c                     SSK n 0 nU R                  R                  R                  R	                  5       R                  5        H  u  p#[        [        US5      nUc  M  XAU'   M!     U$ )zd
Returns a dict converting sympy functions to python operators
(i.e. `sympy.Mul` -> `operator.mul`)
r   N)torch.utils._sympy.interputils_sympyinterphandlersitemsgetattroperator)r   r   kvops        rd   _sympy_handlersr    s[     %H""))224::<Xq$'>QK = Orf   c                6   U R                   R                  U5      =nb  U(       a  [        S5      eUR                  $ [	        U[
        [        [        45      (       a  U$ UR                  (       a  [        U5      $ UR                  (       a  [        U5      $ / nUR                   H$  n[        X5      =nc    gUR                  U5        M&     [        U5      n[        5       R                  UR                  5      nU(       d  gUc  U" U6 nU$ [!        XXB5        U$ )a  
Decompose `expr` and look for the pieces as inputs. If `out` is provided
then that will be the resulting SymNode (and `out.expr` must be the same as
`expr`).

This function is used when the ProxyTorchDispatchMode sees a SymNode
that it hasn't seen before to try to associate it with traced inputs.

How can this happen?

First thing to remember is that although sympy.Exprs are interned (so
`sympy.Expr("s3*s4")` will always have the same `id` and will always compare
equal) SymNode does not (so doing `SymNode("s3")*SymNode("s4")` twice in a
row will give two unique SymNodes).

- On way for this to happen is if we turn off tracing to compute an
  intermediate value and then USE that value with tracing turned on - for
  example if we turn off tracing to do some FakeTensor propagation to
  compute a size (dtensor does this) but then turn tracing back on and use
  that computed size.

- Another way is if we compute a size in one graph and stash it somewhere
  hidden (such as in some meta-data) and later use it in a different graph
  (dtensor does this too). Since the size was computed in the first graph
  and it's not an official input to the second graph it's not tracked
  properly. This is often going to show up as it usually works in fullgraph
  but a graph break causes a failure.

To handle this we decompose the sympy.Expr and look for the pieces as
inputs. But there are problems with this approach:

- We lose operation provanance: We end up figuring out where to get the
  inputs - but those may not actually be correct. If we have "s1" coming in
  from both tensor1 and tensor2 and we pick the wrong one we could end up
  keeping a tensor alive longer than intended.

- There's no guarantee that those values are inputs to the graph: If we have
  "s1*s2" computed in a graph #1 and used in graph #2 there's no guarantee
  that the input that holds "s1" is actually an input on graph #2.

- The decomposition isn't guaranteed to be the same: Sympy can "simplify"
  expressions so it's possible that our inputs are "s1*s2" and "s3" but we
  decompose it into "s1" and "s2*s3" - which wouldn't be found.

Other ways we could handle this:

- Don't: Just require that all inputs are tracked properly. This is the
  "correct" solution but harder because you need to track down each
  potential problem one by one and fix them. And when it fails it's a lot of
  work to figure out both why it's failing and the right way to fix it. This
  is complicated by the fact that a stashed value could be incorrect but
  work fine until we happen to get an graph break in the wrong place - so it
  may be a while before the bug is found. (Maybe we need a "dynamo abuse
  mode" where we run tests with as many graph breaks inserted as possible?)

- Track SymNode ops separately from proxy tracing: Right now SymNode
  operations are tracked as part of the proxy tracing - so when we disable
  proxy tracing we also disable SymNode tracing. But we don't have to do
  that - we could instead always have SymNodes track where they came from
  and just use that when needed. This solves the problem of tracing being
  temporarily turned off but doesn't help if an input isn't present after a
  graph break.

- Better decomposition: Right now the decomposition is pretty simple. We do
  have a sat-solver available to us so we could theoretically do a better
  job figuring out a "correct" decomposition. But that still relies on
  having the inputs available at all - which isn't a guarantee.
Nz6out should be empty when expr is in sympy_expr_tracker)r   r   r   r   r   intfloatr   
is_Integeris_Floatargsr   r   rh   r  func_sym_register)r   r   r   r   r  ru   	arg_valuer  s           rd   r   r     s    P **..t44A H  {{$eT*++4y}}T{Dyy26??IHI  ;D-/33DII>D
{Dk J 	fD.Jrf   Fc                x    [        U [        5      (       a  [        U R                  X5      $ U R	                  5       $ ra   )r   r'   r&   	fake_modedetach)r   include_reals     rd   snapshot_faker  a  s.     #z""3==#<<zz|rf   _ExtractValType)r  .c                   [        U 5      (       a	  [        XS9$ [        U [        5      (       a  U $ [        U [        5      (       a  U $ [        U [
        5      (       a  U $ [        U 5      (       a  U $ [        U [        [        45      (       a+  U R                  U  Vs/ s H  n[        U5      PM     sn5      $ [        U [        5      (       a/  U R                  5        VVs0 s H  u  p4U[        U5      _M     snn$ [        U [        5      (       a  U R                  (       dm  SSKJn  U" U 5      nU(       d	  [#        SS9nU   [$        R&                  " U R(                  U R+                  5       U R,                  U R.                  S9sS S S 5        $ g [        U [0        [2        [4        45      (       a  U $ U c  g [6        R8                  " U 5        g s  snf s  snnf ! , (       d  f       N0= f)Nr  r   )detect_fake_modeT)allow_fallback_kernels)devicedtype)r*   r  r   rQ   r   rC   r"   rb   rh   	__class__extract_valdictr  r   	is_sparsetorch._guardsr  r(   r   empty_stridedshapestrider  r  r	  r
  r   typing_extensionsassert_never)r   r  ro   r  r  r  fake_tensor_modes          rd   r  r  {  sn   s||S<<	C	&	&
	C)	*	*
	C	'	'
			
	C$	'	'}}c:ck!nc:;;	C		.1iik:kda;q>!k::	C	 	 }} 7/4##1#N !**IIszz|CJJcii "!
 	C#ud+	,	,
	""3'7 ;: "!s   GGAG
G%Tenablec             #  \   #    U R                   nXl          Sv   X l         g! X l         f = f7f)ac  
Enable thunkification inside the context manager.  Thunkification prevents
SymNode computation from directly being traced into an FX graph; instead,
the compute is only added to the graph if it is actually used.  This helps
us track SymNode compute when it is computed (since we need /something/
to put in the tracker) even if it is unlikely to be used.
N)enable_thunkify)r   r)  olds      rd   _enable_thunkifyr-    s,      
 
 C#%!$s   ,! ,),c               #     #    [        5       n U b"  [        U R                  SS9   Sv   SSS5        gSv   g! , (       d  f       g= f7f)aG  Within a context, disable thunkification.  See :func:`maybe_enable_thunkify`
for more details.  This is helpful if you have a wrapper function which
you want to enable thunkification on, but in some segment on the inside (say,
the original user function), you want to disable thunkification as you know
it is not needed there.
NFr(  rS   r-  r   
proxy_modes    rd   rV   rV     s=       !Jj//> ?> 	 ?>s   "A7A
AAc               #     #    [        5       n U b#  [        U R                  5         Sv   SSS5        gSv   g! , (       d  f       g= f7f)a  Within this context manager, if you are doing make_fx tracing, we will thunkify
all SymNode compute and avoid tracing it into the graph unless it is actually needed.
You should prefer to avoid using this as much as possible, as lazy evaluation of
SymNode tracing can lead to long chains of thunks which will stack overflow
if you evaluate them.  However, this is currently sometimes necessary as there
are buggy parts of PT2 which will fail with "s0 is not tracked with proxy" error
due to insufficient tracing of SymNode computation.
Nr/  r0  s    rd   rU   rU     s;       !Jj//0 10 	 10s   #A	8A	
AA	c                   [        XR                  R                  S:H  S9U R                  R                  S'   [	        U R
                  5         [        U5      (       a#  [        U5      U R                  R                  S'   OH[        U[        5      (       a3  UR                  (       d"  [        U5      U R                  R                  S'   S S S 5        U $ ! , (       d  f       U $ = f)Nplaceholderr  r   tensor_meta)r  r   r  r   r-  r   r*   r5   r   r   r   )r   r   s     rd   set_metar6    s    (::==M9EJJOOE 
%,,	'3<<-Ec-JEJJOOM*V$$S]]-Ec-JEJJOOM* 
( L 
(	' Ls   A<C
C"c                   ^ U R                   (       a#  [        [        R                  " U/UQ70 UD65      $ U" U0 UD6m[        U4S j5      $ )zH
Delays computation of f until it's called again
Also caches the result
c                    > T $ ra   rv   )rs   rd   re   thunkify.<locals>.<lambda>  s    Qrf   )r+  r>   	functoolspartial)r   fr  kwargsr9  s       @rd   thunkifyr?    sH     Y&&q:4:6:;;tvYrf   c                 ^^           SU4S jjn[        U R                  5       H  u  pVU" UUU4S jU5        M     [        U 5      (       d1  [        U R                  5       5       H  u  pVU" UUU4S jU5        M     U" U R	                  5       UU4S j5        [        U 5      (       d  U" U R                  5       UU4S j5        [        U T[        TU5      5        g )Nc           
        > [        U5      (       d  [        S5      e[        U [        5      (       a0  [	        T5         [        U T[        TX/UQ70 UD65        S S S 5        g g ! , (       d  f       g = f)Nzproxy_callable must be callable)callabler   r   r   r-  r   r?  )outer_sproxy_callabler  r>  r   s       rd   try_set_proxy_slot(track_tensor.<locals>.try_set_proxy_slot   sg     '' !BCCgv&&!&)V^NtNvN *) '))s   A##
A1c                   > [        TR                  S[        R                  R                  R
                  R                  TU40 5      U 5      $ Ncall_function)r6  create_proxyr   opsatensym_sizer	  ro   rn   r   r   s     rd   re   track_tensor.<locals>.<lambda>  s>    ###UYY^^%<%<%@%@5!*b 	rf   c                   > [        TR                  S[        R                  R                  R
                  R                  TU40 5      U 5      $ rH  )r6  rJ  r   rK  rL  
sym_strider	  rN  s     rd   re   rO  %  s@    X''')B)B)F)FPQ
TV 	rf   c                   > [        TR                  S[        R                  R                  R
                  R                  T40 5      U 5      $ rH  )r6  rJ  r   rK  rL  	sym_numelr   ro   r   r   s    rd   re   rO  0  s<    (!9!9!A!AE8R 	
rf   c                   > [        TR                  S[        R                  R                  R
                  R                  T40 5      U 5      $ rH  )r6  rJ  r   rK  rL  sym_storage_offsetr   rT  s    rd   re   rO  :  s?    h###IINN55==H	 rf   )
rC  rK   rD  z+Callable[Concatenate[PySymType, _P], Proxy]r  _P.argsr>  	_P.kwargsreturnNone)rk   r#  r-   r$  numelstorage_offsetr   r   )tensorr   constantr   rE  rn   ss    ` `   rd   track_tensorr`    s    C  	
 
* &,,' 		
 (   fmmo.DA 	 / 	
   !!#	
 66<x#@Arf   _NestedProxys_NestedTensorsc               T   ^^ [        X5                SUU4S jjmT" XU5        U $ )Nc           	     H  >^ [        U [        5      (       at  [        T[        5      (       d  [        S[	        T5       35      eUb,  [        U[        5      (       d  [        S[	        U5       35      e[        U TTUS9  [        TU 5        g [        U [        5      (       aT  [        T[        5      (       d  [        S[	        T5       35      e[        TU 5        [        U T[        TU4S j5      5        g [        U [        5      (       d  [        U 5      (       aF  [        T[        5      (       d  [        S[	        T5       35      e[        U TT5        [        TU 5        g [        U [        [        45      (       a^  [        T[        R                  5      (       a  [        TU 5              SS jn[        U 5       H  u  pET	" UTU   U" X$5      5        M     g [        U [         5      (       a`  Ub  [        S5      e[        T[        R                  5      (       a  [        TU 5        U R#                  5        H  u  pgT	" UTU   S 5        M     g [        U [$        5      (       a@  [        T[        5      (       d  [        S[	        T5       35      e[        TU 5        TU l        g g )Nr   zExpected None or Tensor, got )r   r^  c                    > T $ ra   rv   r   s   rd   re   <track_tensor_tree.<locals>.wrap_with_proxy.<locals>.<lambda>t  s    urf   c                v    U c  g [        U [        [        45      (       d  [        S[	        U 5       35      eX   $ )NzExpected list or tuple, got )r   rb   rh   r   r   )cidxs     rd   get_constant@track_tensor_tree.<locals>.wrap_with_proxy.<locals>.get_constant  s<     9%a$77,/KDQRG9-UVV6Mrf   zExpected constant to be None)ri  Optional[_NestedTensors]rj  r	  rY  rm  )r   r   r/   r   r   r`  r6  rQ   r   r?  r   r"   rh   rb   fxrk   r  r  rC   r   )
er   r^  rk  rj  eekeyr   r   wrap_with_proxys
    `      rd   rr  *track_tensor_tree.<locals>.wrap_with_proxye  s3    a  eU++$';DK=%IJJ$
8V(D(D$'DT(^DT%UVVE&8DUA<((eU++$';DK=%IJJUA1fhv}&EF+,,0B0BeU++$';DK=%IJJ1fe,UAE4=))%**"	"+	"25	")	" %Q<  E#JX0KL (
 4   #$%CDD%**"GGIU3Z6 & =))eU++$';DK=%IJJUAAG rf   )ro  objectr   ra  r^  rm  rY  rZ  )_set_unbacked_bindings)	inner_res	proxy_resr^  r   rr  s      `@rd   track_tensor_treerx  O  sP    ( 90BB'B3KB	B BH I(3rf   c                  *    \ rS rSr% S\S'   S\S'   Srg)r   i  r/   r   Optional[Tensor]r^  rv   Nr   rv   rf   rd   r   r     s    Lrf   c                   ^  SU 4S jjnU$ )Nc                2  > U R                   nUR                  b  UR                  $ U R                   R                  R                  (       a  [	        U [
        5      (       a  [        U R                   R                  5      $ [	        U [        5      (       a  [        U R                   R                  5      $ [        U R                   R                  5      $ [	        U [        5      (       d  [        S[        U 5       35      e[        U T5      R                  5       $ )Nr   )r   r^  r   	is_numberr   r   r   r   r	  r
  rQ   r   r   r   force)ro  nr   s     rd   innerfetch_sym_proxy.<locals>.inner  s    FF::!::66;;  !W%%AFFKK((Av&&166;;''%%a..$'B47)%LMM!!V,2244rf   )ro  r   rY  zUnion[int, bool, float, Proxy]rv   )r   r  s   ` rd   fetch_sym_proxyr    s    5  Lrf   c                    g ra   rv   r   r   s     rd   fetch_object_proxyr    s     #&rf   c                    g ra   rv   r  s     rd   r  r    s     *-rf   c                    g ra   rv   r  s     rd   r  r    s     ),rf   c                    g ra   rv   r  s     rd   r  r    s     03rf   c                    [        XU5      $ ra   r   r  s     rd   r  r    s     !Q''rf   r   c                   UR                   (       d  UR                  (       d  g[        U [        R                  R
                  5      (       d  g[        [        [        UR                  R                  R                  5      5      5      nUR                  R                  S5      n[        R                  [        R                  4n[        U[        R                   5      =(       a    UR"                  U;   nU(       dv  UR$                   Hf  n['        US5      (       a  UR                  R                  S5      OSn[        U[        R                   5      (       d  MR  UR"                  U;   d  Md  Sn  O   U(       d  gSUR                  S'   g)z
Records operators whose tensor outputs or inputs are fp16/bf16 so downstream pointwise code can
emulate eager's rounding behavior when emulate_precision_casts is enabled.
Nr   r   Tlow_precision_pointwise_barrier)decomp_layersemulate_precision_castsr   r   _opsrG   nextiterreversedr   graphnodesr   r   bfloat16float16r   r  all_input_nodesr   )r  r1  	last_noder   	low_pr_fpoutput_low_precision
input_noder   s           rd   _maybe_record_pointwise_barrierr    s    z'I'IdEJJ1122T(:#4#4#:#:#@#@ABCI5!A/I%a6O177i;O#33J07
F0K0K*//%%e,QUC#u||,,i1G'+$	 4  8<INN45rf   c                   U  Vs/ s H;  n[        U[        [        45      (       d  [        U5      (       a  [	        X5      OUPM=     nn[        S U 5       5      (       + =(       a    [        S U  5       5      (       + nU Vs/ s H&  n[        U[        5      (       a  UR                  OUPM(     nnU Vs/ s H+  n[        U[        5      (       a  [        U5      " U5      OUPM-     nnU[        U5      U4$ s  snf s  snf s  snf )z
Given flat arguments, fetch the proxies and whether they are all constants.
This is later used in proxy_call or when someone is trying to stitch together
graph node in tf or td modes.
c              3  l   #    U  H*  n[        U[        5      (       d  M  UR                  S L v   M,     g 7fra   r   r   r^  rw   r   s     rd   rx   7_fetch_proxies_and_all_constant_flag.<locals>.<genexpr>!  s,      
'!\* AJJ$'   44c              3  B   #    U  H  n[        U[        5      v   M     g 7fra   )r   rQ   )rw   ro   s     rd   rx   r  (  s     J9IAJq,//9Is   )r   r   r   r"   r  anyr   r   rQ   r  rh   )flat_args_kwargsr   ro   f_flat_args_kwargsall_constantro  proxy_flat_args_kwargss          rd   $_fetch_proxies_and_all_constant_flagr    s'    " "A !f&6788OA<N<N v) "    
'
 
 	
 	K J9IJJJ  @R?Q!:a..A5?Q   ('A (2!\'B'B	 	#	I'  
 u%;<lJJA.s   AC7-C<52Dc           	       ^ ^^ / m[         R                  " X445      u  pVSU U4S jjm[        U4S jU 5       5      (       d  [        R	                  ST5        [
        $ [        T XU5      nU[
        La  [        UT 5        U$ U(       d  U[        R                  R                  R                  R                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  4;  aB  [        X5      (       a2  T    UR                   " U0 UD6nU[
        La  UsS S S 5        $  S S S 5        U[        R                  R                  R"                  R                  L aN  T    [        R$                  " US   R'                  5       S:H  S 5        US   S:g  R)                  5       sS S S 5        $ T R*                  n[-        XX5      u  pn[        R.                  R0                  UR2                  ;   a  U(       ag  U	 Vs/ s H&  n[5        U[6        5      (       a  UR8                  OUPM(     nn[         R:                  " X5      u  p[=        5          U" U0 UD6sS S S 5        $ T R>                  (       a2  [         R@                  " [B        S X445      (       a  [E        SU S	35      e[         R:                  " X5      u  nnU[        R                  R                  RF                  R                  L a.  [        R                  R                  RH                  R                  nT R*                  RK                  S
UUUT R*                  RL                  RO                  URP                  RR                  5      S9n[U        T R*                  5         U" U0 UD6nS S S 5        [W        S U	 5       5      nS nSS jnU[        R                  R                  RH                  R                  L aw  WR'                  5       [X        ::  a_  [=        5          [5        US   [Z        [B        45      (       d  []        S[_        US   5       35      eUS   Ra                  5       nS S S 5        O[        R.                  Rb                  UR2                  ;  a  U(       a  U(       a  [         R@                  " [B        UW5      (       ag  [=        5          U	 Vs/ s H&  n[5        U[6        5      (       a  UR8                  OUPM(     nn[         R:                  " X5      u  pU" U0 UD6nS S S 5        OS n[e        WUUUS9  [        UT 5        U$ ! , (       d  f       GN= f! , (       d  f       GN= fs  snf ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       Nu= fs  snf ! , (       d  f       N= f)Nc                &  > [        U 5      [        ;   =(       d    [        U TR                  5      nTR                  (       a.  U=(       d%    [        U 5      [
        R                  R                  L nU(       d  TR                  [        U 5      5        U$ ra   )	r   HANDLED_TYPESr   r   _allow_fake_constantr   _subclassesr'   r   )ro   r9  r1  unrecognized_typess     rd   can_handle_tensor%proxy_call.<locals>.can_handle_tensorA  se    G}$Lq*:K:K(L**<T!W 1 1 < <<A%%d1g.rf   c              3  b   >#    U  H$  n[        U[        5      (       d  M  T" U5      v   M&     g 7fra   )r   r   )rw   ro   r  s     rd   rx   proxy_call.<locals>.<genexpr>K  s(     W-=AvAV# ##-=s   //zEProxyTensorMode tensors without proxy had unrecognized subclasses: %sr   rB   c                     g)Nz=Boolean value of Tensor with more than one value is ambiguousrv   rv   rf   rd   re   proxy_call.<locals>.<lambda>k  s    Wrf   c                "    [        U 5      (       + $ ra   )r*   r   s    rd   re   r    s
    '!*nrf   zHIt appears that you're trying to get value out of a tracing tensor with z - erroring out! It's likely that this is caused by data-dependent control flow or similar.  It may be possible to trace this with dynamic shapes; try setting tracing_mode='symbolic' in your make_fx call.rI  )namec              3  l   #    U  H*  n[        U[        5      (       d  M  UR                  S Lv   M,     g 7fra   r  r  s     rd   rx   r    s,      #Aa& 	

$#r  c                0    U R                  5       [        :*  $ ra   )r[  CONSTANT_NUMEL_LIMITr  s    rd   tensor_numel_in_limit)proxy_call.<locals>.tensor_numel_in_limit  s    wwy000rf   zExpected Proxy or Tensor, got r^  r   )ro   r   rY  r   )r   r   rY  r   )3rl   tree_flattenallnot_implemented_logr   NotImplementedmaybe_handle_decompr  r   rK  rL  sizer   r$  r\  r;   r   
is_nonzero_checkr[  itemr   r  Tagdata_dependent_outputtagsr   r   r^  tree_unflattenr+   _error_on_data_dependent_opstree_all_onlyr   r   
lift_freshlift_fresh_copyrJ  r  _target_to_stroverloadpacketr   r-  r  r  r/   r   r   clonenondeterministic_seededrx  )r1  r  pre_dispatchr  r>  r  specr9  r   r  r  r  r   const_flat_args_kwargs
const_argsconst_kwargs
proxy_argsproxy_kwargs	proxy_outr   any_constantr^  r  r  r  s   `                      @@rd   
proxy_callr  7  s    &(#00$@  W-=WWW!!S	
 JF;A'j9 IINN''IINN!!))IINN))11

 +4BB//A& Z& 
 uyy~~((000LLQ1$W GqL&&( Z F,-=F = yy&&$))3 ,&+A )L99

q@+ # & (.'<'<&($J ()Z8<8 *)
 22v7K7K,tn8
 8
 Z[_Z` a( (   &445KRJF uyy~~((000yy~~--55!!..$$33D4G4G4P4PQ / I 
*++	,D#F# 
-0  # L H1 			..666IIK//#%d1gv77$'Ed4PQ7m_%UVVAw}}H &%
 			)):  )>DD $% ,&+A )L99

q@+ # & (.'<'<&($J Z8<8H &% c9xG#D*5Jy Z Z& *)z 
-	,T &%& &%sb   (UAU)$-U;5V +	V(AV$V:#-V5"V:
U&)
U8 
V
V!$
V25V::
Wc                  n    \ rS rSrSrSS jrSS jrSS jrSS jr S     SS jjr	SS	 jr
SS
 jrSrg)_SymNodeDicti  zE
Wrapper around a dictionary that will hash SymInts with their nodes
c                    0 U l         g ra   sym_node_dictselfs    rd   __init___SymNodeDict.__init__  s
    ?Arf   c                4    X R                   UR                  '   g ra   r  r   )r  rq  r   s      rd   __setitem___SymNodeDict.__setitem__	  s    ',388$rf   c                4    U R                   UR                     $ ra   r  r  rq  s     rd   __getitem___SymNodeDict.__getitem__  s    !!#((++rf   c                4    UR                   U R                  ;   $ ra   )r   r  r  s     rd   __contains___SymNodeDict.__contains__  s    xx4----rf   Nc                N    U R                   R                  UR                  U5      $ ra   )r  r   r   )r  rq  r   s      rd   r   _SymNodeDict.get  s!    
 !!%%chh88rf   c                    [         era   )NotImplementedErrorr  s    rd   __iter___SymNodeDict.__iter__  s    !!rf   c                ,    [        U R                  5      $ ra   )lenr  r  s    rd   __len___SymNodeDict.__len__  s    4%%&&rf   r  rY  rZ  )rq  r   r   r   rY  rZ  )rq  r   rY  r   )rq  r   rY  r   ra   )rq  r   r   zOptional[_PySymProxyType]rY  r   )rY  r   )rY  r	  )r   r   r   r   __doc__r  r  r  r  r   r  r  r   rv   rf   rd   r  r    sJ    B-,. DH99'@9	9"'rf   r  c                  *    \ rS rSr% S\S'   S\S'   Srg)r   i   r   r   r   r   rv   Nr   rv   rf   rd   r   r      s    rf   r   c                  6  ^  \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   SrS\S'   SU 4S jjr          SS jr        SS jrSU 4S jjr	\
SS j5       r\
SS j5       r\
    SS j5       rS S jr  S!             S"U 4S jjjrSrU =r$ )#rL   i&  z8MutableMapping[_AnyScriptObjectType | OpaqueType, Proxy]r   r  r   *dict[sympy.Symbol, _SympyExprTrackerValue]r   $MutableMapping[Tensor, _ProxyTensor]r   dict[OpOverload, int]torch_fn_countsFr   r+  c                   > [         TU ]  SS9  [        5       U l        [	        5       U l        [        S [        S9U l        0 U l	        S U l
        0 U l        SU l        g )Nrv   )autowrap_modulesr  ref_typeF)superr  rA   r   r  r   r@   r?   r   r   torch_fn_metadatar  r+  )r  r  s    rd   r  PythonKeyTracer.__init__.  s`    "-57+~%8&
" #% "&  "$rf   c                    U" U0 UD6$ ra   rv   )r  mforwardr  r>  s        rd   call_modulePythonKeyTracer.call_moduleA  s     '''rf   c                    U$ ra   rv   )r  attrattr_valparameter_proxy_caches       rd   r  PythonKeyTracer.getattrK  s	     rf   c                  > [        U[        R                  R                  5      (       ax  U R                  R                  5        H  u  p#XL d  M  U R                  SUS0 5      s  $    U R                  S5      n[        U R                  XA5        U R                  SUS0 5      $ [        U[        5      (       a8  UR                  R                  c  [        S5      eUR                  R                  $ [        TU ]9  U5      $ )Nget_attrrv   _param_constantz"a.node.constant should not be None)r   r   nn	Parameterrootnamed_parameterscreate_nodeget_fresh_qualnamesetattrrQ   r   r^  r   r  
create_arg)r  ar  pqualnamer  s        rd   r  PythonKeyTracer.create_argP  s    a++,,		2246++J2rBB 5 ../@AHDIIx+##J"bAA<((vv&$%IJJ66??"w!!$$rf   c                    g ra   rv   r  ro  s     rd   unwrap_proxyPythonKeyTracer.unwrap_proxy`  s    ?Brf   c                    g ra   rv   r%  s     rd   r&  r'  c  s    EHrf   c                    g ra   rv   r%  s     rd   r&  r'  f  s     .1rf   c                    [        U[        5      (       a  [        XUS 5      $ [        U[        5      (       a  [        XUS 5      $ [        U[        5      (       d  [        U5      (       a  [        XU5      $ U$ )Nc                    U R                   $ ra   rf  r   s    rd   re   .PythonKeyTracer.unwrap_proxy.<locals>.<lambda>m  s    rf   c                "    U R                  5       $ ra   )r~  )ro  s    rd   re   r,  o  s
    	rf   )r   r   r   rQ   r   r"   r%  s     rd   r&  r'  k  sf    a  !!1.?@@<((!!1.ABB+,,0B0B!!1--Hrf   c                r  > [         TU ]  XX4XV5      nUR                  S;   a  SUR                  ;   a  UR                  S	 US:X  a  [	        U[
        5      (       d  [        S[        U5       35      e[        U R                  U5      n[	        U[        R                  5      (       a+  [        5          [        U5      UR                  S'   S S S 5        SS jn	[        X#U45      (       a=  [        R                  R                   R#                  X44U	5      u  pX4UR                  S'   U$ ! , (       d  f       Nd= f)	Nr4  outputstack_tracer  zExpected str, got r   c                .   [        U [        R                  R                  5      (       a  SU R                  ;  a  g U R                  S   n[        U[        R
                  5      (       a  [        U[        5      (       d  g [        U R                  S   5      $ )Nr   )r   r   rn  Noder   r   r'   r  )r  r   s     rd   map_fn+PythonKeyTracer.create_node.<locals>.map_fn  sg    a//53F&&-C #u||,,ZZ5P5Pqvve}--rf   eager_input_vals)r  r   rY  zOptional[_ExtractValType])r  r  r  r   r   strr   r   r  r  r   r   disable_proxy_modes_tracingr  _should_save_eager_input_valsrn  r   map_aggregate)r  kindtargetr  r>  r  	type_exprr   r  r4  arg_inp	kwarg_inpr  s               rd   r  PythonKeyTracer.create_nodeu  s     w"4tO77//MTYY4N		-(:fc**$'9$v,%HII499f-D$--02'24'8DIIe$ 3	. )@@ "'!<!<d^V!TG-4,@DII()- 32s   1D((
D6)r+  r   r   r   r   r  r	  r  )
r  r6   r  zCallable[..., Any]r  ztuple[Any, ...]r>  zdict[str, Any]rY  r   r  r7  r  rt  r  zdict[str, Proxy]rY  rt  )r   rt  rY  fx.node.Node)ro  r   rY  zUnion[Proxy, Tensor])ro  r   rY  zUnion[Proxy, PySymType])ro  _AnyScriptObjectTyperY  "Union[Proxy, _AnyScriptObjectType])ro  r[   rY  rt  )NN)r;  r7  r<  r4   r  ztuple[Argument, ...]r>  zdict[str, Argument]r  zOptional[str]r=  zOptional[Any]rY  ztorch.fx.Node)r   r   r   r   r   r+  r  r  r  r  r   r&  r  r   __classcell__r  s   @rd   rL   rL   &  s*   SS!!BB88**!OT!%&(( $( 	(
 ( 
(#)BR	
%  B BH H1%1	+1 1  ##')) ) #	)
 $) ) !) 
) )rf   rL   c                &   SSK Jn  [        U 5      (       d  g[        U [        R
                  R                  R                  [        R
                  R                  R                  U45      (       a  gUb  U [        R                  R                  R                  L d'  U [        R                  R                  R                  L at  US   n[        US   [        R                  R                  [        R                  R                  45      (       d  [!        S[#        US   5       35      e[%        US   S 5      $ U [        R                  R                  R&                  L a  g[        U [        R                  R                  5      (       a/  [(        R*                  " [$        U5      (       a  [-        SU  S35      e[        U [        R                  R                  5      (       a3  SSKJn  U" U 5      [        R2                  R4                  R6                  :H  $ g)	Nr   )InvokeSubgraphHOPFTz0Expected OpOverload or HigherOrderOperator, got zNYI: The HOP z has an input that is an OpOverload that needs exact strides. We probably need special logic to propagate the FakeTensor vals. Please file an issue.)get_layout_constraint_tag)'torch._higher_order_ops.invoke_subgraphrH  rB  r   r   _higher_order_opstriton_kernel_wrapTritonKernelWrapperFunctionalTritonKernelWrapperMutationrK  higher_orderauto_functionalizedauto_functionalized_v2r  rG   r%   r   r   r9  with_effectsrl   tree_anyr   torch._library.utilsrI  r   r  needs_exact_strides)r<  args_kwargsrH  r  rI  s        rd   r9  r9    s    JF##66TT##66RR	
  %))((<<<UYY++BBB1~Gejj++UZZ-K-KL
 
 !B4Q=/R  -T!Wd;;''444 &%**8899??8+FFx (G H 
 &%**//00B(0EHHLL4T4TTTrf   c                *   ^  [         SU 4S jj5       nU$ )Nc               3  J  >#    SSK Jn JnJn  / nS nU " 5       S:  a9  U" 5       n[	        UT5      (       a  UnOUR                  U5        U " 5       S:  a  M9  [        U5       H  nU" U5        M      Uv   UbQ  [        U5      nUS:  a  U" 5       nUS-  nUS:  a  M  UR                  U5        [        U5       H  nU" U5        M     g g ! UbQ  [        U5      nUS:  a  U" 5       nUS-  nUS:  a  M  UR                  U5        [        U5       H  nU" U5        M     f f = f7f)Nr   )_len_torch_function_stack	_pop_moder9   rB   )torch.overridesrY  rZ  r9   r   r   r  r  )rY  rZ  r9   temp_elementsremoved_moder   r=   mode_tys          rd   context_manager_fnB_make_temp_remove_mode_context_manager.<locals>.context_manager_fn  s6    TT')A-;D$((#$$T* ()A- ]+Dt ,	% 'M*ai$;DQJE ai $$\2$]3Dt$ 4 (|'M*ai$;DQJE ai $$\2$]3Dt$ 4 (s0   AD#D#1C
 5&D#-D#
'D 3-D  D#)rY  z2Generator[Optional[TorchFunctionMode], None, None])r   )r^  r_  s   ` rd   &_make_temp_remove_mode_context_managerra    s      % %@ rf   c                .   UR                  X5      nSS jnUR                  U5        SSKJn  U" U5        [	        U [
        5      (       a  U R                  R                  OU R                  n[        R                  R                  UR                  X65      $ )Nc                    SSK Jn  U R                  5       (       a  gU" U 5      (       a  g[        U R                  R                  S5      [        5      (       a"  [        S U R                   5       5      (       a  gg)NrB   )is_accessor_nodeTFr   c              3     #    U  HO  n[        U[        R                  5      (       d  M$  [        UR                  R	                  S 5      [
        5      v   MQ     g7f)r   N)r   rn  r3  r   r   rQ   )rw   r   s     rd   rx   6dispatch_trace.<locals>.impure_pred.<locals>.<genexpr>  s>      Aa) <
166::e,l;;s
   #A0A)	symbolic_shapesrd  	is_impurer   r   r   rQ   r  r  )r  rd  s     rd   impure_pred#dispatch_trace.<locals>.impure_pred   sk    5 ;;== A
 qvvzz%(,77      rf   r   )dedupe_symints)r  zfx.NoderY  r   )traceeliminate_dead_code,torch._inductor.fx_passes.dedupe_symint_usesrk  r   r6   r  r   rn  _lazy_graph_module_make_graph_moduler  )r  r   concrete_argsr  ri  rk  r  s          rd   rM   rM     sp     LL-E8 
k*K5&0v&>&>4>>""DMMD  33FKKMMrf   c                   ^ ^^^ [         R                  " T5      u  mn[        R                  " T 5      SU UUU4S jj5       nU$ )Nc                   > [         R                  " U 5      u  p#[        U5      [        T5      :w  a#  [        S[        U5       S[        T5       35      e[	        5        n[        U[        5      (       d  [        S[        U5       35      e[        TUS TS9  S S S 5        [        TSS5      (       aL  [        TU 5       VVs/ s H2  u  pV[        U[        R                  R                  5      (       a  UOUPM4     snnmS
U4S jjnT
" T6 n[         R                  " [        Xx5      n[         R                  " [         U4S jU5      nSU4S	 jjn	[         R                  " ["        X5      nU$ ! , (       d  f       N= fs  snnf )NzExpected same length: z vs r   r  proxy_module_inputsFc                "   > [        U TU S 5      $ )Nc                    U R                   $ ra   rf  r   s    rd   re   Jwrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot.<locals>.<lambda>A  s    !''rf   r  r   r   s    rd   get_tensor_proxy_slot8wrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot@  s    !!VQ0ABBrf   c                "   > [        U TU S 5      $ )Nc                    U $ ra   rv   r   s    rd   re   =wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>F  s    qrf   r  rx  s    rd   re   +wrap_key.<locals>.wrapped.<locals>.<lambda>F  s    q&![(Qrf   c                8   > [        U T5      R                  5       $ ra   )r   r~  rx  s    rd   get_sym_proxy_slot5wrap_key.<locals>.wrapped.<locals>.get_sym_proxy_slotI  s    !!V,2244rf   )r   r   rY  zUnion[Tensor, Proxy])r   r   rY  r/   )rl   r  r  r   r8  r   r   r   rx  r  zipr   r  r6   tree_map_onlyr   r   rQ   )r   _unusedflat_proxies_proxies_specr  r   r!  ry  r   r  r=  flat_tensorstensorsr   s             rd   wrappedwrap_key.<locals>.wrapped,  sS    '-&9&9'&B#|L 11 (\):(;4L@Q?RS  )*aa!788$'LTRSWI%VWWlL4PVW +
 60%88  11DA  588??33:1G
	C k""6+@F""QSV
	5 ""<1CI
1 +*s   9E+9E<+
E9)r   rW  r  rX  rY  r^   )rl   r  r;  wraps)r=  r  r   r  _tensors_specr  r  s   ```   @rd   wrap_keyr  $  sB     #)"5"5g">L-__Q     D Nrf   zOptional[object]ORIGINAL_ATENc              #     #    [         cJ  [        R                  " 5       (       a0  U q U [        R                  S'    S v   S q S [        R                  S'   g S v   g ! S q S [        R                  S'   f = f7f)Noriginal_aten)r  fx_tracebackhas_preserved_node_metacurrent_meta)r  s    rd   set_original_aten_opr  V  sh     
 !E!E!G!G59!!/2	> M9=L%%o6 !M9=L%%o6s   7A3A A3A00A3c                  B    \ rS rSrSS jr  S         SS jjrSrg)	TorchFunctionMetadataModeig  c                    Xl         g ra   r   r  r   s     rd   r  "TorchFunctionMetadataMode.__init__h  s    rf   Nc                    U=(       d    0 nXR                   l        U R                   R                  R                  US5      S-   U R                   R                  U'   U" U0 UD6$ )Nr   rB   )r   r	  r  r   r  r  typesr  r>  s        rd   __torch_function__,TorchFunctionMetadataMode.__torch_function__k  sY     2(,%,0KK,G,G,K,KDRS,TWX,X##D)T$V$$rf   r  r   _ProxyTracerrY  rZ  rv   N
r  rG   r   tuple[torch._C._TensorMeta, ...]r  tuple[object, ...]r>  Optional[dict[str, object]]rY  rt  r   r   r   r   r  r  r   rv   rf   rd   r  r  g  sI     $&.2%% 0% !	%
 ,% 
% %rf   r  c                  B    \ rS rSrSS jr  S         SS jjrSrg)	PreDispatchTorchFunctionModei  c                    Xl         / U l        g ra   )r   enter_autocast_nodesr  s     rd   r  %PreDispatchTorchFunctionMode.__init__  s     :<!rf   Nc                   U=(       d    0 nU[         ;   Ga>  U[        R                  R                  R                  L a  U R
                  R                  5       nU4nU R                  R                  SX0 5      nU[        R                  R                  R                  L a  U R
                  R                  U5        U[        R                  R                  [        R                  R                  R                  [        R                  R                  R                  4;   a  S UR                  S'   U[        R                  R                  L a  U" U0 UD6  U$ U[        R                  R                  R                   [        R                  R                  R"                  [        R                  R                  R$                  [        R                  R                  R&                  [        R                  R(                  R*                  4;   aU  [-        X0R                  5      u  pxnU R                  R/                  SUU0 5      n	U" U0 UD6n
[1        XS U R                  S9  U
$ U" U0 UD6$ )NrI  r   r  )r2   r   ampautocast_mode_exit_autocastr  popr   r  _enter_autocastr   r   _set_grad_enabledr   
_functorchpredispatch_add_batch_dim_remove_batch_dim_vmap_increment_nesting_vmap_decrement_nestingvmaplazy_load_decompositionsr  rJ  rx  )r  r  r  r  r>  
enter_noder   ri   r   	out_proxyr   s              rd   r  /PreDispatchTorchFunctionMode.__torch_function__  s    2DD
 uyy..===!66::<
"};;**?DKDuyy..>>>))006**		''77		''66 
 $(		%  uxx111d%f%K
 ((77((::((@@((@@!!::
 
 A{{SMA00	I ''CctDKKPJT$V$$rf   )r  r   r  r  )
r  zUnion[OpOverload, Callable]r  r  r  r  r>  r  rY  rt  r  rv   rf   rd   r  r    sI    < $&.24%)4% 04% !	4%
 ,4% 
4% 4%rf   r  c                     ^  \ rS rSr\S
S j5       r   S           SU 4S jjjr\  S         SS jj5       rSU 4S jjr	        SU 4S jjr
\S
S j5       r          SS jrS	rU =r$ )r   i  c                    gr   rv   r  s    rd   enable_tracing%ProxyTorchDispatchMode.enable_tracing      rf   c                  > U(       a$  [         R                  R                  R                  OS n[        TU ]  U5        Xl        X l        X0l        X@l	        XPl
        [         R                  R                  R                  U l        / U l        SU l        [!        5       U l        0 U l        SSKJn  UR*                  U l        g )Nr   config)r   r   DispatchKeyPreDispatchr  r  r   tracing_moder  r  r  r   r   	_mode_keyenter_stackr  set_invoke_subgraph_names_invoke_subgraph_cachetorch._inductorr  r  )	r  r   r  r  r  r  dkr  r  s	           rd   r  ProxyTorchDispatchMode.__init__  s     2>UXX!!--4(($8!,H) 77== DF"#03#  	# 	+-3-K-K$rf   c                    [        U5         U=(       d    0 nU[        R                  R                  :X  a  U" U0 UD6sS S S 5        $ [	        XU R
                  X45      sS S S 5        $ ! , (       d  f       g = fra   )r  primr  r   r  r  r  s        rd   __torch_dispatch__)ProxyTorchDispatchMode.__torch_dispatch__  s\     "$'\rFt{{***T,V,	 (' d$*;*;TJ (''s   1A'A''
A5c                   > [        [        R                  R                  R                  5      nU R
                  R                  U5        [        TU ]!  5       $ ra   )	r:   r   r   r   r   r  r   r  	__enter__)r  maybe_prev_proxy_moder  s     rd   r   ProxyTorchDispatchMode.__enter__  sA     1%((2P2P2V2V W 56w ""rf   c                x   > [         TU ]  XU5      nU R                  R                  5       nUb  [	        U5        U$ ra   )r  __exit__r  r  r9   )r  exc_type	exc_value	tracebackbmb_previous_proxy_moder  s         rd   r  ProxyTorchDispatchMode.__exit__  sA     GX)< "&!1!1!5!5!7!--.rf   c                    gr   rv   )clss    rd   is_infra_mode$ProxyTorchDispatchMode.is_infra_mode  r  rf   c                &   U[         R                  L aL  [        US   [        5      (       a  US   S:X  a  US   $ [        US   [        5      (       a  US   S:X  a  US   $ U(       a  [	        S5      eU" U0 UD6n[        U R                  XU5        U$ )NrB   r   zExpected no keyword arguments)r  mulr   r	  r   r  r   )r  r  r  r  r>  r   s         rd   __sym_dispatch__'ProxyTorchDispatchMode.__sym_dispatch__  s     8<<$q'3''DGqLAwDGS))d1glAw
  !@AAD#F#dkk4s3
rf   )r  r  r  r  r  r  r  r  r  r   r  rY  r   )FFT)r   r  r  r7  r  r   r  r   r  r   rY  rZ  r  r  )rY  r   )r  zOptional[type[BaseException]]r  zOptional[BaseException]r  zOptional[types.TracebackType]rY  zOptional[bool])
r  rG   r  r  r  r  r>  dict[str, object]rY  rt  )r   r   r   r   propertyr  r  r=   r  r  r  classmethodr  r  r   rE  rF  s   @rd   r   r     s>     #%*-1LL L 	L
 #L '+L 
L L@ 
 $&.2KK 0K !	K
 ,K 
K K#/ + 1	
 
   0 !	
 " 
 rf   c           	     h    [        U[        5      (       a  [        U [        XX#S9n[	        X0U5        g g )N)r  r  r   )r   rQ   r?  _compute_proxyr   )r   r  r  r   p_out_thunks        rd   r  r  -  s5     #|$$NFD
 	sK0	 %rf   c                *  ^  [        U5      S:X  a8  [        US   [        [        45      (       a  [        U 4S jUS    5       5      4nO[        U 4S jU 5       5      nT R	                  SX0 5      n[
        R                  " UT 5      n[        Xc5        U$ )NrB   r   c              3     >#    U  H@  n[        U[        5      (       a$  [        UT5      R                  5       R                  OUv   MB     g 7fra   r   rQ   r   r~  r   rw   r   r   s     rd   rx   !_compute_proxy.<locals>.<genexpr>B  sI       !A "!\22 #1f-335:: !   AAc              3     >#    U  H@  n[        U[        5      (       a$  [        UT5      R                  5       R                  OUv   MB     g 7fra   r  r  s     rd   rx   r  L  sI      
  a.. q&)//166 r  rI  )r  r   rb   rh   r  rn  r/   r6  )r   r  r  r   n_argsn_outp_outs   `      rd   r  r  ;  s    
 4yA~*T!WtUm<<  a 	
  
 
 
 bAEHHUF#EULrf   c                  x   ^  \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   SrS\S'   SU 4S jjrSrU =r$ )rW   i]  z+MutableMapping[_AnyScriptObjectType, Proxy]r   z*MutableMapping[PySymType, _PySymProxyType]r   r  r   r   r   zOptional[OpOverload]r	  r  r  Fr   r+  c                   > [         TU ]  U5        [        R                  " 5       U l        [        5       U l        0 U l        [        S [        S9U l
        S U l        0 U l        g )Nr  )r  r  weakrefr   r   rA   r   r   r@   r?   r   r	  r  )r  r  r  s     rd   r   _GraphAppendingTracerEx.__init__f  sZ    &88:57"$%8&
" "&  "rf   )r   r   r   r   r  r	  )r  zfx.graph.GraphrY  rZ  )	r   r   r   r   r   r+  r  r   rE  rF  s   @rd   rW   rW   ]  s;    FF??88BB++**!OT!" "rf   rW   c                     ^  \ rS rSr S         S	U 4S jjjr        S
U 4S jjr        S
U 4S jjr        S
U 4S jjrSU 4S jjrSr	U =r
$ )rO   iw  c                   > [         TU ]  " U40 UD6  X l        [        U R                  5      U l        U=(       d    0 U l        [        U R                  SS9U l        g )Nreal)r  )r  r  	new_graphrW   r   r   r   r   )r  moduler  r   r>  r  s        rd   r  !DecompositionInterpreter.__init__x  sK     	*6*"-dnn=#6#<" *4;;VL	rf   c                   > [         TU ]  XU5      n[        R                  " U R                  R                  U5      U R
                  5      n[        XES U R
                  S9  U$ Nr  )r  r4  rn  r/   r  r   rx  r  r<  r  r>  r   r   r  s         rd   r4  $DecompositionInterpreter.placeholder  sN     g!&733F;T[[I#tDKKH
rf   c                   > [         TU ]  XU5      n[        R                  " U R                  R                  U5      U R
                  5      n[        XES U R
                  S9  U$ r  )r  r  rn  r/   r  r   rx  r  s         rd   r  !DecompositionInterpreter.get_attr  sN     gvV4008$++F#tDKKH
rf   c                   >^ ^ [         TT ]  XU5      nSS jmSUU 4S jjnT R                  R                  [        R                  " XT5      5        U$ )Nc                .    U R                   R                  $ ra   )r   r   r   s    rd   get_proxy_node7DecompositionInterpreter.output.<locals>.get_proxy_node  s    77<<rf   c                4   > [        U TR                  U T5      $ ra   )r   r   )ro  r  r  s    rd   unwrap/DecompositionInterpreter.output.<locals>.unwrap  s    !!T[[!^DDrf   )ro   r   rY  rB  )ro  r   rY  zUnion[Tensor, fx.Node])r  r0  r  rl   tree_map)r  r<  r  r>  r   r  r  r  s   `     @rd   r0  DecompositionInterpreter.output  sH     gnV62	 	E 	E 	foof:;
rf   c                   > [        U R                  5         U R                     [        TU ]  " U0 UD6sS S S 5        sS S S 5        $ ! , (       d  f       O= fS S S 5        g ! , (       d  f       g = fra   )r   r   r   r  run)r  r  r>  r  s      rd   r  DecompositionInterpreter.run  sF     t//0$))7;// 3<)00))000s!   A!A	A!
A	A!!
A/)r   r   r  r   ra   )
r  fx.GraphModuler  fx.Graphr   'Optional[Mapping[OpOverload, Callable]]r>  rt  rY  rZ  )r<  r7  r  r  r>  r  rY  rt  )r  rt  r>  rt  rY  rt  )r   r   r   r   r  r4  r  r0  r  r   rE  rF  s   @rd   rO   rO   w  s    
 HL	MM M E	M
 M 
M M

 !
 "	

 

		 !	 "		
 
	 ! "	
 
"0 0rf   rO   c                  t   ^  \ rS rSr          SU 4S jjr\          SS j5       rU 4S jrSrU =r	$ )_SelectiveDecomposeInterpreteri  c                @   > [         TU ]  " U40 UD6  X l        X0l        g)zw
For all nodes in `module`, selectively decompose if is `should_decompose`,
following the given `decomposition_table`.
N)r  r  should_decomposer   )r  r  r  r   r>  r  s        rd   r  '_SelectiveDecomposeInterpreter.__init__  s#     	*6* 0#6 rf   c                   U R                   R                   H  nUR                  S:X  d  M  [        UR                  [
        5      (       d  M6  / nUR                   HN  n[        U[        R                  5      (       a  [        R                  " XaU40 UD6nOUnUR                  U5        MP     [        U5      Ul        M     [        XU40 UD6$ )a  
Recursively wrap gm and its sub graph modules. Specifically, HOP takes
sub graph module as args. We may not want to decompose all nodes within
these sub graph modules. So we also need to wrap these sub graph modules.
As a result:
- if should_decompose(hop) is True, we decompose all nodes within the hop.
- if should_decompose(hop) is False, we check each node within the hop
    and decide whether decompose or not.
rI  )r  r  r  r   r<  r%   r  rn  r.   r  recursive_wrapr   rh   )gmr  r   r>  r   new_argsru   new_args           rd   r   -_SelectiveDecomposeInterpreter.recursive_wrap  s      HHNNDww/)j0/ / 99C!#r~~66"@"O"O3F#JP# #&OOG, % "(O	 # ."5
9?
 	
rf   c                   > U R                  U5      (       a/  [        U R                  5         [        TU ]  U5      nS S S 5        U$ [        TU ]  U5      nU$ ! , (       d  f       W$ = fra   )r  r   r   r  run_node)r  r  resultr  s      rd   r&  '_SelectiveDecomposeInterpreter.run_node  sc      ##4334)!, 5  W%a(F	 54 s   A
A')r   r  )
r  r  r  Callable[[fx.Node], bool]r   rY   r>  rt  rY  rZ  )
r!  r  r  r)  r   rY   r>  rt  rY  r  )
r   r   r   r   r  staticmethodr   r&  r   rE  rF  s   @rd   r  r    s    77 47 ;	7
 7 
7  
 
3 
 ; 
 	 

 
( 
  
D rf   r  c               Z   ^ ^^^ U(       a  SUUU U4S jjnOUU U4S jn[        U0 S9" T6 $ )zARetrace a joint graph module and selectively apply decomposition.c                L   > [         R                  TTT5      R                  " T6 $ ra   r  r   r  )primalstangentsr  decompositionjoint_gmr  s     rd   wrap_fn$selective_decompose.<locals>.wrap_fn  0    1@@*Mc rf   c                 L   > [         R                  TTT5      R                  " U 6 $ ra   r-  )r  r0  r1  r  s    rd   r2  r3  	  r4  rf   )r   )r.  	list[Any]r/  r6  )rN   )r1  r0  r  trace_joint_graphr  r2  s   ``` ` rd   rP   rP     s+     	 		
 73T::rf   c                R   ^ ^ [         R                  " X45      u  nmSU U4S jjnXC4$ )Nc                F   > [         R                  " U T5      u  pT" U0 UD6$ ra   )rl   r  )	flat_argsfn_args	fn_kwargsr  r  s      rd   r  -wrapper_and_args_for_make_fx.<locals>.wrapped  s(    #229dCW*	**rf   )r:  zlist[object]rY  r^   )rl   r  )r  r  r>  r:  r  r  s   `    @rd   wrapper_and_args_for_make_fxr>    s0    
 ))4.9OIt+ + rf   c               #     #    [         R                  " 5       n [         R                  " S5         S v   [         R                  " U 5        g ! [         R                  " U 5        f = f7fNF)r   is_autocast_cache_enabledset_autocast_cache_enabled)	old_values    rd   disable_autocast_cacherD    sE     //1I	$$U+4((3((3s   ,A%A
 A%
A""A%c                      \ rS rSrSrg)#_ModuleNotInstalledAsSubmoduleErrori)  rv   Nr   rv   rf   rd   rF  rF  )  r   rf   rF  c                      \ rS rSrSS jrSrg)
_AttrProxyi.  c                    g ra   rv   )r  basepaths      rd   reset_proxy_mapping_AttrProxy.reset_proxy_mapping/  s    rf   rv   N)rJ  r6   rK  r7  rY  rZ  )r   r   r   r   rL  r   rv   rf   rd   rH  rH  .  s    rf   rH  c                     ^  \ rS rSrSrSU 4S jjrSS jr        SU 4S jjr      SU 4S jjr          SS jr	SS jr
SU 4S	 jjrS
rU =r$ )_ModuleStackTraceri3  a  Customized version of PythonKeyTracer that retains module stack
information in node.meta["nn_module_stack"].

FX symbolic trace actually does this already, but it relies on `self.root`
being the actual module being traced. Since make_fx traces a lambda of our
creation, things don't work properly.

So for this version we hold onto a reference to the original module
(scope_root) and use that to match the path. Also when we see,
        A
       / \
      B   C
       \ /
        D
we want to record the path as A.B.D by recording only one path.
See Note [Preserving the nn module stack metadata during export non-strict mode]  # noqa: W605
c                  >^^ [         TU ]  5         SU l        SU l        Xl        SU l        0 U l        U R                  R                  SS9 HO  u  p#X0R                  ;   a-  [        R                  SU R                  U   U5        SU l        MA  X R                  U'   MQ     [        5       U l        [        5       U l        [        5       U l        SU l        [        [         5      U l        U R                  R                  SS9 H,  u  p$U R"                  [%        U5         R'                  U5        M.     U m " UU4S jS[(        5      mTU l        g )NTF)remove_duplicatez<Shared module found between %s and %s, AttrProxy is enabled.r   c                     >^  \ rS rSrSU4S jjrS	UU U4S jjrS
U4S jjrSUU U4S jjr\SUU4S jj5       r	Sr
U =r$ )._ModuleStackTracer.__init__.<locals>.AttrProxyif  c                  > [        U[        5      (       a  UR                  5       n[        U[        5      (       d  [	        S[        U5       35      e[        UR                  R                  U R                  UR                  40 5      U l        UR                  U l        UR                  R                  U R                  l	        UR                  R                  U R                  l
        UTR                  U '   UTR                  U '   g )NExpected Module, got )r   rH  get_baser6   r   r   r  r   __dict__r   r   proxy_pathsproxy_modules)r  rJ  rK  r   s      rd   r  7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__g  s    dJ//==?D!$//(+@d)MNN "&NN++^^T^^4"
 !%,0NN,E,E).2nn.I.I+ ,0""4(-1$$T*rf   c                   > [        U [        5      (       d  [        S[        U 5       35      e[        TU ]  U5      n[        U[        5      (       d  U$ T" UTR                  U    S-   U-   5      $ )NrU  .)r   r6   r   r   r  __getattr__rX  )r  r  r  	AttrProxyr  r   s      rd   r]  :_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__  sl    !$//(+@d)MNN !7.t4!(F33#O 6+=+=d+Cc+ID+PQQrf   c                "   > TR                   U    $ ra   )rY  r  s    rd   rV  7_ModuleStackTracer.__init__.<locals>.AttrProxy.get_base  s    ++D11rf   c                |  > [        U[        5      (       Ga  [        U [        R                  R                  5      (       ag  [        R                  R	                  [        [        U R                  R                  5       5      U   5      5      nT" UTR                  U     SU 35      $ [        U [        R                  R                  5      (       a^  [        R                  R                  [        U R                  R                  5       5      U   5      nT" UTR                  U     SU 35      $ [        TU ]5  U5      $ )Nr\  )r   slicer   r  
Sequentialr   rb   _modulesr  rX  
ModuleListvaluesr  r  )r  rj  r   r^  r  r   s      rd   r  :_ModuleStackTracer.__init__.<locals>.AttrProxy.__getitem__  s    c5))!$(;(;<<#hh11'T]]-@-@-B(CC(HI  )1C1CD1I0J!C5.QRR#D%((*=*=>>#hh11$t}}7K7K7M2Ns2ST(1C1CD1I0J!C5.QRRw*3//rf   c                X  > SU R                   ;  a  [        S5      eU R                   S   n[        U[        5      (       d  [        S[	        U5       35      eUR                  5        VVs0 s H0  u  p#UUb%  T" UTR                  U    S-   [        U5      -   5      OU_M2     snn$ s  snnf )Nre  z_modules not in __dict__zExpected dict, got r\  )rW  r   r   r  r   r  rX  r7  )r  
submodulesrq  r   r^  r   s       rd   re  7_ModuleStackTracer.__init__.<locals>.AttrProxy._modules  s    T]]2()CDD!]]:6
!*d33(+>tJ?O>P)QRR '1&6&6&8 '9
  , "%););D)AC)G#c()RS"#
 '9  s   +7B&)r  rW  )rJ  zUnion[Module, _AttrProxy]rK  r7  rY  rZ  )r  r7  rY  r^  )rY  r6   )rj  zUnion[int, slice]rY  r^  )rY  zdict[str, AttrProxy])r   r   r   r   r  r]  rV  r  r  re  r   rE  )r  r^  r   s   @rd   r^  rS  f  s7    20
R 
R20 0"  rf   r^  )r  r  record_stack_traces!_record_forward_stack_traces_only
scope_rootenable_attr_proxysubmodule_pathsnamed_modulesr   infor   rX  attr_proxy_maprY  counterr   rb   module_id_cacher   r   rH  
proxy_type)r  rn  r  r  modr^  r   r  s        @@rd   r  _ModuleStackTracer.__init__F  s0   #' 15.$!&!44e4LGD(((R((+
 *.&*.$$Q' M @Q?REVEXDUDW*40666NID  C)006 O H	 H	
 H	T $rf   c                    XR                   L a  g[        U[        5      (       a  U R                  U   $  [        R
                  " X5      $ ! [         a  n[        UeSnAff = f)z
Use tracked access path during tracing instead of the default BFS behavior.
Still use all the possible module paths to verify the result.
 N)rn  r   rH  rX  r0   path_of_module	NameErrorrF  )r  rw  ro  s      rd   r{  !_ModuleStackTracer.path_of_module  s]    
 //!c:&&##C((	=((33 	=51<	=s   A 
A!AA!c                  > [        U[        5      (       a0  [        U[        R                  5      (       d  U R                  (       d  [
        TU ]  XU5      $ [        U[        5      (       a  U$ X R                  ;  a  U R                  X!5      U R                  U'   OU R                  U   R                  X!5        U R                  U   $ ra   )r   r6   rn  r.   ro  r  r  rH  rs  rv  rL  )r  r  r  r  r  s       rd   r  _ModuleStackTracer.getattr  s     8V,,(BNN33))7?43HIIh
++O ...,0OOH,KD))==hM""8,,rf   c                   > [         TU ]  X5      n[        R                  5         U R                  R                  5        H+  u  pEUR                  R                  [        [        U5      '   M-     / nU R                  R                  5        H(  u  pxXR                  ;   d  M  UR                  Xx45        M*     SS jn	U H=  u  pU	" U R                  U
5        U R                  U   n[        XR                  U
5        M?     U$ )Nc                   UR                  S5      nUS S US   pC[        U [        5      (       d  [        S[	        U 5       35      eU nU H=  n[        XV5      (       d    g[        XV5      n[        U[        [        45      (       a  M=    g   [        XT5      (       d  g[        [        XT5      [        5      (       d  g[        XT5        g)Nr\  rU  FT)	splitr   r6   r   r   r   r  rH  delattr)r   r<  atomsrK  target_submodrw  r  s          rd   _delete_proxy_attr4_ModuleStackTracer.trace.<locals>._delete_proxy_attr  s     LL%E"'*eBi-c6**$'<T#YK%HIIC s)) c(!#
F';<<   3.. gc9:FFC'rf   )r   r6   r<  r7  rY  r   )r  rl  r   clearr   r  r   r   r   r  rq  rY  r   r1   )r  r  rq  r   rq  r   !proxy_module_names_to_be_replacedr  r  r  proxy_module_nameproxy_moduleactual_moduler  s                rd   rl  _ModuleStackTracer.trace  s     gmD0 	0557++113HC?Byy~~3BsG< 4 KM) II335LD+++188$H 6	< 0Q+tyy*;< ..|<M		3DE 0Q
 
rf   c                    SSK Jn  [        X[        45      (       a  U" U0 UD6$  [        R
                  " XX#U5      $ ! [         a*    [        R                  S[        U5      5        U" U0 UD6s $ f = f)z\PythonKeyTracer overrides call_module to avoid the scope handling,
but we actually want it.
r   )OptimizedModulezUnable to find the path of the module %s. This might be because the module was not properly registered as a submodule, which is not good practice. We will trace through the module without recording stack information.)
torch._dynamor  r   r.   r0   r  rF  r   r   r7  )r  r  r  r  r>  r  s         rd   r  _ModuleStackTracer.call_module	  s     	2 a;788D+F++
	,%%dwfEE2 	,IIJ A D+F++	,s   > 1A21A2c                    gr@  rv   )r  r  module_qualified_names      rd   is_leaf_module!_ModuleStackTracer.is_leaf_module<	  s    rf   c                  > [         TU ]  " U0 UD6nUR                  S;  a  UR                  R	                  S5      c'  U R
                  R                  5       UR                  S'   UR                  S   R                  5        HM  u  nu  pV[        U[        5      (       d  M  UUR                  S-   UR                  -   4UR                  S   U'   MO     UR                  S:X  a  U R                  b  SUR                  ;  ax  U R                  R                   SU R                  U R                      3U R                  R                  R                   SU R                  R                   34UR                  S'   U$ )a  
Create node and add on metadata.
Add nn_module_stack here instead of TracerBase,
since calls to make_fx() might not want to record module stack metadata.
Add torch_fn by looking at torch_fn_metadata and torch_fn_counts.
Add stack_trace by filtering out forward() stack frames.
r/  nn_module_stackr\  rI  torch_fnri   )r  r  r  r   r   module_stackcopyr  r   r   r   r   r	  r   r  r  )r  r  r>  r   rq  fqnmod_clsr  s          rd   r  _ModuleStackTracer.create_node?	  sX    w"D3F3 7733yy}}./7/3/@/@/E/E/G		+,'+yy1B'C'I'I'K#^cgt,,**S073G3GG9DII/05 (L GG&&&2$))+ ))2231T5I5I$J`J`5a4bc))33<<=Qt?U?U?^?^>_`%DIIj!
 rf   )rm  rs  rt  ro  ru  rY  rX  rv  rl  rn  rp  )rn  r.   rY  rZ  )rw  r6   rY  r7  rA  )r  Union[Module, Callable]rq  r  rY  r  )
r  r6   r  r   r  r  r>  r  rY  rZ  )r  r6   r  r7  rY  r   )r  rt  r>  rt  rY  rB  )r   r   r   r   r  r  r{  r  rl  r  r  r  r   rE  rF  s   @rd   rO  rO  3  s    $j$X= --#)-BR-	-&C+C<WC	CJ , ,  , !	 ,
 " , 
 ,D! !rf   rO  c                     \ rS rSr    S                       SS jjrSS jr              SS jr\      SS j5       rSS jr	\    SS j5       r
SS	 jrSS
 jrSS jrSS jr      SS jrSrg)_MakefxTraceric	  Nc                   [        U=(       d    0 5      U l        U R                  R                  [        R                  R
                  R                  R                  [        R                  R                  R                  5        X l
        X0l        X@l        XPl        X`l        Xpl        S U l        [#        5       U l        [#        5       U l        S U l        [#        5       U l        [#        5       U l        Xl        Xl        Xl        Xl        g ra   )r  r   
setdefaultr   rK  rL  rS  r   _decompdecompositionsr  _allow_non_fake_inputsr  record_module_stackr  r  r'  r   r1  proxy_function_mode	fx_tracerpython_dispatcher_modetorch_fn_metadata_moderl  parent_tracerrt  _disable_torch_fn_metadata_mode)r  r   r  r  r  r  r  r  rl  r  rt  r  s               rd   r  _MakefxTracer.__init__d	  s      @D%2@
  	  ++IINN$$,,emm.J.J.T.T	
 ".,B#".)< *>!2N) ;?FQmM 	  59?J}#M 	# $7 6C#6 /N,rf   c                    U R                   U R                  U R                  U R                  U R                  U R
                  /$ ra   r'  r1  r  r  r  r  r  s    rd   _checkpoint_modes_MakefxTracer._checkpoint_modes	  s>    !!OO$$NN''''
 	
rf   c                L    Xl         X l        X0l        X@l        XPl        X`l        g ra   r  )r  prev_fake_tensor_modeprev_proxy_modeprev_proxy_function_modeprev_fx_tracerprev_python_dispatcher_modeprev_torch_fn_metadata_modes          rd   _restore_modes_MakefxTracer._restore_modes	  s&     !6)#; '&A#&A#rf   c              #    #    U R                  5       n SSKJn  [        US5      (       a.  U R                  (       a  UR
                  n[        U5      U l        OL[        5       U l        U R                  U R                  l	        U R                  (       a  SU R                  l
        U R                  S:X  ao  SS KnUR                  R                  R                  U5      nUc<  SS KJs  Jn  UR'                  SS9   [)        SU R*                  U" 5       SS	9nS S S 5        Xpl        OU R                  S
:X  a  SS KnUR                  R                  R                  U5      nUc=  U" 5       n	SS KJs  Jn  UR'                  SS9   [)        SU R*                  U	S9nS S S 5        UR.                  c  [1        S5      eXpl        O(U R                  S:X  d  [1        SU R                   35      eU R3                  U R                  5        S v   U R4                  " U6   g ! , (       d  f       GN= f! , (       d  f       N= f! U R4                  " U6   f = f7f)NrB   )ShapeEnv	_orig_modTfaker   F)(fake_tensor_allow_unsafe_data_ptr_access)r  allow_non_fake_inputs	shape_envstatic_shapessymbolic)r  r  r  2shape_env should be set if tracing with 'symbolic'r  zUnexpected tracing type: )r  rg  r  r   r  r  rO  r  rL   rl  rm  r  r  _dynamor   r  torch._functorch.configr  r  patchr(   r  r'  r  r   _construct_modes_with_fx_tracerr  )
r  r=  r  
prev_modesr  rn  r   r'  _configr  s
             rd   _init_modes_from_inputs%_MakefxTracer._init_modes_from_inputs	  s     ++-
:	-1q+&&4+C+C[[
 "4J!?!0!2595M5M2++GKDNND  F*$#(==#6#6#G#G#M #+== PUV+937262M2M&.j*.	,( W )9%""j0$#(==#6#6#G#G#M #+ (
I== PUV+938262M2M&/,( W $--5(L  )9%((F2(3D4E4E3FG  00@,I WV  WV( ,sO   I
C%H6 9HA*H6 ?H%A.H6 I

H"H6 %
H3/H6 6II
c                ~   [        UU R                  U R                  U R                  U R                  S9U l        U R                  (       a  [        U5      U l        U R                  S:X  d  U R                  (       a  [        5       U l	        U R                  (       d  [        U5      U l        U R                  Ul        g )N)r  r  r  r  )r   r  r  r  r  r1  r  r  r    r  r  r  r  rt  )r  r  s     rd   r  -_MakefxTracer._construct_modes_with_fx_tracer	  s    0**!%!:!:)-)J)J
 'CI'ND$ 
*d.?.?*B*DD'33*CI*ND'(,(@(@	%rf   c              #  <  #    U R                  5       n UR                  U l        SS jnUR                  c  [        S5      eU" UR                  5      U l        U R	                  U R                  5        S v   U R
                  " U6   g ! U R
                  " U6   f = f7f)Nc                    [        U 5      [        L a
  [        5       $ [        U 5      [        L a  [        U R                  5      $ [	        S[        U 5       S35      e)NzUnexpected tracer type: r\  )r   rL   rO  rn  r   r  s    rd   _create_sub_fx_tracerD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracer
  sV    &/9*,,-(,>>-m.F.FGG&243F2GqI rf   z*parent_tracer.fx_tracer should not be None)r  r  rY  rL   )r  r'  r  r   r  r  )r  r  r  r  s       rd   _init_modes_from_parent%_MakefxTracer._init_modes_from_parent
  s      ++-
	-$1$B$BD! &&.$%QRR2=3J3JKDN00@,D,s   BA$B 8BBBc           	     .  ^ ^ SS K m[        R                  " U4S jU5      nSU U4S jjnSS jnU" U5      nU" X5      n[        R                  " [
        T R                  5      n[        5        nUR                  [        T R                  5      5        T R                  (       a  UR                  T R                  5        UR                  T R                  5        UR                  T R                  5        UR                  T R                  5        UR                  U5        UR                  [        5       5        UR                  [!        T 5      5        T R"                  c  [%        S5      e ['        [)        XbT R"                  T R*                  5      T R"                  [-        U5      S9n	 S S S 5        T R3                  5       (       aY  TR4                  R7                  U5      =n
(       a7  U
R8                  b*  SSKJn  U" W	U
R8                  S5        U	R?                  5         T R@                  S:X  a3  T R                  c  [%        S5      eT R                  R8                  W	l        W	$ ! [.         a    [1        SS U 4S	 jS
9  e f = f! , (       d  f       N= f)Nr   c                D   > TR                   R                  R                  $ ra   )rn  _symbolic_tracePH)ri   r   s    rd   re   ,_MakefxTracer._trace_inner.<locals>.<lambda>)
  s    (@(@(C(Crf   c                t   >^ SmSUUU4S jjnS UUS.n[         R                  " UTR                     U 5      $ )Nr   c                  > SSK Jn  TR                  c  [        S5      eU" ST 35      n[	        U [
        5      (       a  TS-  mTR                  R                  XS9$ [        U 5      [        L ay  TR                  S:X  ai  TR                  R                  c  [        S5      eTR                  R                  R                  TR                  R                  R                  XS S	9U US
9$ [	        U TR                  5      (       d  [        U 5      (       a0  TR                  R                   R#                  TR                  U 5      $ [	        U [$        5      (       a  [        SU  S35      eU $ )Nr   )ConstantSource#fake_tensor_mode should not be NoneinputrB   )sourcer  r  )positive)hintr  zScriptObject z. has been fakified. Cannot wrap_fake it again.)torch._dynamo.sourcer  r'  r   r   r   from_tensorr   r	  r  r  create_symintnodecreate_symbolScriptObjectr"   _libraryfake_class_registrymaybe_to_fake_objr!   )ro   r  r  	arg_countr  r   s      rd   inner_wrap_fakeG_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.inner_wrap_fake.
  sh    @((0()NOO'%	{(;<a((NI00<<Q<NN!W^(9(9Z(G,,66>,P   00::LL--77EE F  % M    5#5#566/!:L:L >>==OO--q  a!122('s*XY  rf   c                    U $ ra   rv   r   s    rd   re   @_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.<lambda>U
  s    !rf   r  r  r  )ro   rt  rY  rt  )rl   r  r  )r  r  wrap_fn_mapr  r  r   s      @rd   
_wrap_fake._MakefxTracer._trace_inner.<locals>._wrap_fake+
  sC    I$ $N $'+K
 ??;t/@/@#A4HHrf   c                    [        [        R                  " U 5      S5      (       a@  [        R                  " U 5      R                  R                  [        R
                  -  (       a  [        U [        U5      5      $ U $ )N__code__)r   inspectr  r  co_flags
CO_VARARGSr   r  )r=  phss     rd   
_wrap_func._MakefxTracer._trace_inner.<locals>._wrap_func[
  sS    GNN1-z::>>!$--669K9KK &aS22Hrf   zfx_tracer should not be None)r   rq  artifactc                     SSS.$ )Nmake_fx_fail_partialstring)r  encodingrv   rv   rf   rd   re   r  
  s     6$,)rf   c                 d   > T R                   R                  R                  SSSSS9R                  $ )Nr  T)root_moduleverboseinclude_strideinclude_device)r  r  python_codesrcr  s   rd   re   r  
  s8    t~~';';'G'G$* $'+'+	 (H (
 c(rf   )metadata_fn
payload_fn)insert_deferred_runtime_assertsreenter_make_fxr  r  )r  r[   rY  r[   )r=  Callable[_P, R]r  zSequence[PHBase]rY  r  )!r  rl   r  r   r   r   r1  r   enter_contextr   r   r'  r  r  r  rD  _set_make_fx_tracerr  r   rM   r  r  rh   	Exceptionr$   is_hop_subgraph_tracer_guardsr  r  torch.fx.passes.runtime_assertr  	recompiler  )r  r=  r  r  r  r  r  r1  stackr   r  r  r   s   `           @rd   _trace_inner_MakefxTracer._trace_inner!
  s    	ooCTJ.	I .	I`	 $!! .4[["DOO.

 [E	$*B*B CD$$##D$9$9: ; ;< 8 89 ; ;<
+ 6 89 3D 9:~~%$%CDD"T9J9JK>>"'* H ''))#mm<<TBBB##/V+Ay/B/BDUVKKM
*$$,$%JKK//99AK=   !  ' [s   /C>J.=I''JJ
Jc                    U R                  X5         U R                  " U/UQ76 sS S S 5        $ ! , (       d  f       g = fra   )r  r  )r  r=  r  s      rd   rl  _MakefxTracer.trace
  s/    ))!2$$Q.. 322s   /
=c                    U R                   S L$ ra   r  r  s    rd   r  $_MakefxTracer.is_hop_subgraph_tracer
  s    !!--rf   c                   [        U R                  SU R                  U R                  U R                  U R
                  U R                  U S9nUR                  U 5         UR                  " U/UQ76 sS S S 5        $ ! , (       d  f       g = f)Nr  r  )	r  r   r  r  r  r  r  r  r  )r  r=  r  
sub_tracers       rd   trace_subgraph_MakefxTracer.trace_subgraph
  sw    "$$''$$%%--	

 //5**14t4 655s   A;;
B	c                \   [        U[        5      (       d  [        S[        U5       35      e[	        USU R
                  U R                  U R                  U R                  U R                  U S9nUR                  U 5         UR                  " U/UQ76 sS S S 5        $ ! , (       d  f       g = f)NzExpected Mapping, got r  r  )r   r   r   r   r  r  r  r  r  r  r  r  )r  r=  decomp_tabler  r  s        rd   trace_subgraph_custom_decomp*_MakefxTracer.trace_subgraph_custom_decomp
  s     ,00 #9$|:L9M!NOO"''$$%%--	

 //5**14t4 655s    B
B+)r  r  r  r  r   r'  r  r  r  r  r1  rt  r  r  rl  r  r  )FNFF)r   r  r  r7  r  r   r  r   r  r   r  r   r  r   rl  r   r  Optional[_MakefxTracer]rt  r   r  r   rY  rZ  )rY  r6  )r  zOptional[FakeTensorMode]r  z*Union[nullcontext, ProxyTorchDispatchMode]r  z0Union[nullcontext, PreDispatchTorchFunctionMode]r  zOptional[PythonKeyTracer]r  zUnion[nullcontext, Any]r  z-Union[nullcontext, TorchFunctionMetadataMode]rY  rZ  )r=  r   r  r  rY  Generator[None, None, None])r  r  rY  rZ  )r  r  rY  r%  )r=  r   r  rt  rY  r.   )r=  r   r  rt  rY  r  r  )r=  r   r!  rY   rY  r.   )r   r   r   r   r  r  r  r   r  r  r  r  rl  r  r  r"  r   rv   rf   rd   r  r  c	  s|    %*15$)05.OD.O .O !%	.O
 .O ".O #.O '+.O ".O /.O ".O *..O 
.O`
B7B DB #S	B
 2B &=B &SB 
B  >->-!3>-	$>- >-@A* -*-	$- -8@D/.555)F5	5rf   r  r$  _CURRENT_MAKE_FX_TRACERc              #  8   #    [         n U q S v   Uq g ! Uq f = f7fra   )r&  )r   prev_tracers     rd   r  r  
  s&      *K."("-+s    )r  r  r  r  rl  rt  r  c                  ^ ^ US;  a  [        SU 35      eSSKJn  [        UUUUUUUU=(       d    UR                  R
                  S:H  U	U
S9
m[        R                  " T 5      SU U4S jj5       nU$ )	a)  
Given a function f, return a new function which when executed with valid
arguments to f, returns an FX GraphModule representing the set of operations that
were executed during the course of execution.

If record_stack_traces is True, the stack trace will be preserved on node.meta["stack_trace"]
r  z-tracing_mode must be real/fake/symbolic, got r   r  rB   )rl  rt  r  c                 *   > TR                   " T/U Q76 $ ra   )rl  )r  r=  make_fx_tracers    rd   r  make_fx.<locals>.wrapped  s    ##A---rf   )r  rt  rY  r.   )r   r  r  r  rl  provenance_tracking_levelr;  r  )r=  r   r  r  r  r  r  r  rl  rt  r  r  r  r+  s   `            @rd   rN   rN   
  s    , 77;L>J
 	
 '"$/ 7<<11Q6/(GN __Q. . Nrf   c                 R    [         R                  R                  R                  5       $ ra   )r   r   _python_dispatch _get_current_dispatch_mode_stackrv   rf   rd   get_torch_dispatch_modesr1    s    ;;''HHJJrf   c                     [        5       $ ra   )rS   rv   rf   rd   rR   rR     s    rf   c                 J   [         R                  R                  [         R                  R                  R
                  5      n [         R                  R                  [         R                  R                  R
                  5      nU b  Ub  [        SU  SU 35      eU =(       d    U$ )z
Current the currently active proxy tracing mode, or None if
we are not currently tracing.  This includes pre-dispatch proxy
tracing.
zpre_dispatch_mode=z, mode=)r   r  _get_dispatch_mode_pre_dispatchr   r   r   r   r   )pre_dispatch_moder   s     rd   rS   rS     s     

BB&&,, 88&&uxx'E'E'K'KLD%12C1DGD6RSS$$rf   c                    [        5       nU(       d  [        S5      e[        5          / nUR                  XX5      sSSS5        $ ! , (       d  f       g= f)z
Call into the currently active proxy tracing mode to do a
SymInt/SymFloat/SymBool dispatch trace on a function that operates on
these arguments.
zExpected proxy mode to be setN)rS   r   r8  r  )r  r  r>  r   r  s        rd   rT   rT   &  sD     D<== 
%	&$$T$? 
'	&	&s   A
Ac                 \    [        [        R                  R                  R                  5      $ ra   )r8   r   r   r   r   rv   rf   rd   r8  r8  ;  s    uxx==CCDDrf   c                .  ^ SSK Jn  T[        ;   ai  UR                  SSU4S j5      (       a  [        $ U    U =R
                  S-  sl        [        T   " U0 UD6nU =R
                  S-  sl        UsS S S 5        $ [        $ ! , (       d  f       [        $ = f)Nr   )CompilerBisectoraot_eager_decomp_partitionr0  c                    > [        T 5      $ ra   )repr)r  s   rd   re   %maybe_handle_decomp.<locals>.<lambda>J  s	    48rf   rB   )!torch._inductor.compiler_bisectorr9  rZ   disable_subsystemr  r  )r1  r  r  r>  r9  r   s    `    rd   r  r  @  s     C	((--(/;K
 
 "!$$)$-b14B6BC$$)$	 Z  Z s   ;B
Bc                    [        XU5      u  pV[        5          [        XTUS9" U5      nSSS5        U$ ! , (       d  f       W$ = f)a  A helper function used to get the GraphModule for the given func.

It's expected to be used in the ProxyTensor tracing context.
It detaches the args and kwargs from the current tracer so that the trace of
the current graph module can be created without any side-effects.
)r   r  N)r>  r8  rN   )r  r  r>  r  r   r  all_argsr!  s           rd   get_isolated_graphmodulerB  W  sL     5THG	$	&<

 
' I	 
'	& Is	   4
Ac                r   SSK Jn  [        R                  R	                  [        R                  R
                  R                  5      nU(       ai  UR                  (       aW  U" UR                  U 5      =n(       a<  [        U[        5      (       d  [        SU 35      eXAR                  R                  S'   gggg)zOA helper function for setting up unbacked_bindings on the destination FX graph.rB   )compute_unbacked_bindingsr   unbacked_bindingsN)rg  rD  r   r   r   r   FAKEr  r   r/   r   r   r   )r   r  rD  r  symbol_to_paths        rd   ru  ru  m  s    : ++EHH,J,J,O,OPIY((6y7J7JCPP>Pi//$';I;%GHH7ENN 34 Q )yrf   )r{   r  r   r	  rY  r  )r   r  rY  z4Generator[Mapping[OpOverload, Callable], None, None])r   r   rY  r   r  )rY  r%  )r   r   r   r  r   r   rY  rZ  )r   z!_AnyScriptObjectType | OpaqueTyper   r  r   r/   rY  rZ  )r   r   r   r  r   r   rY  rZ  )r   z:Union[PySymType, _AnyScriptObjectType, Tensor, OpaqueType]r   r  r   rt  rY  rZ  )r   r   r   r  rY  r   )r   r   r   r  rY  r   )r   r   r   r  r   r\   rY  zUnion[_ProxyTensor, U])
r   r   r   r  r   r\   r   zCallable[[_ProxyTensor], R]rY  Union[R, U])r   rC  r   r  rY  r/   )r   rC  r   r  r   r\   rY  zUnion[Proxy, U])
r   rC  r   r  r   r\   r   zCallable[[Proxy], R]rY  rH  )r   r   r   r  rY  r   )r   r   r   r  r   r[   rY  zUnion[T, _PySymProxyType])r   r#   r   r  r   r[   rY  z Union[T, _OpaqueObjectProxyType])
r   r   r   r  r   r\   r   zCallable[[_PySymProxyType], R]rY  rH  )
r   z:Union[Tensor, _AnyScriptObjectType, PySymType, OpaqueType]r   r  r   rt  r   r   rY  rt  )r   ztorch.TensorrY  zlist[Proxy])rY  z*dict[type[sympy.Expr], Callable[..., Any]]ra   )r   r  r   z
sympy.Exprr   zPySymType | NonerY  z1IntLikeType | FloatLikeType | BoolLikeType | None)F)r   r   r  r   rY  rz  )r   r  r  r   rY  r  )r   r  r)  r   rY  r%  )r   r/   r   r  rY  r/   )
r   r  r=  r  r  rW  r>  rX  rY  zThunk[R])
r]  r   r   r/   r^  rz  r   r  rY  rZ  )
rv  r[   rw  ra  r^  rm  r   r  rY  r[   )r   r  rY  z5Callable[[PySymType], Union[bool, int, float, Proxy]])r   r  r   r   rY  zUnion[_ProxyTensor, Tensor])r   r  r   rC  rY  rD  )r   r  r   r   rY  z!Union[_PySymProxyType, PySymType])r   r  r   r#   rY  z(Union[_OpaqueObjectProxyType, PySymType])r   r  r   z6Tensor | _AnyScriptObjectType | PySymType | OpaqueTyperY  rt  )r  rt  r1  r   rY  rZ  )r  z'Union[list[object], tuple[object, ...]]r   r  rY  z-tuple[list[object], tuple[object, ...], bool])r1  r   r  rG   r  r   r  r  r>  r  rY  rt  )r<  r   rV  z:Optional[tuple[tuple[Argument, ...], dict[str, Argument]]]rY  r   )r^  ztype[TorchFunctionMode]rY  zCCallable[[], _GeneratorContextManager[Optional[TorchFunctionMode]]])r  r  r   r0   rq  zOptional[tuple[Any, ...]]rY  r.   )
r=  zCallable[[Unpack[_Ts]], R]r  ztuple[Unpack[_Ts]]r   r  r  r   rY  r  )r  z+OpOverload | torch._ops.HigherOrderOperatorrY  r%  )
r   r  r  rG   r  r  r   rt  rY  rZ  )
r   r  r  rG   r  r  r   r   rY  r/   )r1  r  r7  r   rY  r  )r  zCallable[..., R]r  r  r>  r  rY  z0tuple[Callable[[list[object]], R], list[object]])r   r  rY  r%  )Nr  F)r=  r   r   r  r  r7  r  r   r  r   r  r   r  r   r  r   rl  r   rt  r   r  r   rY  zCallable[..., GraphModule])rY  zlist[TorchDispatchMode])rY  z Optional[ProxyTorchDispatchMode])r  r  r  rW  r>  rX  rY  r^   )rY  z-Generator[ProxyTorchDispatchMode, None, None])
r1  r   r  rG   r  r  r>  r  rY  rt  )r  N)r  r   r  r  r>  r  r  r7  r   r  rY  r.   )r   rt  r  ra  rY  rZ  )
__future__r   r;  r  loggingr  	threadingr   r%  r  collectionsr   r   collections.abcr   r   r   r	   
contextlibr
   r   r   r   dataclassesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
torch._opstorch.fxrn  torch.fx.tracebackr  r  torch.utils._pytreer   _pytreerl   r   r   r   torch._dispatch.pythonr    "torch._library.fake_class_registryr!   torch._library.opaque_objectr"   r#   torch._loggingr$   r%   torch._subclasses.fake_implsr&   torch._subclasses.fake_tensorr'   r(   r)   r*   r+   #torch._subclasses.functional_tensorr,   torch._subclasses.meta_utilsr-   r.   r/   r0   torch.fx.graph_moduler1   torch.fx.noder2   r3   r4   torch.fx.passes.shape_propr5   torch.nnr6   r[  r7   torch.utils._python_dispatchr8   r9   r:   r;   r<   torch.utils._statsr=   torch.utils._thunkr>   torch.utils.weakr?   r@   rA   _backward_staterC   sym_noderD   r  rE   r   torch._higher_order_ops.utilsrF   rG   torch.fx._symbolic_tracerH   torch.typesrI   rJ   rK   __all__r  r  r   rC  rK  rL  r  	getLoggerr   r   _logginggetArtifactLoggerr  rZ   r   r  r[   r\   r]   r^   r_   r   null_ctx_typeregister_pytree_nodeSizerh   !_pytree_subclasses_that_lose_infor   r   rt  
proxy_slotr   
no_defaultrQ   r   r   r   localr   r   r   r   r   r   r   r   r   r   r   cacher  r   r  rb   r  r7  r	  r
  r   r  r  r-  rV   rU   r6  r?  r`  ra  rb  rx  r   r  r  r  r  r  r  r  r  r  r   rL   r9  ra  _disable_dynamorM   r  r  r  r  )_temp_remove_metadata_torch_function_moder  -_temp_remove_pre_dispatch_torch_function_moder   r  r  r   GraphAppendingTracerrW   InterpreterrO   r  rP   r>  rD  r|  rF  rH  rO  r  r&  r  rN   r1  rR   rS   rT   r8  r  rB  ru  rv   rf   rd   <module>r{     s   #         0 B B W W !
 
 
 D C %    ) ) $ $ ) ) ; ? D + * 4  A 6 / / . 
 @  -  % $ W W *  .E%/DD AB&&(89 U//1AAB yy~~yy~~!nn66xARS =? : ? CLCLt_CL5[!   	JJ &
" &+ZZ$7 !B 	>@	>9	> 	> X
	 	 \
 /x M)//  &A%B " EG ')A F4 )> )>X 
 W 
 W 
	*4@IN	 

 
	(1@	 

4	C44 4 
	4nD #5\ )$)%L 	 0 
	  
 
!	!! ! 	! 
! 
	  +	
  
 
	  
 
	  	 
 
	  $	
  
 
	  
 
$	$$ $ 	$ 
$ 
+	++ + &	+ 
+ 
	  .	
  
 !%	*	C** * 	*
 *b&    EIff *f1Af6fR 	  	
  "#$ 3!!"#  
	
 
    '(T ,0%%%)% % %$    0  , 5< HQ  GBGB GB/?GBIUGB	GBT 	8O$gfo.E&FF 
H%&8H0H(II
\\\ '	\
 \ \~   
:, 
&&#& & 
&
 
--1-'- 
-
 
,,&,&, 
,
 
33'3-3 
3
((=( ( ++Z8=
=4=	=@(K=(KGS(K2(KVG&G
G G 	G
 G GT' '>   
xf xz OS,,K, 
,^$$$H$N  04)N
!)N)N -)N 	)N )NX+!++ + 	+
 +^ #' & 
5   % 1 %$ -S- )<%#4 <%~ 1W 1 -
e. eP11 *12D1KQ1	1 *2DKT
D"bhh;; "4@0r~~ @0F9R^^ 9x;;
 ; ;6
"4>O5 4 4	) 	
 
m m`	g5 g5T 48 0 7 . . DH#(	/  %!&)- % %,1//@/ / !	/ / / / #'/ / / &*/  /dK%@
@
@ @ 	@* E E&  	
 6 CG

  	
 A ,Frf   