
    pis                   l   U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZ d dlmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$ d d	l	m%Z% d dl&Z&d dl'Z&d dl(m)Z) d dl*m)c m+Z, d dl-m.c m/Z0 d d
l&m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d dl(mCZCmDZDmEZE d dlFmGZG d dlHmIZImJZJmKZK d dlLmMZM d dlNmOZO d dlPmQZQ d dlRmSZSmTZTmUZUmVZV d dlWmXZX d dlYmZZZ d dl[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZb er d dlcZcd dlmdZd d dleZed dl'mfZf d d lgmhZh d d!limjZj g d"Zked#   Zle&j                  e7fZnee&j                  e7f   Zoe&j                  j                  Zqe&j                  j                  Zr ej                  et      Zue&j                  j                  etd$      Zxi ayd%ezd&<   dZ{ ed'      Z| ed(      Z} e!d)      Z~ ed*      Z e#d+      Z ee      Z e0j                  e&j                  d, d- d. d/0       e&j                  eiZdd1Ze	 	 	 	 dd2       Z e       Z G d3 d4      Z e       Zd d5limZmZ  G d6 d7e      Zdd8Zedd:       Ze	 	 	 	 	 	 	 	 dd;       Ze	 	 	 	 	 	 	 	 dd<       Z G d= d>ej$                        Z e       Zi ad?ezd@<   ddAZeddB       Z	 	 	 	 	 	 	 	 ddCZddDZeZeD   Ze	 	 	 	 	 	 ddE       Ze	 	 	 	 	 	 	 	 ddF       Ze	 	 	 	 	 	 	 	 	 	 ddG       Ze	 	 	 	 	 	 ddH       Ze	 	 	 	 	 	 	 	 ddI       Ze	 	 	 	 	 	 	 	 	 	 ddJ       Ze	 	 	 	 	 	 ddK       Ze	 	 	 	 	 	 	 	 ddL       Ze	 	 	 	 	 	 	 	 	 	 ddM       ZedN f	 	 	 	 	 	 	 	 	 ddOZdddQZeeeeoe`edR   edS   eedRf   e3eeef
      ZdddTZedUdV	 	 	 	 	 ddW       ZeddX       ZeddY       ZddZZ	 	 	 	 	 	 	 	 	 	 dd[Z	 	 	 	 	 	 	 	 	 	 dd\ZeeDed]   eed]f   f   Zee3ed^   eed^f   f   Z	 	 	 	 	 	 	 	 	 	 dd_Ze G d` d9             Z	 	 	 	 ddaZe	 	 	 	 	 	 ddb       Ze	 	 	 	 	 	 ddc       Ze	 	 	 	 	 	 ddd       Z	 	 	 	 	 	 ddeZe3e&j`                  jb                  e=fZ	 	 	 	 	 	 ddgZ	 	 	 	 	 	 ddhZ	 	 	 	 	 	 	 	 	 	 	 	 ddiZ G dj dk      Z G dl dmeE      Z	 d	 	 	 	 	 ddnZ	 	 	 	 ddoZe&jt                  	 d	 	 	 	 	 	 	 ddp       Z	 	 	 	 	 	 	 	 	 	 ddqZdadrezds<   eddt       Z G du dveQ      Z ee      Z G dw dxeQ      Z ee      Z G dy dfeV      Z G dz d{e)j                  j                        Z G d| d}e)j                        Z	 	 	 	 	 	 	 	 dd~Zedd       Z G d de˫      Z G d d      Z G d de      Z G d d      Zdadezd<   edd       Z	 	 	 ddPdPdPdUdPd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZ	 	 	 	 	 	 	 	 ddZedd       Z	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZy)    )annotationsN)defaultdictOrderedDict)	GeneratorMappingSequence)_GeneratorContextManagercontextmanager	ExitStacknullcontext)	dataclass)AnyCallableOptionaloverloadProtocolTYPE_CHECKINGTypeVarUnion)Concatenate	ParamSpecSelfTypeVarTupleUnpack)WeakKeyDictionary)SymBoolSymIntTensor)enable_python_dispatcher)FakeScriptObject)trace_structured)fast_detach)
FakeTensorFakeTensorModeis_fakeunset_fake_temporarily)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TorchDispatchMode)count)Thunk)_WeakHashRefWeakIdKeyDictionaryWeakTensorKeyDictionary   )BackwardState)SymNode)MutableMapping)
OpOverload)PHBase)IntLikeType)
PythonKeyTracerdispatch_tracemake_fxDecompositionInterpreterpy_sym_typesget_innermost_proxy_modeget_proxy_modehandle_sym_dispatchmaybe_enable_thunkifymaybe_disable_thunkify)rB   _GraphAppendingTracerExnot_implementedzMapping[OpOverload, Callable]CURRENT_DECOMPOSITION_TABLETU_PR_Tsc                    t        |       d fS N)list)xss    d/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/torch/fx/experimental/proxy_tensor.py<lambda>rY   }   s    R$     c                    t        |       S rU   )tuple)rW   _s     rX   rY   rY   ~   s
    %) rZ   c                x    t        |       D cg c]  \  }}t        j                  |      |f c}}d fS c c}}w rU   )	enumeratepytreeSequenceKey)rW   ixs      rX   rY   rY      s5    09">1&

Q
	#>% >s   !6z
torch.Size)flatten_with_keys_fnserialized_type_namec                n    dj                  d t        |      D              }t        d| d| dd| i      S )z*FX gets confused by varargs, de-confuse it,c              3  &   K   | ]	  }d |   yw)argN ).0rb   s     rX   	<genexpr>z!fake_signature.<locals>.<genexpr>   s     8a#aS	8s   zlambda z: fn()fn)joinrangeeval)rn   nargsargnamess      rX   fake_signaturert      s:    xx85<88H'(5
!4tRjAArZ   c              #  H   K   t         }| xs i a 	 t          |a y # |a w xY wwrU   )rN   )decomposition_tableold_decomposition_tables     rX   	decomposerx      s1     
 :"5";>))&=#&=#s   " ""c                      e Zd Zy)
_NoDefaultN__name__
__module____qualname__rj   rZ   rX   rz   rz          rZ   rz   )rF   	PySymTypec                      e Zd ZU ded<   y)_HasMetazdict[str, PySymType]metaNr|   r}   r~   __annotations__rj   rZ   rX   r   r      s    
rZ   r   c                    t        | d      sJ d       d| j                  v xr t        | j                  d   t              S )Nr   z3All nodes traced with proxy_tensor should have metaval)hasattrr   
isinstancerF   )nodes    rX   is_sym_noder      s<    4 W"WW DIIL*TYYu-=|"LLrZ   _ProxyTensorc                     y rU   rj   objtracerproxys      rX   set_proxy_slotr      s    TWrZ   c                     y rU   rj   r   s      rX   r   r           rZ   c                     y rU   rj   r   s      rX   r   r      r   rZ   c                      e Zd ZU dZded<   y)_DisableUpdateTensorTrackerFboolvalueN)r|   r}   r~   r   r   rj   rZ   rX   r   r      s    E4rZ   r   zdict[int, torch.fx.Node]'_FAKE_TENSOR_ID_TO_PROXY_MAP_FOR_EXPORTc                 "    t         j                  S )zC
    Returns current state of disabling update tensor tracker.
    "_disable_update_tensor_tracker_tlsr   rj   rZ   rX   /_is_proxy_tensor_update_tensor_tracker_disabledr      s     .333rZ   c               #     K   t         j                  } dt         _        	 d | t         _        y# | t         _        w xY ww)a  
    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    rX   +_proxy_tensor_disable_update_tensor_trackerr      s7     J 499J/3&,>3=*0:*0s   ?/ ?<?c                t   t         j                  d| t        |       |       t        | t              r-t        |t
              sJ t               s||j                  | <   y y t        | t              r"t        |t              sJ ||j                  | <   y t        | t              sJ t        |              | |j                  vrzt        j                  t         |      |j                  | <   dd l}t        | j$                  j&                  |j(                        r$||j*                  | j$                  j&                  <   y y y )Nzset_proxy_slot %s (%s) %sr   )logdebugidr   r   r   r   tensor_tracker_AnyScriptObjectr)   script_object_trackerrF   typesymnode_trackertypingcast_PySymProxyTypesympyr   exprSymbolsympy_expr_tracker)r   r   r   r   s       rX   r   r     s    
 II)33?#v %...>@).F!!#& A	C*	,%''',1$$S) #|,7d3i7,f,,,*0++ou*MF""3' #((--6;@))#((--8 7# -rZ   c                ~    t        | t        t        f      sJ t        |              t	        t        | |dd             S )NFc                     yNTrj   )r]   s    rX   rY   z has_proxy_slot.<locals>.<lambda>5      rZ   )r   r   r=   r   r   get_proxy_slotr   r   s     rX   has_proxy_slotr   3  s6    cFG,-8tCy8-sFE>BCCrZ   c                     y rU   rj   r   s     rX   r   r   ;  s     rZ   c                     y rU   rj   r   r   defaults      rX   r   r   B  s    
 !rZ   c                     y rU   rj   r   r   r   	transforms       rX   r   r   J       rZ   c                     y rU   rj   r   s     rX   r   r   S  s     rZ   c                     y rU   rj   r   s      rX   r   r   Z  s    
 rZ   c                     y rU   rj   r   s       rX   r   r   b  r   rZ   c                     y rU   rj   r   s     rX   r   r   k  s     rZ   c                     y rU   rj   r   s      rX   r   r   r  s    
 !$rZ   c                     y rU   rj   r   s       rX   r   r   z  r   rZ   c                    | S rU   rj   rc   s    rX   rY   rY     s    A rZ   c                   t        | t              r|j                  }nIt        | t              r|j                  }n,t        | t
              sJ t        |              |j                  }| |vrt        | t
              rF| j                  j                  |j                  v r$|j                  | j                  j                     }n3t        |t              rt        |  dt        |        d|       |S ||    } ||      }|S )Nz (z)is not tracked with proxy for )r   r   r   r   r   rF   r   r   r   r   r   rz   RuntimeErrorr   )r   r   r   r   trackerr   ress          rX   r   r     s     #v''	C)	*..#|,7d3i7,((
'c<(SXX]]f>W>W-W--chhmm<E':."e2bgY&EfXN  N
E
CJrZ   Fc                p    t        | t              rt        | j                  | |      S | j	                         S rU   )r   r#   r"   	fake_modedetach)r   include_reals     rX   snapshot_faker     s-     #z"3==#|<<zz|rZ   _ExtractValType)r   .c                B   t        |       rt        | |      S t        | t              r| S t        | t              r| S t        | t
              r| S t        | t        t        f      r(| j                  | D cg c]  }t        |       c}      S t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t              rz| j                  smddlm}  ||       }|st!        d      }|5  t#        j$                  | j&                  | j)                         | j*                  | j,                        cd d d        S y t        | t.        t0        t2        f      r| S | y t5        j6                  |        y c c}w c c}}w # 1 sw Y   *xY w)Nr   r   )detect_fake_modeT)allow_fallback_kernels)devicedtype)r%   r   r   rF   r   r<   rV   r\   	__class__extract_valdictitemsr   	is_sparsetorch._guardsr   r$   torchempty_stridedshapestrider   r   intfloatr   typing_extensionsassert_never)r   r   rc   kvr   fake_tensor_modes          rX   r   r     sL   s|S|<<	C	&
	C)	*
	C	'
	C$	'}}c:k!n:;;	C	.1iik:da;q>!::	C	 }} 7/4##1#N ! **IIszz|CJJcii 
 	C#ud+	,
	""3'7 ;: s   4F
0FAFFTenablec             #  b   K   | j                   }|| _         	 d || _         y# || _         w xY ww)a{  
    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      rX   _enable_thunkifyr     s3      
 
 C#F%!$s   /# /	,/c               #     K   t               } | %t        | j                  d      5  d ddd       yd y# 1 sw Y   yxY ww)a[  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   rH   r   r   
proxy_modes    rX   rK   rK     sG       !Jj//> 		 	 		 	s   $A9AAAc               #     K   t               } | #t        | j                        5  d ddd       yd y# 1 sw Y   yxY ww)a3  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   r   s    rX   rJ   rJ   
  sE       !Jj//0 		 	 		 	s   "A7AA Ac                   t        || j                  j                  dk(        | j                  j                  d<   t	        | j
                        5  t        |      r#t        |      | j                  j                  d<   n>t        |t              r.|j                  s"t        |      | j                  j                  d<   d d d        | S # 1 sw Y   | S xY w)Nplaceholderr   r   tensor_meta)r   r   opr   r   r   r%   r/   r   r   r   )r   r   s     rX   set_metar   #  s    (5::==M9EJJOOE 
%,,	' K3<-Ec-JEJJOOM*V$S]]-Ec-JEJJOOM*K LK Ls   A-CCc                    | j                   r"t        t        j                  |g|i |      S  ||i |t        fd      S )zT
    Delays computation of f until it's called again
    Also caches the result
    c                      S rU   rj   )rs   rX   rY   zthunkify.<locals>.<lambda><  s    Q rZ   )r   r7   	functoolspartial)r   fargskwargsr   s       @rX   thunkifyr  1  sH     Y&&q:4:6:;;tvYrZ   c                  	 	 	 	 	 	 	 	 	 	 dfd}t        | j                        D ]  \  }} ||fd|        t        |       s/t        | j                               D ]  \  }} ||fd|         || j	                         fd       t        |       s || j                         fd       t        | t        |             y )Nc           
         t        |      sJ t        | t              r1t              5  t	        | t        || g|i |       d d d        y y # 1 sw Y   y xY wrU   )callabler   r   r   r   r  )outer_sproxy_callabler   r  r   s       rX   try_set_proxy_slotz(track_tensor.<locals>.try_set_proxy_slotB  sh     '''gv&!&) V^WNtNvN  ' s   AAc                    t        j                  dt        j                  j                  j
                  j                  |fi       |       S Ncall_function)r   create_proxyr   opsatensym_sizer   rc   rb   r   r   s     rX   rY   ztrack_tensor.<locals>.<lambda>Y  s@    ###UYY^^%<%<%@%@5!*b 	 rZ   c                    t        j                  dt        j                  j                  j
                  j                  |fi       |       S r
  )r   r  r   r  r  
sym_strider   r  s     rX   rY   ztrack_tensor.<locals>.<lambda>f  sB    X''')B)B)F)FPQ
TV 	 rZ   c                    t        j                  dt        j                  j                  j
                  j                  fi       |       S r
  )r   r  r   r  r  	sym_numelr   rc   r   r   s    rX   rY   ztrack_tensor.<locals>.<lambda>q  s>    (!9!9!A!AE8R 	
 rZ   c                    t        j                  dt        j                  j                  j
                  j                  fi       |       S r
  )r   r  r   r  r  sym_storage_offsetr   r  s    rX   rY   ztrack_tensor.<locals>.<lambda>{  sA    h###IINN55==H	  rZ   )
r  rA   r  z+Callable[Concatenate[PySymType, _P], Proxy]r   _P.argsr  	_P.kwargsreturnNone)r_   r   r'   r   numelstorage_offsetr   r   )tensorr   constantr   r  rb   ss    ` `   rX   track_tensorr!  ?  s    C  	
 
( &,,' 

1 		


  fmmo. 
	DAq 	
	 	
  !!#	
 66<x#@ArZ   _NestedProxys_NestedTensorsc               T    t        | |       	 	 	 	 	 	 	 	 dfd | ||       | S )Nc           	        t        | t              rBt        t              sJ |t        |t              sJ t        | |       t	        |        y t        | t
              r9t        t              sJ t	        |        t        | t        fd             y t        | t              r,t        t              sJ t        |        t	        |        y t        | t        t        f      rXt        t        j                        rt	        |        	 	 	 	 	 	 dd}t        |       D ]  \  }} 	||    |||              y t        | t              rP|J t        t        j                        rt	        |        | j                         D ]  \  }} 	||   d         y t        | t              r&t        t              sJ t	        |        | _        y y )N)r   r  c                      S rU   rj   r   s   rX   rY   z<track_tensor_tree.<locals>.wrap_with_proxy.<locals>.<lambda>  s    u rZ   c                B    | y t        | t        t        f      sJ | |   S rU   )r   rV   r\   )cidxs     rX   get_constantz@track_tensor_tree.<locals>.wrap_with_proxy.<locals>.get_constant  s)     9%a$777S6MrZ   )r)  Optional[_NestedTensors]r*  r   r  r,  )r   r   r)   r!  r   rF   r   r  r   r\   rV   fxr_   r   r   r<   r   )
er   r  r+  r*  eekeyr   r   wrap_with_proxys
    `      rX   r1  z*track_tensor_tree.<locals>.wrap_with_proxy  s    a eU+++#z(F'CCCE&8DUA<(eU+++UA1fhv}&EF+,eU+++1fe,UAE4=)%*""+"25")" %Q< MR  E#JXs0KLM
 4  ###%*"GGI 7SU3Z67 =)eU+++UAAG rZ   )r.  objectr   r"  r  r,  r  r  )_set_unbacked_bindings)	inner_res	proxy_resr  r   r1  s      `@rX   track_tensor_treer6    sI    ( 9i0::':3K:	:x Iy(3rZ   c                  "    e Zd ZU ded<   ded<   y)r   r)   r   Optional[Tensor]r  Nr   rj   rZ   rX   r   r     s    LrZ   c                     d fd}|S )Nc                   | j                   }|j                  |j                  S | j                   j                  j                  r}t	        | t
              rt        | j                   j                        S t	        | t              rt        | j                   j                        S t        | j                   j                        S t	        | t              sJ t        |       j                         S rU   )r   r  r   	is_numberr   r   r   r   r   r   rF   r   force)r.  nr   s     rX   innerzfetch_sym_proxy.<locals>.inner  s    FF::!::66;;  !W%AFFKK((Av&166;;''%%a...!!V,2244rZ   )r.  r   r  zUnion[int, bool, float, Proxy]rj   )r   r>  s   ` rX   fetch_sym_proxyr?    s    5 LrZ   c                     y rU   rj   r   ts     rX   fetch_object_proxyrC    s     #&rZ   c                     y rU   rj   rA  s     rX   rC  rC    s     *-rZ   c                     y rU   rj   rA  s     rX   rC  rC    s     ),rZ   c                    t        || |      S rU   r   rA  s     rX   rC  rC    s     !VQ''rZ   ProxyTorchDispatchModec                $   |j                   s|j                  syt        | t        j                  j
                        r&t        j                  j                  | j                  vryt        t        t        |j                  j                  j                                    }|j                  j!                  d      }t        |t        j"                        r,|j$                  t        j&                  t        j(                  fvryd|j                  d<   y)zd
    Records pointwise operators in user program (non decomposed) that were output in fp16/bf16
    Nr   Tlow_precision_pointwise_barrier)decomp_layersemulate_precision_castsr   r   _opsr?   Tag	pointwisetagsnextiterreversedr   graphnodesr   getr   r   bfloat16float16)funcr   	last_noderB  s       rX   _maybe_record_pointwise_barrierr[    s     z'I'I tUZZ22399dii/T(:#4#4#:#:#@#@ABCI5!Aa&!'': + 	8<INN45rZ   c                   | D cg c]&  }t        |t        t        f      rt        ||      n|( }}t	        d |D               xr t	        d | D               }|D cg c]   }t        |t
              r|j                  n|" }}|D cg c]%  }t        |t              r t        |      |      n|' }}|t        |      |fS c c}w c c}w c c}w )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  X   K   | ]"  }t        |t              r|j                  d u  $ y wrU   r   r   r  rk   rB  s     rX   rl   z7_fetch_proxies_and_all_constant_flag.<locals>.<genexpr>L  s+      
!\* JJ$
   (*c              3  <   K   | ]  }t        |t                y wrU   )r   rF   )rk   rc   s     rX   rl   z7_fetch_proxies_and_all_constant_flag.<locals>.<genexpr>S  s     JAJq,/Js   )
r   r   r   rC  anyr   r   rF   r?  r\   )flat_args_kwargsr   rc   f_flat_args_kwargsall_constantr.  proxy_flat_args_kwargss          rX   $_fetch_proxies_and_all_constant_flagrg  7  s    "  !f&678 vq)   
'
 
 	
 	K J9IJJJ  @R:;:a.A5  ( (2!\'B	 	 	#	I 
 u%;<lJJA.s   +C%C	*Cc           	     
    g t        j                  ||f      \  }}d fdt        fd|D              st        j	                  d       t
        S t         |||      }|t
        urt        |        |S |s|t        j                  j                  j                  j                  t        j                  j                  j                  j                  t        j                  j                  j                  j                  fvr1 5   |j                  |i |}|t
        ur|cd d d        S 	 d d d        |t        j                  j                  j                   j                  u rM 5  t        j"                  |d   j%                         dk(  d        |d   dk7  j'                         cd d d        S  j(                  }t+        ||      \  }	}
}t        j,                  j.                  |j0                  v r|r`|	D cg c]   }t3        |t4              r|j6                  n|" }}t        j8                  ||      \  }}t;               5   ||i |cd d d        S  j<                  r-t        j>                  t@        d ||f      rtC        d| d	      t        j8                  |
|      \  }}|t        j                  j                  jD                  j                  u r.t        j                  j                  jF                  j                  } j(                  jI                  d
||| j(                  jJ                  jM                  |jN                  jP                              }tS         j(                        5   ||i |}d d d        tU        d |	D              }d }dd}|t        j                  j                  jF                  j                  u rjj%                         tV        k  rSt;               5  t3        |d   tX        t@        f      sJ t[        |d                |d   j]                         }d d d        nt        j,                  j^                  |j0                  vr|r}|r{t        j>                  t@        |      r`t;               5  |	D cg c]   }t3        |t4              r|j6                  n|" }}t        j8                  ||      \  }} ||i |}d d d        nd }ta        |||       t        |        |S # 1 sw Y   xY w# 1 sw Y   ^xY wc c}w # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   _xY wc c}w # 1 sw Y   pxY w)Nc                    t        |       t        v xs t        | j                        }j                  r*|xs& t        |       t
        j                  j                  fv }|sj                  t        |              |S rU   )	r   HANDLED_TYPESr   r   _allow_fake_constantr   _subclassesr#   append)rc   r   r   unrecognized_typess     rX   can_handle_tensorz%proxy_call.<locals>.can_handle_tensorl  sh    G}$Lq*:K:K(L**?T!W!2!2!=!= ??A%%d1g.rZ   c              3  P   K   | ]  }t        |t              s |        y wrU   )r   r   )rk   rc   ro  s     rX   rl   zproxy_call.<locals>.<genexpr>v  s      WAvAV #Ws   &&zEProxyTensorMode tensors without proxy had unrecognized subclasses: %sr   r;   c                      y)Nz=Boolean value of Tensor with more than one value is ambiguousrj   rj   rZ   rX   rY   zproxy_call.<locals>.<lambda>  r   rZ   c                    t        |        S rU   )r%   rB  s    rX   rY   zproxy_call.<locals>.<lambda>  s    '!*n rZ   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.r  )namec              3  X   K   | ]"  }t        |t              r|j                  d u $ y wrU   r^  r_  s     rX   rl   zproxy_call.<locals>.<genexpr>  s+      a& 	


$r`  c                0    | j                         t        k  S rU   )r  CONSTANT_NUMEL_LIMITrs  s    rX   tensor_numel_in_limitz)proxy_call.<locals>.tensor_numel_in_limit  s    wwy000rZ   r  r   )rc   r   r  r   )rB  r   r  r   )1r`   tree_flattenallnot_implemented_logr   NotImplementedmaybe_handle_decompr[  r   r  r  sizer   r   r  rx   
is_nonzero_checkr  itemr   rg  rN  data_dependent_outputrP  r   r   r  tree_unflattenr&   _error_on_data_dependent_opstree_all_onlyr   r   
lift_freshlift_fresh_copyr  rT  _target_to_stroverloadpacketr|   r   rb  rw  r)   r   clonenondeterministic_seededr6  )r   rY  pre_dispatchr   r  rc  specr   r   rd  rf  re  rB  const_flat_args_kwargs
const_argsconst_kwargs
proxy_argsproxy_kwargs	proxy_outoutany_constantr  rx  ro  rn  s   `                      @@rX   
proxy_callr  b  s    &(#00$@d W-=WW!!S	
 JdF;A'j9 D		##		%%		%%--) 
  	//A&	 	&	
 uyy~~((000 	)LLQ1$W GqL&&(	) 	) F,-=vF =. yy&&$))3 ,& )L9

q@&" & (.'<'<&($J () 9Z8<89 9
 22v7K7K,tVn8
 Z[_Z` a( (   &445KT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Fd1gF7Aw}}H	' 	' 			)):  )>D $% 	9 ,& )L9

q@&" & (.'<'<&($J Z8<8H	9 	9 c9xG#D*5Jw	 		) 	)&9 9z$ $T	' 	'&	9 	9sb   
S=+AT
>%TT6	T)0A T6U%U2#U=T
TT&)T36T?UUc                  V    e Zd ZdZd
dZddZddZddZ	 d	 	 	 	 	 ddZddZ	dd	Z
y)_SymNodeDictzM
    Wrapper around a dictionary that will hash SymInts with their nodes
    c                    i | _         y rU   )sym_node_dictselfs    rX   __init__z_SymNodeDict.__init__+  s
    ?ArZ   c                6    || j                   |j                  <   y rU   r  r   )r  r0  r   s      rX   __setitem__z_SymNodeDict.__setitem__.  s    ',388$rZ   c                4    | j                   |j                     S rU   r  r  r0  s     rX   __getitem__z_SymNodeDict.__getitem__1  s    !!#((++rZ   c                2    |j                   | j                  v S rU   )r   r  r  s     rX   __contains__z_SymNodeDict.__contains__4  s    xx4----rZ   Nc                N    | j                   j                  |j                  |      S rU   )r  rV  r   )r  r0  r   s      rX   rV  z_SymNodeDict.get7  s!    
 !!%%chh88rZ   c                    t         rU   )NotImplementedErrorr  s    rX   __iter__z_SymNodeDict.__iter__>  s    !!rZ   c                ,    t        | j                        S rU   )lenr  r  s    rX   __len__z_SymNodeDict.__len__A  s    4%%&&rZ   r  r  )r0  r   r   r   r  r  )r0  r   r  r   )r0  r   r  r   rU   )r0  r   r   zOptional[_PySymProxyType]r  r   )r  r   )r  r   )r|   r}   r~   __doc__r  r  r  r  rV  r  r  rj   rZ   rX   r  r  &  sJ    B-,. DH99'@9	9"'rZ   r  c                      e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   dZded<   d fdZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZd fdZe	dd       Z
e	dd       Z
e		 	 	 	 dd       Z
ddZ
	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d  fdZ xZS )!rB   +MutableMapping[_AnyScriptObjectType, Proxy]r   r  r   dict[sympy.Symbol, object]r   $MutableMapping[Tensor, _ProxyTensor]r   dict[OpOverload, int]torch_fn_countsFr   r   c                    t         |   d       t               | _        t	               | _        t        d t              | _        t               | _
        d | _        i | _        d| _        y )Nrj   )autowrap_modulesr   ref_typeF)superr  r:   r   r  r   r9   r8   r   r   r   torch_fn_metadatar  r   )r  r   s    rX   r  zPythonKeyTracer.__init__M  sb    "-57+~%8&
" #'& "&  "$rZ   c                     ||i |S rU   rj   )r  mforwardr   r  s        rX   call_modulezPythonKeyTracer.call_module`  s     '''rZ   c                    |S rU   rj   )r  attrattr_valparameter_proxy_caches       rX   getattrzPythonKeyTracer.getattrj  s	     rZ   c                   t        |t        j                  j                        rx| j                  j                         D ]  \  }}||u s| j                  d|di       c S  | j                  d      }t        | j                  ||       | j                  d|di       S t        |t              r.|j                  j                  J |j                  j                  S t        | 5  |      S )Nget_attrrj   _param_constant)r   r   nn	Parameterrootnamed_parameterscreate_nodeget_fresh_qualnamesetattrrF   r   r  r  
create_arg)r  ar=  pqualnamer   s        rX   r  zPythonKeyTracer.create_argo  s    a++,		224 C16++J2rBBC ../@AHDIIx+##J"bAA<(66??...66??"w!!$$rZ   c                     y rU   rj   r  r.  s     rX   unwrap_proxyzPythonKeyTracer.unwrap_proxy~  s    ?BrZ   c                     y rU   rj   r  s     rX   r  zPythonKeyTracer.unwrap_proxy  s    EHrZ   c                     y rU   rj   r  s     rX   r  zPythonKeyTracer.unwrap_proxy  s     .1rZ   c                    t        |t              rt        || |d       S t        |t              rt        || |d       S t        |t              rt        || |      S |S )Nc                    | j                   S rU   r'  r   s    rX   rY   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>  s
     rZ   c                "    | j                         S rU   )r<  )r.  s    rX   rY   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>  s    	 rZ   )r   r   r   rF   r   r  s     rX   r  zPythonKeyTracer.unwrap_proxy  sY    a !!T1.?@@<(!!T1.ABB+,!!T1--HrZ   c                "   t         |   ||||||      }|j                  dv rd|j                  v r|j                  d= |dk(  rmt	        |t
              sJ t        | j                  |      }t	        |t        j                        r+t               5  t        |      |j                  d<   d d d        dd}	t        |||f      r@t        j                  j                  j                  ||f|	      \  }
}|
|f|j                  d<   |S # 1 sw Y   ]xY w)Nr   outputstack_tracer  r   c                   t        | t        j                  j                        rd| j                  vry | j                  d   }t        |t        j
                        rt        |t              sy t        | j                  d         S )Nr   )r   r   r-  Noder   r   r#   r   )r   r   s     rX   map_fnz+PythonKeyTracer.create_node.<locals>.map_fn  s^    a/53F&&-C #u||,ZZ5Pqvve}--rZ   eager_input_vals)r   r   r  zOptional[_ExtractValType])r  r  r   r   r   strr  r  r   r   disable_proxy_modes_tracingr   _should_save_eager_input_valsr-  r   map_aggregate)r  kindtargetr   r  rt  	type_exprr   r  r  arg_inp	kwarg_inpr   s               rX   r  zPythonKeyTracer.create_node  s     w"4vtYO77//MTYY4N		-(:fc***499f-D$-02 9'24'8DIIe$9	. )$@ "'!<!<dF^V!TGY-4i,@DII()-9 9s   DDr  )
r  r0   r  zCallable[..., Any]r   ztuple[Any, ...]r  zdict[str, Any]r  r   r  r  r  r2  r  zdict[str, Proxy]r  r2  )r  r2  r  fx.node.Node)r.  r   r  zUnion[Proxy, Tensor])r.  r   r  zUnion[Proxy, PySymType])r.  _AnyScriptObjectTyper  "Union[Proxy, _AnyScriptObjectType])r.  rO   r  r2  )NN)r  r  r  r.   r   ztuple[Argument, ...]r  zdict[str, Argument]rt  zOptional[str]r  zOptional[Any]r  ztorch.fx.Node)r|   r}   r~   r   r   r  r  r  r  r   r  r  __classcell__r   s   @rX   rB   rB   E  s*   FF!!2288**!OT!%&(( $( 	(
 ( 
(#)BR	
% B BH H1%1	+1 1  ##'(( ( #	(
 $( ( !( 
( (rZ   rB   c                   ddl m} t        |       syt        | t        j
                  j                  j                  t        j
                  j                  j                  |f      ry|| t        j                  j                  j                  u s&| t        j                  j                  j                  u rW|d   }t        |d   t        j                  j                  t        j                  j                  f      sJ t!        |d   d       S | t        j                  j                  j"                  u ryt        | t        j                  j                        r)t%        j&                  t         |      rt)        d|  d      t        | t        j                  j                        r3ddlm}  ||       t        j.                  j0                  j2                  k(  S y)Nr   )InvokeSubgraphHOPFTz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_subgraphr  r  r   r   _higher_order_opstriton_kernel_wrapTritonKernelWrapperFunctionalTritonKernelWrapperMutationr  higher_orderauto_functionalizedauto_functionalized_v2rM  r?   HigherOrderOperatorr  with_effectsr`   tree_anyr   torch._library.utilsr  _CrN  needs_exact_strides)r  args_kwargsr  r   r  s        rX   r  r    su    JF##66TT##66RR	
 %))((<<<UYY++BBB1~Gejj++UZZ-K-KL
 	
 
 -T!Wd;;''444 &%**889??8+Fx (G H 
 &%**//0B(0EHHLL4T4TTTrZ   c                &     t         d fd       }|S )Nc               3    K   ddl m} m}m} g }d } |        dkD  r2 |       }t	        |      r|}n|j                  |        |        dkD  r2t        |      D ]
  } ||        	 | |Lt        |      }|dkD  r |       }|dz  }|dkD  r|j                  |       t        |      D ]
  } ||        y y # |Lt        |      }|dkD  r |       }|dz  }|dkD  r|j                  |       t        |      D ]
  } ||        w w xY ww)Nr   )_len_torch_function_stack	_pop_moder3   r;   )torch.overridesr  r  r3   r   rm  rS  r  )r  r  r3   temp_elementsremoved_modemoder6   mode_tys          rX   context_manager_fnzB_make_temp_remove_mode_context_manager.<locals>.context_manager_fn  sC    TT')A-;D$(#$$T* ()A- ]+ 	Dt		% 'M*ai$;DQJE ai $$\2$]3 %Dt$% (|'M*ai$;DQJE ai $$\2$]3 %Dt$% (s0   A
DD'B: +#D+D:$D
+D

D)r  z2Generator[Optional[TorchFunctionMode], None, None])r
   )r  r  s   ` rX   &_make_temp_remove_mode_context_managerr    s      % %@ rZ   c                &   |j                  | |      }dd}|j                  |       ddlm}  ||       t	        | t
              r| j                  j                  n| j                  }t        j                  j                  |j                  ||      S )Nc                    ddl m} | j                         ry ||       ryt        | j                  j                  d      t              rt        d | j                  D              ryy)Nr;   )is_accessor_nodeTFr   c              3     K   | ]G  }t        |t        j                        r+t        |j                  j	                  d       t
               I yw)r   N)r   r-  r  r   rV  rF   )rk   r  s     rX   rl   z6dispatch_trace.<locals>.impure_pred.<locals>.<genexpr>+  s:      a) 166::e,l;s   AA)	symbolic_shapesr  	is_impurer   r   rV  rF   r{  r   )r=  r  s     rX   impure_predz#dispatch_trace.<locals>.impure_pred  s^    5 ;;= A
 qvvzz%(,7     rZ   r   )dedupe_symints)r=  zfx.Noder  r   )traceeliminate_dead_code,torch._inductor.fx_passes.dedupe_symint_usesr  r   r0   r   r|   r-  _lazy_graph_module_make_graph_moduler  )r  r   concrete_argsrT  r  r  rt  s          rX   rC   rC     sq     LL}-E8 
k*K5&0v&>4>>""DMMD  33FKKMMrZ   c                     t        j                        \  }t        j                         d fd       }|S )Nc                    t        j                  |       \  }}t        |      t        	      k(  sJ t               5 }t	        |t
              sJ t        	|d        d d d        dfd} 
 }t        j                  t        ||      }t        j                  t        fd|      }dfd}t        j                  t        ||      }|S # 1 sw Y   pxY w)Nry  c                "    t        | | d       S )Nc                    | j                   S rU   r'  r   s    rX   rY   zJwrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot.<locals>.<lambda>O  s
    !'' rZ   rG  rB  r   s    rX   get_tensor_proxy_slotz8wrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slotN  s    !!VQ0ABBrZ   c                "    t        | | d       S )Nc                    | S rU   rj   r   s    rX   rY   z=wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>T  s    q rZ   rG  r!  s    rX   rY   z+wrap_key.<locals>.wrapped.<locals>.<lambda>T  s    q&![(Q rZ   c                8    t        |       j                         S rU   )r   r<  r!  s    rX   get_sym_proxy_slotz5wrap_key.<locals>.wrapped.<locals>.get_sym_proxy_slotW  s    !!V,2244rZ   )rB  r   r  zUnion[Tensor, Proxy])rB  r   r  r)   )r`   rz  r  r  r   rH  r6  tree_map_onlyr   r   rF   )proxies_unusedflat_proxies_proxies_specr  r"  r  r&  r   flat_tensorstensorsr   s           rX   wrappedzwrap_key.<locals>.wrappedF  s    &,&9&9'&B#m< C$5555(* 	Xaa!7888lL4PVW	X	C k""6+@#F""QSV
	5 ""<1CSI
#	X 	Xs   "CC)r(  r  r)  r  r  rR   )r`   rz  r   wraps)r   r-  r   r  _tensors_specr.  r,  s   ```   @rX   wrap_keyr1  >  s<     #)"5"5g">L-__Q , NrZ   zOptional[object]ORIGINAL_ATENc              #     K   t         Dt        j                         r0| a | t        j                  d<   	 d  d a d t        j                  d<   y d  y # d a d t        j                  d<   w xY ww)Noriginal_aten)r2  fx_tracebackhas_preserved_node_metacurrent_meta)rY  s    rX   set_original_aten_opr8  d  sf      !E!E!G59!!/2	> M9=L%%o6 !M9=L%%o6s   0A,A A,A))A,c                  4    e Zd ZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)TorchFunctionMetadataModec                    || _         y rU   )r   r  r   s     rX   r  z"TorchFunctionMetadataMode.__init__t  s	    rZ   Nc                    |xs i }|| j                   _        | j                   j                  j                  |d      dz   | j                   j                  |<    ||i |S )Nr   r;   )r   r  r  rV  r  rY  typesr   r  s        rX   __torch_function__z,TorchFunctionMetadataMode.__torch_function__w  s[     2(,%,0KK,G,G,K,KDRS,TWX,X##D)T$V$$rZ   r   _ProxyTracerr  r  rj   N
rY  r?   r?   tuple[torch._C._TensorMeta, ...]r   tuple[object, ...]r  Optional[dict[str, object]]r  r2  r|   r}   r~   r  r@  rj   rZ   rX   r:  r:  s  sD     $&.2
%
% 0
% !	
%
 ,
% 

%rZ   r:  c                  4    e Zd ZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)PreDispatchTorchFunctionModec                     || _         g | _        y rU   )r   enter_autocast_nodesr<  s     rX   r  z%PreDispatchTorchFunctionMode.__init__  s     :<!rZ   Nc                   |xs i }|t         v r<|t        j                  j                  j                  k(  r| j
                  j                         }|f}| j                  j                  d||i       }|t        j                  j                  j                  k(  r| j
                  j                  |       |t        j                  j                  t        j                  j                  j                  t        j                  j                  j                  fv rd |j                  d<   |t        j                  j                  u r ||i | |S |t        j                  j                  j                   t        j                  j                  j"                  t        j                  j                  j$                  t        j                  j                  j&                  t        j                  j(                  j*                  fv r[t-        || j                        \  }}}| j                  j/                  d||i       }	 ||i |}
t1        |
|	d | j                         |
S  ||i |S )Nr  r   ry  )r,   r   ampautocast_mode_exit_autocastrL  popr   r  _enter_autocastrm  r  _set_grad_enabledr   
_functorchpredispatch_add_batch_dim_remove_batch_dim_vmap_increment_nesting_vmap_decrement_nestingvmaplazy_load_decompositionsrg  r  r6  )r  rY  r?  r   r  
enter_noder   r]   r(  	out_proxyr   s              rX   r@  z/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t{{SMAw00	I ''Cc9tDKKPJT$V$$rZ   rA  rC  )
rY  zUnion[OpOverload, Callable]r?  rE  r   rF  r  rG  r  r2  rH  rj   rZ   rX   rJ  rJ    sD    < $&.23%)3% 03% !	3%
 ,3% 
3%rZ   rJ  c                       e Zd Zed	d       Z	 	 	 d
	 	 	 	 	 	 	 	 	 	 	 d fdZe	 	 d	 	 	 	 	 	 	 	 	 dd       Zd fdZ	 	 	 	 	 	 	 	 d fdZ	e
d	d       Z	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )rH  c                     yr   rj   r  s    rX   enable_tracingz%ProxyTorchDispatchMode.enable_tracing      rZ   c                V   |r$t         j                  j                  j                  nd }t        |   |       || _        || _        || _        || _	        || _
        t         j                  j                  j                  | _        g | _        d| _        ddlm} |j$                  | _        y )Nr   config)r   r  DispatchKeyPreDispatchr  r  r   tracing_moder  rk  r  _TorchDispatchModeKeyPROXY	_mode_keyenter_stackrK  torch._inductorrd  rL  )	r  r   rg  r  rk  r  dkrd  r   s	           rX   r  zProxyTorchDispatchMode.__init__  s     2>UXX!!--4(($8!,H) 77== DF"#*-3-K-K$rZ   c                    t        |      5  |xs i }|t        j                  j                  fv r ||i |cd d d        S t	        | || j
                  ||      cd d d        S # 1 sw Y   y xY wrU   )r8  primr   r   r  r  r>  s        rX   __torch_dispatch__z)ProxyTorchDispatchMode.__torch_dispatch__  st     "$' 	K\rF++--T,V,		K 	K dD$*;*;T6J	K 	K 	Ks   +A#A##A,c                    t        t        j                  j                  j                        }| j
                  j                  |       t        | !         S rU   )	r4   r   r  rh  ri  rk  rm  r  	__enter__)r  maybe_prev_proxy_moder   s     rX   rr  z ProxyTorchDispatchMode.__enter__   sA     1%((2P2P2V2V W 56w ""rZ   c                x    t         |   |||      }| j                  j                         }|t	        |       |S rU   )r  __exit__rk  rQ  r3   )r  exc_type	exc_value	tracebackbmb_previous_proxy_moder   s         rX   ru  zProxyTorchDispatchMode.__exit__  sC     GXy)< "&!1!1!5!5!7!--.rZ   c                     yr   rj   )clss    rX   is_infra_modez$ProxyTorchDispatchMode.is_infra_mode  ra  rZ   c                D    t        |      dk(  r2t        |d   t        t        f      rt         fd|d   D              f}nt         fd|D              } j                  j                  d||i       }t        j                  | j                        }t        ||       |S )Nr;   r   c              3     K   | ]D  }t        |t              r.t        |j                        j	                         j
                  n| F y wrU   r   rF   r   r   r<  r   rk   r  r  s     rX   rl   z8ProxyTorchDispatchMode._compute_proxy.<locals>.<genexpr>   sI        &a6 'q$++6<<>CC   A
Ac              3     K   | ]D  }t        |t              r.t        |j                        j	                         j
                  n| F y wrU   r  r  s     rX   rl   z8ProxyTorchDispatchMode._compute_proxy.<locals>.<genexpr>*  sI        "!\2 #1dkk288:??r  r  )	r  r   rV   r\   r   r  r-  r)   r   )r  rY  r   r  n_argsn_outp_outs   `      rX   _compute_proxyz%ProxyTorchDispatchMode._compute_proxy  s    
 t9>ja4-@  "!W 	F    F ''vrJ,rZ   c                Z   |t         j                  k(  r@t        |d   t              r|d   dk(  r|d   S t        |d   t              r|d   dk(  r|d   S |rJ  ||i |}t        |t              r;t        | j                  | j                  |||      }t        || j                  |       |S )Nr;   r   )rY  r   r  )	operatormulr   r   rF   r  r   r  r   )r  rY  r?  r   r  r  p_out_thunks          rX   __sym_dispatch__z'ProxyTorchDispatchMode.__sym_dispatch__:  s     8<<$q'3'DGqLAwDGS)d1glAw
 zD#F# c<("T00t$CK 3[9
rZ   r  r   )FFT)r   rB  rg  r  r  r   rk  r   r  r   r  r  rC  rD  )r  r   )rv  zOptional[type[BaseException]]rw  zOptional[BaseException]rx  zOptional[types.TracebackType]r  zOptional[bool])rY  r?   r   rF  r  r   r  r)   )
rY  r?   r?  rE  r   rF  r  dict[str, object]r  r2  )r|   r}   r~   propertyr`  r  r6   rp  rr  ru  classmethodr}  r  r  r  r  s   @rX   rH  rH    sX     #%*-1LL L 	L
 #L '+L 
L6 
 $&.2KK 0K !	K
 ,K 
K K#/ + 1	
 
  &8?H	B 0 !	
 " 
rZ   c                  l     e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   dZded<   d fdZ xZS )rL   r  r   z*MutableMapping[PySymType, _PySymProxyType]r   r  r   r  r   zOptional[OpOverload]r  r  r  Fr   r   c                    t         |   |       t        j                         | _        t               | _        i | _        t        d t              | _
        d | _        i | _        y )Nr  )r  r  weakrefr   r   r:   r   r   r9   r8   r   r  r  )r  rT  r   s     rX   r  z _GraphAppendingTracerEx.__init__e  sZ    &88:57"$%8&
" "&  "rZ   )rT  zfx.graph.Graphr  r  )r|   r}   r~   r   r   r  r  r  s   @rX   rL   rL   \  s;    FF??8822++**!OT!" "rZ   rL   c                       e Zd Z	 d	 	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 d fdZd	 fdZ xZS )
rE   c                    t        |   |fi | || _        t        | j                        | _        |xs i | _        t        | j                  d      | _        y )Nreal)rg  )r  r  	new_graphrL   r   rv   rH  r  )r  moduler  rv   r  r   s        rX   r  z!DecompositionInterpreter.__init__w  sM     	*6*"-dnn=#6#<" *4;;VL	rZ   c                    t         |   |||      }t        j                  | j                  j                  |      | j
                        }t        ||d | j
                         |S Nry  )r  r   r-  r)   r  r   r6  r  r  r   r  r  r   r   s         rX   r   z$DecompositionInterpreter.placeholder  sR     g!&$733F;T[[I#utDKKH
rZ   c                    t         |   |||      }t        j                  | j                  j                  |      | j
                        }t        ||d | j
                         |S r  )r  r  r-  r)   r  r   r6  r  s         rX   r  z!DecompositionInterpreter.get_attr  sR     gvtV4008$++F#utDKKH
rZ   c                     t            |||      }ddd fd} j                  j                  t        j                  ||             |S )Nc                .    | j                   j                  S rU   )r   r   r   s    rX   get_proxy_nodez7DecompositionInterpreter.output.<locals>.get_proxy_node  s    77<<rZ   c                4    t        | j                  |       S rU   )r   r   )r.  r  r  s    rX   unwrapz/DecompositionInterpreter.output.<locals>.unwrap  s    !!T[[!^DDrZ   )rc   r   r  r  )r.  r   r  zUnion[Tensor, fx.Node])r  r  r  r`   tree_map)r  r  r   r  r  r  r  r   s   `     @rX   r  zDecompositionInterpreter.output  sF     gnVT62	 	E 	foofc:;
rZ   c                    t        | j                        5  | j                  5  t        |   |i |cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY wrU   )rx   rv   r  r  run)r  r   r  r   s      rX   r  zDecompositionInterpreter.run  sY     t//0 	0$)) 	07;//	0 	0 	0 	0 	0 	0 	0s!   AA	AA	AA$rU   )
r  fx.GraphModuler  fx.Graphrv   'Optional[Mapping[OpOverload, Callable]]r  r2  r  r  )r  r  r   rF  r  r  r  r2  )r   r2  r  r2  r  r2  )	r|   r}   r~   r  r   r  r  r  r  r  s   @rX   rE   rE   v  s    
 HL	MM M E	M
 M 
M

 !
 "	

 

		 !	 "		
 
	 ! "	
 
"0 0rZ   rE   c                P     t        j                  ||f      \  }d fd}||fS )Nc                F    t        j                  |       \  }} |i |S rU   )r`   r  )	flat_argsfn_args	fn_kwargsrY  r  s      rX   r.  z-wrapper_and_args_for_make_fx.<locals>.wrapped  s*    #229dCW*	**rZ   )r  zlist[object]r  rR   )r`   rz  )rY  r   r  r  r.  r  s   `    @rX   wrapper_and_args_for_make_fxr    s/    
 ))4.9OIt+ IrZ   c               #     K   t        j                         } t        j                  d       	 d  t        j                  |        y # t        j                  |        w xY wwNF)r   is_autocast_cache_enabledset_autocast_cache_enabled)	old_values    rX   disable_autocast_cacher    sF     //1I	$$U+4((3((3s   *A!A A!AA!c                      e Zd Zy)#_ModuleNotInstalledAsSubmoduleErrorNr{   rj   rZ   rX   r  r    r   rZ   r  c                      e Zd ZddZy)
_AttrProxyc                     y rU   rj   )r  basepaths      rX   reset_proxy_mappingz_AttrProxy.reset_proxy_mapping  s    rZ   N)r  r0   r  r  r  r  )r|   r}   r~   r  rj   rZ   rX   r  r    s    rZ   r  c                       e Zd ZdZd	 fdZd
dZ	 	 	 	 	 	 	 	 d fdZ	 	 	 	 	 	 d fdZ	 	 	 	 	 	 	 	 	 	 ddZddZ	d fdZ
 xZS )_ModuleStackTracera  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         |           d| _        d| _        || _        d| _        i | _        | j                  j                  d      D ]N  \  }}|| j                  v r,t        j                  d| j                  |   |       d| _        @|| j                  |<   P t               | _        t               | _        t               | _        d| _        t        t               | _        | j                  j                  d      D ],  \  }}| j"                  t%        |         j'                  |       . |  G fddt(              | _        y )NTF)remove_duplicatez<Shared module found between %s and %s, AttrProxy is enabled.r   c                  f     e Zd ZdfdZd fdZdfdZd	 fdZed
fd       Z xZ	S )._ModuleStackTracer.__init__.<locals>.AttrProxyc                   t        |t              r|j                         }t        |t              sJ t	        |j
                  j                  | j
                  |j
                  fi       | _        |j                  | _        |j
                  j                  | j
                  _        |j
                  j                  | j
                  _	        |j                  | <   |j                  | <   y rU   )r   r  get_baser0   r   r   r|   __dict__r}   r~   proxy_pathsproxy_modules)r  r  r  r   s      rX   r  z7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__  s    dJ/==?D!$/// "&NN++^^T^^4"
 !%,0NN,E,E).2nn.I.I+ ,0""4(-1$$T*rZ   c                    t        | t              sJ t        |   |      }t        |t              s|S  |j                  |    dz   |z         S N.)r   r0   r  __getattr__r  )r  rt  r  	AttrProxyr   r   s      rX   r  z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__!  sU    !$/// !7.t4!(F3#O 6+=+=d+Cc+ID+PQQrZ   c                "    j                   |    S rU   )r  r<  s    rX   r  z7_ModuleStackTracer.__init__.<locals>.AttrProxy.get_base,  s    ++D11rZ   c                ^   t        |t              rt        | t        j                  j                        rgt        j                  j	                  t        t        | j                  j                               |               } |j                  |     d|       S t        | t        j                  j                        r^t        j                  j                  t        | j                  j                               |         } |j                  |     d|       S t        | 5  |      S r  )r   slicer   r  
Sequentialr   rV   _modulesr   r  
ModuleListvaluesr  r  )r  r*  r   r  r   r   s      rX   r  z:_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//rZ   c                   d| j                   v sJ | j                   d   }t        |t              sJ |j                         D ci c]/  \  }}||% |j                  |    dz   t        |      z         n|1 c}}S c c}}w )Nr  r  )r  r   r   r   r  r  )r  
submodulesr0  r   r  r   s       rX   r  z7_ModuleStackTracer.__init__.<locals>.AttrProxy._modules>  s    !T]]222!]]:6
!*d333 '1&6&6&8 #U  , "%););D)AC)G#c()RS"#  s   4A>)r  zUnion[Module, _AttrProxy]r  r  r  r  )rt  r  r  r  )r  r0   )r*  zUnion[int, slice]r  r  )r  zdict[str, AttrProxy])
r|   r}   r~   r  r  r  r  r  r  r  )r   r  r   s   @rX   r  r    s,    2*	R20  rZ   r  )r  r  record_stack_traces!_record_forward_stack_traces_only
scope_rootenable_attr_proxysubmodule_pathsnamed_modulesr   infor   r  attr_proxy_mapr  counterr   rV   module_id_cacher   rm  r  
proxy_type)r  r  rt  r  modr  r   r   s        @@rX   r  z_ModuleStackTracer.__init__  s:   #' 15.$!&!44e4L 		/GD!D(((R((+
 *.&*.$$Q'		/ @Q?REVEXDUDW*40666N 	7ID#  C)006	7 ?	
 ?	B $rZ   c                    || j                   u ryt        |t              r| j                  |   S 	 t	        j
                  | |      S # t        $ r}t        |d}~ww xY w)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)r  r   r  r  r*   path_of_module	NameErrorr  )r  r  r.  s      rX   r  z!_ModuleStackTracer.path_of_moduleN  s^    
 $//!c:&##C((	=((s33 	=51<	=s   A 	AAAc                n   t        |t              r&t        |t        j                        s| j                  st
        |   |||      S t        |t              r|S || j                  vr | j                  ||      | j                  |<   n| j                  |   j                  ||       | j                  |   S rU   )r   r0   r-  r(   r  r  r  r  r  r  r  )r  r  r  r  r   s       rX   r  z_ModuleStackTracer.getattr^  s     8V,(BNN3))7?43HIIh
+O 4...,0OOHd,KD))==hM""8,,rZ   c                   t         |   ||      }t        j                          | j                  j                         D ]+  \  }}|j                  j                  t        t        |      <   - g }| j                  j                         D ]'  \  }}|| j                  v s|j                  ||f       ) dd}	|D ]>  \  }
} |	| j                  |
       | j                  |   }t        || j                  |
       @ |S )Nc                <   |j                  d      }|d d |d   }}t        | t              sJ | }|D ]4  }t        ||      s yt	        ||      }t        |t
        t        f      r4 y t        ||      syt        t	        ||      t
              syt        ||       y)Nr  FT)splitr   r0   r   r  r  delattr)r   r  atomsr  target_submodr  r  s          rX   _delete_proxy_attrz4_ModuleStackTracer.trace.<locals>._delete_proxy_attr  s     LL%E"'*eBi-Dc6***C  !sD) c4(!#
F';< ! 3. gc=9:FC'rZ   )r   r0   r  r  r  r   )r  r  r   clearr   r   r   r   r   r  r  r  rm  r+   )r  r  r  r   r0  r   !proxy_module_names_to_be_replacedrt  r  r  proxy_module_nameproxy_moduleactual_moduler   s                rX   r  z_ModuleStackTracer.traceq  s     gmD-0  	0557++113 	NHC?Byy~~3BsG<	N KM) II335 	ILD&+++188$H	I	8 0Q 	F+|tyy*;< ..|<M		3DE	F
 
rZ   c                    ddl m} t        ||t        f      r ||i |S 	 t	        j
                  | ||||      S # t        $ r* t        j                  dt        |              ||i |cY S w xY w)zlPythonKeyTracer 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(   r*   r  r  r   r   r  )r  r  r  r   r  r  s         rX   r  z_ModuleStackTracer.call_module  s     	2 a/;78D+F++
	,%%dAwfEE2 	,IIJ A D+F++	,s   ; 0A.-A.c                     yr  rj   )r  r  module_qualified_names      rX   is_leaf_modulez!_ModuleStackTracer.is_leaf_module  s    rZ   c                   t        |   |i |}|j                  dvrd|j                  vr'| j                  j                         |j                  d<   |j                  d   j                         D ]G  \  }\  }}t        |t              s||j                  dz   |j                  z   f|j                  d   |<   I |j                  dk(  r| j                  d|j                  vrx| j                  j                   d| j                  | j                      | j                  j                  j                   d| j                  j                   f|j                  d<   |S )aF  
        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  r  torch_fnr]   )r  r  r   r   module_stackcopyr   r   r   r}   r~   r  r|   r  r   )r  r   r  r   r0  fqnmod_clsr   s          rX   r  z_ModuleStackTracer.create_node  sS    w"D3F3 7733 		1/3/@/@/E/E/G		+,'+yy1B'C'I'I'K #^c7gt,**S073G3GG9DII/05 GG&&&2$))+ ))2231T5I5I$J`J`5a4bc))33<<=Qt?U?U?^?^>_`%DIIj!
 rZ   )r  r(   r  r  )r  r0   r  r  r  )r  Union[Module, Callable]r  rG  r  r  )
r  r0   r  r   r   rF  r  r  r  r  )r  r0   r  r  r  r   )r   r2  r  r2  r  r  )r|   r}   r~   r  r  r  r  r  r  r  r  r  r  s   @rX   r  r    s    $a$F= --#)-BR-	-&C+C<WC	CJ , ,  , !	 ,
 " , 
 ,D! !rZ   r  c                      e Zd Z	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZe	 	 	 	 	 	 dd       ZddZe	 	 	 	 dd       Z	ddZ
dd	Zdd
ZddZy)_MakefxTracerNc
                   t        |xs i       | _        | j                  j                  t        j                  j
                  j                  j                  t        j                  j                  j                         || _
        || _        || _        || _        || _        || _        d | _        t#               | _        t#               | _        d | _        t#               | _        t#               | _        || _        |	| _        y rU   )r   rv   
setdefaultr   r  r  r  r   _decompdecompositionsrg  _allow_non_fake_inputsr  record_module_stackrk  r  r   r   r   proxy_function_mode	fx_tracerpython_dispatcher_modetorch_fn_metadata_moder  parent_tracer)
r  rv   rg  r  r  r  rk  r  r  r  s
             rX   r  z_MakefxTracer.__init__   s     @D%2@
  	  ++IINN$$,,emm.J.J.T.T	
 ".,B#".)< *>!2N) ;?FQmM 	  59?J}#M 	# $7 6CrZ   c                    | j                   | j                  | j                  | j                  | j                  | j
                  gS rU   r   r   r	  r
  r  r  r  s    rX   _checkpoint_modesz_MakefxTracer._checkpoint_modes,  s>    !!OO$$NN''''
 	
rZ   c                X    || _         || _        || _        || _        || _        || _        y rU   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          rX   _restore_modesz_MakefxTracer._restore_modes6  s2     !6)#; '&A#&A#rZ   c              #  l  K   | j                         }	 ddlm} t        |d      r)| j                  r|j
                  }t        |      | _        nGt               | _        | j                  | j                  _	        | j                  rd| j                  _
        | j                  dk(  rudd l}|j                  j                  j                  |      }|Bdd lmc m} |j'                  d      5  t)        d| j*                   |       d	      }d d d        || _        n| j                  d
k(  rdd l}|j                  j                  j                  |      }|C |       }	dd lmc m} |j'                  d      5  t)        d| j*                  |	      }d d d        |j.                  J d       || _        n'| j                  dk(  st1        d| j                         | j3                  | j                         d   | j4                  |  y # 1 sw Y   xY w# 1 sw Y   xY w#  | j4                  |  w xY ww)Nr;   )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  r  r  r   r  r  r  r
  rB   r  r  rg  r  _dynamoutilsr   torch._functorch.configrT  rd  patchr$   r  r   r  AssertionError_construct_modes_with_fx_tracerr  )
r  r   r   
prev_modesr  r  r   r   _configr  s
             rX   _init_modes_from_inputsz%_MakefxTracer._init_modes_from_inputsF  s     ++-
9	-1q+&4+C+C[[
 "4J!?!0!2595M5M2++GKDNND  F*$#(==#6#6#G#G#M #+== PUV +937262M2M&.j*.	,( )9%""j0$#(==#6#6#G#G#M #+ (
I== PUV +938262M2M&/,( (11= H= )9%((F2(3D4E4E3FG  00@D,G   &  D,sO   H4CH  +H
A,H  6HA)H  8H4HH  HH   H11H4c                *   t        || j                  | j                  | j                  | j                        | _        | j                  rt        |      | _        | j                  dk(  s| j                  rt               | _	        t        |      | _        y )N)r  rk  r  r!  )rH  rg  r  rk  r  r   rJ  r	  r   r  r:  r  )r  r
  s     rX   r(  z-_MakefxTracer._construct_modes_with_fx_tracer  s}    0**!%!:!:)-)J)J
 'CI'ND$ 
*d.?.?*B*DD'&?	&J#rZ   c              #  &  K   | j                         }	 |j                  | _        dd}|j                  J  ||j                        | _        | j                  | j                         d   | j                  |  y #  | j                  |  w xY ww)Nc                    t        |       t        k(  r
t               S t        |       t        k(  rt        | j                        S t	        dt        |        d      )NzUnexpected tracer type: r  )r   rB   r  r  r   r  s    rX   _create_sub_fx_tracerzD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracer  sV    &/9*,,-(,>>-m.F.FGG&243F2GqI rZ   )r  rB  r  rB   )r  r   r
  r(  r  )r  r  r)  r0  s       rX   _init_modes_from_parentz%_MakefxTracer._init_modes_from_parent  s      ++-
	-$1$B$BD! !**6662=3J3JKDN00@D,D,s   BAA= -B=BBc           	         dd l t        j                  fd|      }d fd}dd} ||      } |||      }t        j                  t
         j                        }t               5 }|j                  t         j                                j                  r|j                   j                         |j                   j                         |j                   j                         |j                   j                         |j                  |       |j                  t                      |j                  t!                       j"                  J 	 t%        t'        || j"                   j(                         j"                  t+        |            }		 d d d         j1                         rSj2                  j5                  |      x}
r6|
j6                  *dd
lm}  |	|
j6                  d       |	j=                           j>                  dk(  r) j                  J  j                  j6                  	_        	S # t,        $ r t/        dd  fd	        w xY w# 1 sw Y   xY w)Nr   c                D    j                   j                  j                  S rU   )r-  _symbolic_tracePH)r]   r   s    rX   rY   z,_MakefxTracer._trace_inner.<locals>.<lambda>  s    (@(@(C(C rZ   c                n    ddfd}d ||d}t        j                  |j                     |       S )Nr   c                   ddl m} j                  J  |d       }t        | t              r"dz  j                  j                  | |      S t        |       t        u rzj                  dk(  rkj                  j                  J d       j                  j                  j                  j                  j                  j                  | |d       | |	      S t        | j                        r0j                  j                  j                  j                  |       S t        | t               rJ d
|  d       | S )Nr   )ConstantSourceinputr;   )sourcer!  r"  )positive)hintr:  zScriptObject z. has been fakified. Cannot wrap_fake it again.)torch._dynamo.sourcer8  r   r   r   from_tensorr   r   rg  r  create_symintnodecreate_symbolScriptObject_libraryfake_class_registrymaybe_to_fake_objr    )rc   r8  r:  	arg_countr  r   s      rX   inner_wrap_fakezG_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.inner_wrap_fake  sS    @,,888'%	{(;<a(NI00<<Qv<NN!W^(9(9Z(G00::F LF  00::LL--77EEv F  % M    5#5#56 >>==OO--q  &a)9: #A3&TU: rZ   c                    | S rU   rj   r   s    rX   rY   z@_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.<lambda>  s    ! rZ   r  r  r!  )rc   r2  r  r2  )r`   r  rg  )r   rF  wrap_fn_maprE  r  r   s      @rX   
_wrap_fakez._MakefxTracer._trace_inner.<locals>._wrap_fake  s>    I!H $'+K
 ??;t/@/@#A4HHrZ   c                    t        t        j                  |       d      r:t        j                  |       j                  j                  t        j
                  z  rt        | t        |            S | S )N__code__)r   inspectr  rL  co_flags
CO_VARARGSrt   r  )r   phss     rX   
_wrap_funcz._MakefxTracer._trace_inner.<locals>._wrap_func  sP    GNN1-z:>>!$--669K9KK &aS22HrZ   )r   r  artifactc                     dddS )Nmake_fx_fail_partialstring)rt  encodingrj   rj   rZ   rX   rY   z,_MakefxTracer._trace_inner.<locals>.<lambda>	  s     6$,) rZ   c                 j     j                   j                  j                  dddd      j                  S )Nr  T)root_moduleverboseinclude_strideinclude_device)r
  rT  python_codesrcr  s   rX   rY   z,_MakefxTracer._trace_inner.<locals>.<lambda>	  s8    t~~';';'G'G$* $'+'+	 (H (
 c rZ   )metadata_fn
payload_fn)insert_deferred_runtime_assertsreenter_make_fxr!  )r   rO   r  rO   )r   Callable[_P, R]rP  zSequence[PHBase]r  rb  ) r  r`   r  r   r   rH  r   r   enter_contextrx   rv   r   r  r	  r  r  _set_make_fx_tracerr
  rC   r1  r  r\   	Exceptionr!   is_hop_subgraph_tracer_guardsr   r  torch.fx.passes.runtime_assertr`  	recompilerg  )r  r   r   rP  rJ  rQ  rY  r   stackrB  r   r`  r   s   `           @rX   _trace_innerz_MakefxTracer._trace_inner  s    	ooCTJ+	IZ	 $!S! .4[["DOO.

 [  	E	$*B*B CD$$##D$9$9: ; ;< 8 89 ; ;<
+ 6 89 3D 9:>>---"T49J9JK>>"'* 	F '')#mm<<TBBB##/V+Ay/B/BDUVKKM
*((444//99AK;   !  % 	  	s    *C/I!AIII!!I*c                x    | j                  ||      5   | j                  |g| cd d d        S # 1 sw Y   y xY wrU   )r+  rk  )r  r   r   s      rX   r  z_MakefxTracer.trace2	  s<    ))!T2 	/$4$$Q..	/ 	/ 	/s   09c                    | j                   d uS rU   r/  r  s    rX   rf  z$_MakefxTracer.is_hop_subgraph_tracer6	  s    !!--rZ   c           
        t        | j                  d| j                  | j                  | j                  | j
                  | j                  |       }|j                  |       5   |j                  |g| cd d d        S # 1 sw Y   y xY w)Nr  r/  )	r  rv   r  r  r  rk  r  r1  rk  )r  r   r   
sub_tracers       rX   trace_subgraphz_MakefxTracer.trace_subgraph9	  s    "$$''$$%%--	

 //5 	5*:**14t4	5 	5 	5s   !A>>B)FN)rv   r  rg  r  r  r   r  r   r  r   rk  r   r  r   r  r   r  Optional[_MakefxTracer]r  r  )r  z	list[Any])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]r  r  )r   r   r   rF  r  Generator[None, None, None])r
  rB  r  r  )r  r  r  rr  )r   r   r   r2  r  r(   )r   r   r   r2  r  r  r  )r|   r}   r~   r  r  r  r
   r+  r(  r1  rk  r  rf  rp  rj   rZ   rX   r  r    sC    %*15*DD*D *D !%	*D
 *D "*D #*D '+*D "*D /*D 
*DX
B7B DB #S	B
 2B &=B &SB 
B  =-=-!3=-	$=- =-~K& -*-	$- -6{z/.5rZ   r  rq  _CURRENT_MAKE_FX_TRACERc              #  8   K   t         }	 | a d  |a y # |a w xY wwrU   )rs  )r   prev_tracers     rX   rd  rd  L	  s'      *K."("-+s    )r  r  rk  r  r  c                    |dv sJ ddl m}	 t        ||||||||xs |	j                  j                  dk(        t        j                         d fd       }
|
S )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"]
    rH  r   rc  r;   )r  c                 *     j                   g|  S rU   )r  )r   r   make_fx_tracers    rX   r.  zmake_fx.<locals>.wrapped{	  s    #~##A---rZ   )r   r2  r  r(   )rl  rd  r  r  provenance_tracking_levelr   r/  )r   rv   rg  r  r  r  rk  r  r  rd  r.  rx  s   `          @rX   rD   rD   W	  st    ( 7777&"$/ 7<<11Q6
N __Q. . NrZ   c                 R    t         j                  j                  j                         S rU   )r   r$  _python_dispatch _get_current_dispatch_mode_stackrj   rZ   rX   get_torch_dispatch_modesr}  	  s    ;;''HHJJrZ   c                     t               S rU   )rH   rj   rZ   rX   rG   rG   	  s    rZ   c                 4   t         j                  j                  t         j                  j                  j
                        } t         j                  j                  t         j                  j                  j
                        }| |J d|  d|        | xs |S )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   rM  _get_dispatch_mode_pre_dispatchr  rh  ri  _get_dispatch_mode)pre_dispatch_moder  s     rX   rH   rH   	  s     

BB&&,, 88&&uxx'E'E'K'KLD$ 
./wtf=4 $$rZ   c                    t               }|sJ t               5  g }|j                  | |||      cddd       S # 1 sw Y   yxY w)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.
    N)rH   r  r  )rY  r   r  r  r?  s        rX   rI   rI   	  sM     DK4 
%	& @$$T5$?@ @ @s	   9Ac                 \    t        t        j                  j                  j                        S rU   )r2   r   r  rh  ri  rj   rZ   rX   r  r  	  s    uxx==CCDDrZ   c                   ddl m} t        v rb|j                  ddfd      rt        S | 5  | xj
                  dz  c_        t           |i |}| xj
                  dz  c_        |cd d d        S t        S # 1 sw Y   t        S xY w)Nr   )CompilerBisectoraot_eager_decomp_partitiondecompositionc                     t               S rU   )repr)r   s   rX   rY   z%maybe_handle_decomp.<locals>.<lambda>	  s    48 rZ   r;   )!torch._inductor.compiler_bisectorr  rN   disable_subsystemr}  rK  )r   r   r   r  r  r  s    `    rX   r~  r~  	  s     C	((--(/;K
 "! 	$$)$-b14B6BC$$)$		 	 	 s   :A88Bc                    t        | ||      \  }}t               5   t        |||      |      }ddd       |S # 1 sw Y   S xY w)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.
    )rv   rg  N)r  r  rD   )rY  r   r  rg  rv   r.  all_argsgms           rX   get_isolated_graphmoduler  	  sY     5T4HGX	$	& 
W)<<

 I	 Is	   :Ac                >   ddl m} t        j                  j	                  t        j                  j
                  j                        }|rT|j                  rG ||j                  |       x}r1t        |t              sJ |       ||j                  j                  d<   yyyy)zOA helper function for setting up unbacked_bindings on the destination FX graph.r;   )compute_unbacked_bindingsunbacked_bindingsN)r  r  r   r  r  rh  FAKEr  r   r)   r   r   )r  r]  r  r   symbol_to_paths        rX   r3  r3  	  s    : ++EHH,J,J,O,OPIY((6y7J7JCPP>Pi/::/7EINN 34 Q )yrZ   )rn   rb  rr   r   r  rb  )rv   r  r  z4Generator[Mapping[OpOverload, Callable], None, None])r   r   r  r   )r   r   r   rB  r   r   r  r  )r   r  r   rB  r   r)   r  r  )r   r   r   rB  r   r   r  r  r  )r  rr  )r   z.Union[PySymType, _AnyScriptObjectType, Tensor]r   rB  r   r2  r  r  )r   r   r   rB  r  r   )r   r   r   rB  r  r   )r   r   r   rB  r   rP   r  zUnion[_ProxyTensor, U])
r   r   r   rB  r   rP   r   zCallable[[_ProxyTensor], R]r  Union[R, U])r   r  r   rB  r  r)   )r   r  r   rB  r   rP   r  zUnion[Proxy, U])
r   r  r   rB  r   rP   r   zCallable[[Proxy], R]r  r  )r   r   r   rB  r  r   )r   r   r   rB  r   rO   r  zUnion[T, _PySymProxyType])
r   r   r   rB  r   rP   r   zCallable[[_PySymProxyType], R]r  r  )
r   .Union[Tensor, _AnyScriptObjectType, PySymType]r   rB  r   r2  r   r   r  r2  )F)r   r   r   r   r  r8  )r   r   r   r   r  r   )r   rB  r   r   r  rr  )r   r)   r   r   r  r)   )
r   rB  r   rb  r   r  r  r  r  zThunk[R])
r  r   r   r)   r  r8  r   rB  r  r  )
r4  rO   r5  r"  r  r,  r   rB  r  rO   )r   rB  r  z5Callable[[PySymType], Union[bool, int, float, Proxy]])r   rB  rB  r   r  zUnion[_ProxyTensor, Tensor])r   rB  rB  r  r  r  )r   rB  rB  r   r  z!Union[_PySymProxyType, PySymType])r   rB  rB  r  r  r2  )rY  r2  r   rH  r  r  )rc  z'Union[list[object], tuple[object, ...]]r   rB  r  z-tuple[list[object], tuple[object, ...], bool])r   rH  rY  r?   r  r   r   rF  r  r  r  r2  rU   )r  r   r  z:Optional[tuple[tuple[Argument, ...], dict[str, Argument]]]r  r   )r  ztype[TorchFunctionMode]r  zCCallable[[], _GeneratorContextManager[Optional[TorchFunctionMode]]])r  r   r   r*   r  zOptional[tuple[Any, ...]]r  r(   )
r   zCallable[[Unpack[_Ts]], R]r-  ztuple[Unpack[_Ts]]r   rB  r  r   r  rb  )rY  r?   r  rr  )rY  zCallable[..., R]r   rF  r  r  r  z0tuple[Callable[[list[object]], R], list[object]])r   r  r  rr  )Nr  F)r   r   rv   r  rg  r  r  r   r  r   r  r   rk  r   r  r   r  r   r  zCallable[..., GraphModule])r  zlist[TorchDispatchMode])r  z Optional[ProxyTorchDispatchMode])rY  rb  r   r  r  r  r  rR   )r  z-Generator[ProxyTorchDispatchMode, None, None])
r   rH  r   r?   r   rF  r  r  r  r2  )r  N)rY  r   r   rF  r  r  rg  r  rv   r  r  r(   )r  r2  r]  r"  r  r  )
__future__r   r   rM  loggingr  	threadingr   r   r  collectionsr   r   collections.abcr   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.fxr-  torch.fx.tracebackrx  r5  torch.utils._pytreer$  _pytreer`   r   r   r   torch._dispatch.pythonr   "torch._library.fake_class_registryr    torch._loggingr!   torch._subclasses.fake_implsr"   torch._subclasses.fake_tensorr#   r$   r%   r&   torch._subclasses.meta_utilsr'   r(   r)   r*   torch.fx.graph_moduler+   torch.fx.noder,   r-   r.   torch.fx.passes.shape_propr/   torch.nnr0   r  r1   torch.utils._python_dispatchr2   r3   r4   r5   torch.utils._statsr6   torch.utils._thunkr7   torch.utils.weakr8   r9   r:   _backward_stater<   sym_noder=   r?  r>   r   r?   torch.fx._symbolic_tracer@   torch.typesrA   __all__rB  rA  r   r  r  r  ro  	getLoggerr|   r   _logginggetArtifactLoggerr|  rN   r   rw  rO   rP   rQ   rR   rS   r   null_ctx_typeregister_pytree_nodeSizer\   !_pytree_subclasses_that_lose_infort   rx   r2  
proxy_slotrz   
no_defaultrF   r   r   r   r   localr   r   r   r   r   r   r   r   r   rV   r   r  r   r   r   r   r   r   rK   rJ   r   r  r!  r"  r#  r6  r   r?  rC  r  r  rj  r[  rg  r  r  rB   r  r  _disable_dynamorC   r1  r2  r8  r:  )_temp_remove_metadata_torch_function_moderJ  -_temp_remove_pre_dispatch_torch_function_moderH  r   GraphAppendingTracerrL   InterpreterrE   r  r  r  r  r  r  r  rs  rd  rD   r}  rG   rH   rI   r  r~  r  r3  rj   rZ   rX   <module>r     s   #         0 8 8 W W !	 	 	 Q P %    ) ) $ $ ) ) ; ? + 4  7 / / . 
 @  -  % $ W W *  .%/' AB&&(89 U//1AAB yy~~yy~~g!nn66xARS =? : ? CLCLt_CL5[!   	JJ &	  &+ZZ$7 !B 	>@	>9	> 	> X
	 	 \
 /x M
 
 W 
 W 
	'3<A	 

 
	(1@	 

)//  &A%B " EG ')A F4 )> )>X+A	7+A+A +A 
	+A\D
 , 
	  
 
!	!! ! 	! 
! 
	  +	
  
 
	  
 
	  	 
 
	  $	
  
 
	  
 
$	$$ $ 	$ 
$ 
	  .	
  
 !%		7  	
 > 	$%S##$		 %(P ,0%%%)% % %$    0  , 5< HQ  FBFB FB/?FBIUFB	FBR 	8O$gfo.E&FF 
H%&8H0H(II
TTT '	T
 T Tn   
:* 
&&#& & 
&
 
--1-'- 
-
 
,,&,&, 
,
((K(( ++Z8=
=4=	=4(K=(KGS(K2(KVA&A
A A 	A
 A AH' '>vf vv OS))K) 
)X$$$H$N  04)N
!)N)N -)N 	)N )NX!  	
 F #' &  % 1 %" -S- );%#4 ;%| 1W 1 -
J. JZ"bhh;; "4=0r~~ =0@
"4>O5 4 4	) 	
 
d dN	G5 G5T
 48 0 7 . . DH#(	(  %!&)- %((@( ( !	( ( ( ( #'( (  (VK% @
@
@ @ 	@( E E&  	
 6 CG

  	
 A ,FrZ   