o
    Zh?T                    @  s  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
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# d d	l
m$Z$ d dl%Z%d dl&Z%d dl'm(Z( d dl)m(  mZ* d dl+m,  m-Z. d d
l%m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@ d dl'mAZAmBZBmCZC d dlDmEZE d dlFmGZGmHZHmIZI d dlJmKZK d dlLmMZM d dlNmOZO d dlPmQZQmRZRmSZSmTZT d dlUmVZV d dlWmXZX d dlYmZZZ d dl[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZb erJd dlcZcd dlmdZd d dleZed d l&mfZf d d!lgmhZh d d"limjZj g d#Zke d$ Zle%jme5fZne e%jme5f Zoe%jpjqZqe%jpjrZresetZue%jvwetd%Zxi ayd&ezd'< dZ{ed(Z|ed)Z}e"d*Z~ed+ZeeZe.je%jd,d- d.d- d/d- d0d1 dd7d8Zedd<d=Ze ZG d>d? d?Ze Zd d@limZmZ G dAdB dBeZddEdFZed	dNdOZed
dRdOZeddUdOZddXdOZddYdZZeXeB Zedd[d\Zedd_d\Zeddcd\Zedddd\Zeddfd\Zeddhd\Zeddid\Zeddkd\Zeddmd\Zednd- fddqd\ZddtduZee eeoe`edv edw eedvf e1eeef
  ZddxdyZedzd{dd~dZedddZedddZdddZdddZdddZe eBed eedf f Ze e1ed eedf f ZdddZeG ddL dLZd ddZed!ddZed"ddZed#ddZd$ddZe1e%jje;fZd%ddZd&ddZG dd dZG dd deCZd'ddZe%j	d(d)ddZd*ddĄZdadezd< ed+ddȄZG ddʄ deOZeeZG dd̄ deOZeeZG dd deTZG ddτ de(jjZG ddф de(jZd,ddՄZedddׄZG ddل deZG ddۄ dۃZG dd݄ deZG dd߄ d߃Zdadezd< ed-ddZ			d.ddddzdd/ddZȐd0ddZɐd1ddZʐd1ddZːd2ddZed3ddZ͐d4ddZ		d5d6d dZϐd7ddZdS (8      )annotationsN)defaultdictOrderedDict)	GeneratorMappingSequence)_GeneratorContextManagercontextmanager	ExitStacknullcontext)	dataclass)AnyCallableOptionaloverloadProtocolTYPE_CHECKINGTypeVarUnion)Concatenate	ParamSpecSelf)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)CapturedTraceback)_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)r@   _GraphAppendingTracerExnot_implementedzMapping[OpOverload, Callable]CURRENT_DECOMPOSITION_TABLETU_PRc                 C  s   t | d fS N)listxs rU   Q/var/www/auris/lib/python3.10/site-packages/torch/fx/experimental/proxy_tensor.py<lambda>~   s    rW   c                 C  s   t | S rQ   )tuple)rT   _rU   rU   rV   rW          c                 C  s   dd t | D d fS )Nc                 S  s   g | ]\}}t ||fqS rU   )pytreeZSequenceKey).0ixrU   rU   rV   
<listcomp>   s    z<lambda>.<locals>.<listcomp>)	enumeraterS   rU   rU   rV   rW      s   z
torch.Size)Zflatten_with_keys_fnZserialized_type_namefnCallable[_P, R]nargsintreturnc                 C  s4   d dd t|D }td| d| dd| iS )z*FX gets confused by varargs, de-confuse it,c                 s  s    | ]}d | V  qdS )argNrU   )r\   r]   rU   rU   rV   	<genexpr>       z!fake_signature.<locals>.<genexpr>zlambda z: fn()ra   )joinrangeeval)ra   rc   argnamesrU   rU   rV   fake_signature   s   ro   decomposition_table'Optional[Mapping[OpOverload, Callable]]4Generator[Mapping[OpOverload, Callable], None, None]c                 c  s&    t }| pi a zt V  W |a d S |a w rQ   )rL   )rp   Zold_decomposition_tablerU   rU   rV   	decompose   s   rs   c                   @     e Zd ZdS )
_NoDefaultN__name__
__module____qualname__rU   rU   rU   rV   ru          ru   )rD   	PySymTypec                   @  s   e Zd ZU ded< dS )_HasMetazdict[str, PySymType]metaNrw   rx   ry   __annotations__rU   rU   rU   rV   r|      s   
 r|   nodeboolc                 C  s,   t | ds	J dd| jv ot| jd tS )Nr}   z3All nodes traced with proxy_tensor should have metaval)hasattrr}   
isinstancerD   )r   rU   rU   rV   is_sym_node   s   r   objr   tracer_ProxyTracerproxy_ProxyTensorNonec                 C     d S rQ   rU   r   r   r   rU   rU   rV   set_proxy_slot      r   _AnyScriptObjectTyper&   c                 C  r   rQ   rU   r   rU   rU   rV   r         r{   _PySymProxyTypec                 C  r   rQ   rU   r   rU   rU   rV   r      r   .Union[PySymType, _AnyScriptObjectType, Tensor]objectc                 C  s   t d| t| | t| trt|tsJ ||j| < d S t| tr0t|ts)J ||j	| < d S t| t
s;J t| | |jvr^tt||j| < dd l}t| jj|jr`||j| jj< d S d S d S )Nzset_proxy_slot %s (%s) %sr   )logdebugidr   r   r   tensor_tracker_AnyScriptObjectr&   script_object_trackerrD   typesymnode_trackertypingcastr   sympyr   exprSymbolsympy_expr_tracker)r   r   r   r   rU   rU   rV   r      s   


c                 C  s0   t | ttfsJ t| tt| |ddd S )NFc                 S     dS NTrU   rY   rU   rU   rV   rW          z has_proxy_slot.<locals>.<lambda>)r   r   r;   r   r   get_proxy_slotr   r   rU   rU   rV   has_proxy_slot   s   r   c                 C  r   rQ   rU   r   rU   rU   rV   r         r   defaultUnion[_ProxyTensor, U]c                 C  r   rQ   rU   r   r   r   rU   rU   rV   r         	transformCallable[[_ProxyTensor], R]Union[R, U]c                 C  r   rQ   rU   r   r   r   r   rU   rU   rV   r   	     c                 C  r   rQ   rU   r   rU   rU   rV   r     r   Union[Proxy, U]c                 C  r   rQ   rU   r   rU   rU   rV   r     r   Callable[[Proxy], R]c                 C  r   rQ   rU   r   rU   rU   rV   r   $  r   c                 C  r   rQ   rU   r   rU   rU   rV   r   .  r   Union[T, _PySymProxyType]c                 C  r   rQ   rU   r   rU   rU   rV   r   6  r   Callable[[_PySymProxyType], R]c                 C  r   rQ   rU   r   rU   rU   rV   r   ?  r   c                 C     | S rQ   rU   r^   rU   rU   rV   rW   P  r   .Union[Tensor, _AnyScriptObjectType, PySymType]r   c                 C  s   t | tr	|j}nt | tr|j}nt | tsJ t| |j}| |vrMt | tr8| jj	|j
v r8|j
| jj	 }nt |trKt|  dt|  d| |S ||  }||}|S )Nz (z)is not tracked with proxy for )r   r   r   r   r   rD   r   r   r   r   r   ru   RuntimeErrorr   )r   r   r   r   trackervalueresrU   rU   rV   r   L  s"   


r   Optional[Tensor]c                 C  s   t | trt| j| S |  S rQ   )r   r    r   	fake_modedetach)r   rU   rU   rV   snapshot_fakek  s   
r   _ExtractValType)r   .c                 C  s  t | rt| S t| tr| S t| tr| S t| tr| S t| ttfr.| dd | D S t| t	r<dd | 
 D S t| trx| jsvddlm} || }|sUtdd}| tj| j|  | j| jd	W  d    S 1 spw   Y  nd S t| tttfr| S | d u rd S t|  d S )
Nc                 S  s   g | ]}t |qS rU   extract_valr\   r^   rU   rU   rV   r_     s    zextract_val.<locals>.<listcomp>c                 S  s   i | ]	\}}|t |qS rU   r   )r\   kvrU   rU   rV   
<dictcomp>  s    zextract_val.<locals>.<dictcomp>r   )detect_fake_modeT)allow_fallback_kernels)devicedtype)r"   r   r   rD   r   r:   rR   rX   	__class__dictitemsr   	is_sparseZtorch._guardsr   r!   torchZempty_stridedshapestrider   r   rd   floatr   typing_extensionsZassert_never)r   r   fake_tensor_moderU   rU   rV   r     s:   





"r   Tenabler   Generator[None, None, None]c                c  s*    | j }|| _ z	dV  W || _ dS || _ 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   oldrU   rU   rV   _enable_thunkify  s   r   c                  c  sT    t  } | dur%t| jdd dV  W d   dS 1 sw   Y  dS dV  dS )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   rF   r   r   
proxy_moderU   rU   rV   rI     s   "
rI   c                  c  sP    t  } | dur#t| j dV  W d   dS 1 sw   Y  dS dV  dS )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   rU   rU   rV   rH     s   
"
rH   c                 C  s   t || jjd< t| j> t|rt|| jjd< n t|tr3|j	sCt|| jjd< W d    | S W d    | S W d    | S W d    | S 1 sNw   Y  | S )Nr   Ztensor_meta)
r   r   r}   r   r   r"   r,   r   r   r   )r   r   rU   rU   rV   set_meta  s&   



r   fargs_P.argskwargs	_P.kwargsThunk[R]c                   s@   | j rttj|g|R i |S ||i | t fddS )zT
    Delays computation of f until it's called again
    Also caches the result
    c                         S rQ   rU   rU   rrU   rV   rW      r   zthunkify.<locals>.<lambda>)r   r4   	functoolspartial)r   r   r   r   rU   r   rV   thunkify  s   r   tensorconstantc                  s   dfdd}t | jD ]\}}|| fdd| qt| s6t |  D ]\}}|| fdd| q&||   fdd t| sR||   fdd t| t | d S )Nouter_sr?   proxy_callable+Callable[Concatenate[PySymType, _P], Proxy]r   r   r   r   re   r   c                   sj   t |sJ t| tr3t  t|  t || g|R i | W d    d S 1 s,w   Y  d S d S rQ   )callabler   r   r   r   r   )r   r   r   r   r   rU   rV   try_set_proxy_slot  s   

"z(track_tensor.<locals>.try_set_proxy_slotc                   "   t dtjjjj |fi | S Ncall_function)r   create_proxyr   opsatenZsym_sizerd   r^   r]   r   r   rU   rV   rW         ztrack_tensor.<locals>.<lambda>c                   r   r   )r   r   r   r   r   Z
sym_striderd   r   r   rU   rV   rW   *  r   c                       t dtjjjj fi | S r   )r   r   r   r   r   	sym_numelr   r   r   rU   rV   rW   5  s    c                   r   r   )r   r   r   r   r   Zsym_storage_offsetr   r   r   rU   rV   rW   ?  s    
)
r   r?   r   r   r   r   r   r   re   r   )r`   r   r$   r   numelstorage_offsetr   r   )r   r   r   r   r   r]   srU   r   rV   track_tensor  s0   	r  _NestedProxys_NestedTensors	inner_res	proxy_resOptional[_NestedTensors]c                  s*   t | | d fd	d
| || | S )Ner   r   r  r   r	  re   r   c                   s  t | tr&t  tsJ |d u st |tsJ t|  |d t |  d S t | trFt  ts2J t |  t| t fdd d S t | tr_t  tsRJ t|   t |  d S t | t	t
frt  tjrqt |  dd	d
}t| D ]\}}| | ||| qzd S t | tr|d u sJ t  tjrt |  |  D ]\}}| | d  qd S t | trt  tsJ t |   | _d S 	 d S )N)r   r   c                     r   rQ   rU   rU   r   rU   rV   rW   v  r   z<track_tensor_tree.<locals>.wrap_with_proxy.<locals>.<lambda>cr	  idxrd   re   c                 S  s&   | d u rd S t | ttfsJ | | S rQ   )r   rR   rX   )r  r  rU   rU   rV   get_constant  s   z@track_tensor_tree.<locals>.wrap_with_proxy.<locals>.get_constant)r  r	  r  rd   re   r	  )r   r   r&   r  r   rD   r   r   r   rX   rR   fxr`   r   r   r:   r   )r
  r   r   r  r  eekeyr   r   wrap_with_proxyr  rV   r  j  s@   





	




z*track_tensor_tree.<locals>.wrap_with_proxy)r
  r   r   r  r   r	  re   r   )_set_unbacked_bindings)r  r  r   r   rU   r  rV   track_tensor_treeT  s   
<r  c                   @  s   e Zd ZU ded< ded< dS )r   r&   r   r   r   Nr~   rU   rU   rU   rV   r     s   
 5Callable[[PySymType], Union[bool, int, float, Proxy]]c                   s   d fdd}|S )Nr
  r{   re   Union[int, bool, float, Proxy]c                   st   | j }|jd ur|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
s3J t|   S rQ   )r   r   r   Z	is_numberr   r   r   r   rd   r   rD   r   force)r
  nr   rU   rV   inner  s   



zfetch_sym_proxy.<locals>.inner)r
  r{   re   r  rU   )r   r  rU   r   rV   fetch_sym_proxy  s   r  tUnion[_ProxyTensor, Tensor]c                 C  r   rQ   rU   r   r  rU   rU   rV   fetch_object_proxy  r   r  "Union[Proxy, _AnyScriptObjectType]c                 C  r   rQ   rU   r  rU   rU   rV   r    r   !Union[_PySymProxyType, PySymType]c                 C  r   rQ   rU   r  rU   rU   rV   r    r   c                 C  s   t || |S rQ   r   r  rU   rU   rV   r    s   funcr   ProxyTorchDispatchModec                 C  s   |j s|jsdS t| tjjrtjj| jvrdS t	t
t|jjj}|jd}t|tjr8|jtjtjfvr:dS d|jd< dS )zd
    Records pointwise operators in user program (non decomposed) that were output in fp16/bf16
    Nr   TZlow_precision_pointwise_barrier)decomp_layersemulate_precision_castsr   r   _opsr=   TagZ	pointwisetagsnextiterreversedr   graphnodesr}   getr   r   Zbfloat16Zfloat16)r#  r   Z	last_noder  rU   rU   rV   _maybe_record_pointwise_barrier  s   r0  r=   pre_dispatchtuple[object, ...]dict[str, object]c                   s  g t ||f\}}dfdd t fdd|D s&td	 tS t|||}|tur8t| |S |st|tj	j
jjtj	j
jjtj	j
jjfvrt |j|i |}|ture|W  d    S W d    n1 sow   Y  |tj	j
jju r |d
 d
k W  d    S 1 sw   Y  jfdd|D }tdd |D  otdd |D  }	tjj|jv r|	rdd |D }
t |
|\}}t  ||i |W  d    S 1 sw   Y  jrt tdd ||frtd| ddd |D }fdd|D }t ||\}}|tj	j
jju r%tj	j
jj}jjd|||jj !|j"j#d}t$j ||i |}W d    n	1 sOw   Y  tdd |D }d }ddd}|tj	j
jju r|% t&krt   t'|d
 t(tfsJ t)|d
 |d
 * }W d    n	1 sw   Y  nCtjj+|jvr|	r|rt t||rt  dd |D }
t |
|\}}||i |}W d    n	1 sw   Y  nd }t,|||d t| |S ) Nr^   r   re   r   c                   sJ   t | tv pt|  j} jr|pt | tjjfv }|s#t |  |S rQ   )	r   HANDLED_TYPESr   r   _allow_fake_constantr   Z_subclassesr    append)r^   r   )r   unrecognized_typesrU   rV   can_handle_tensor  s   z%proxy_call.<locals>.can_handle_tensorc                 3  s"    | ]}t |tr |V  qd S rQ   )r   r   r   )r8  rU   rV   rh     s     zproxy_call.<locals>.<genexpr>zEProxyTensorMode tensors without proxy had unrecognized subclasses: %sr   c                   s(   g | ]}t |ttfrt |n|qS rU   )r   r   r   r  r   r   rU   rV   r_   ,  s    zproxy_call.<locals>.<listcomp>c                 s  s$    | ]}t |tr|jd u V  qd S rQ   r   r   r   r\   r  rU   rU   rV   rh   9      
c                 s  s    | ]}t |tV  qd S rQ   )r   rD   r   rU   rU   rV   rh   @  ri   c                 S      g | ]}t |tr|jn|qS rU   r9  r:  rU   rU   rV   r_   F      c                 S  s
   t |  S rQ   )r"   r  rU   rU   rV   rW   S     
 zproxy_call.<locals>.<lambda>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.c                 S  r<  rU   )r   r   r   r\   r
  rU   rU   rV   r_   \  s    c                   s(   g | ]}t |trt j|n|qS rU   )r   rD   r  r   r@  r   rU   rV   r_   _  s    r   )namec                 s  s$    | ]}t |tr|jd uV  qd S rQ   r9  r:  rU   rU   rV   rh     r;  r  c                 S  s   |   tkS rQ   )r  CONSTANT_NUMEL_LIMITr>  rU   rU   rV   tensor_numel_in_limit     z)proxy_call.<locals>.tensor_numel_in_limitc                 S  r<  rU   r9  r:  rU   rU   rV   r_     r=  r   r   )r^   r   re   r   )r  r   re   r   )-r[   tree_flattenallnot_implemented_logr   NotImplementedmaybe_handle_decompr0  r   r   r   sizer   r   r  rs   Z
is_nonzeroitemr   anyr(  Zdata_dependent_outputr)  tree_unflattenr#   _error_on_data_dependent_opsZtree_all_onlyr   r   Z
lift_freshZlift_fresh_copyr   r-  Z_target_to_strZoverloadpacketrw   r   r  rB  r   r&   r   cloneZnondeterministic_seededr  )r   r#  r1  r   r   Zflat_args_kwargsspecr   Zf_flat_args_kwargsZall_constantZconst_flat_args_kwargsZ
const_argsZconst_kwargsZproxy_flat_args_kwargsZ
proxy_argsproxy_kwargsZ	proxy_outoutZany_constantr   rC  rU   )r8  r   r   r7  rV   
proxy_call  s   




 

 


#
$

rT  c                   @  sZ   e Zd ZdZdddZdd
dZdddZdddZ	d d!ddZd"ddZ	d#ddZ
dS )$_SymNodeDictzM
    Wrapper around a dictionary that will hash SymInts with their nodes
    re   r   c                 C  s
   i | _ d S rQ   )sym_node_dictselfrU   rU   rV   __init__     
z_SymNodeDict.__init__r  r{   r   r   c                 C  s   || j |j< d S rQ   rV  r   )rX  r  r   rU   rU   rV   __setitem__     z_SymNodeDict.__setitem__c                 C  s   | j |j S rQ   r[  rX  r  rU   rU   rV   __getitem__  rD  z_SymNodeDict.__getitem__r   c                 C  s   |j | jv S rQ   )r   rV  r^  rU   rU   rV   __contains__  rD  z_SymNodeDict.__contains__Nr   Optional[_PySymProxyType]c                 C  s   | j |j|S rQ   )rV  r/  r   )rX  r  r   rU   rU   rV   r/    s   z_SymNodeDict.getr   c                 C  s   t rQ   )NotImplementedErrorrW  rU   rU   rV   __iter__     z_SymNodeDict.__iter__rd   c                 C  s
   t | jS rQ   )lenrV  rW  rU   rU   rV   __len__  rZ  z_SymNodeDict.__len__re   r   )r  r{   r   r   re   r   )r  r{   re   r   )r  r{   re   r   rQ   )r  r{   r   ra  re   r   )re   r   )re   rd   )rw   rx   ry   __doc__rY  r\  r_  r`  r/  rc  rf  rU   rU   rU   rV   rU    s    




rU  c                      s   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< dC fddZdDddZdEd#d$ZdF fd'd(Ze	dGd,d-Z
e	dHd0d-Z
e	dId3d-Z
dJd5d-Z
	6	6dKdL fdAdBZ  ZS )Mr@   +MutableMapping[_AnyScriptObjectType, Proxy]r   rU  r   dict[sympy.Symbol, object]r   $MutableMapping[Tensor, _ProxyTensor]r   dict[OpOverload, int]torch_fn_countsFr   r   re   r   c                   sJ   t  jdd t | _t | _td td| _t	 | _
d | _i | _d| _d S )NrU   )Zautowrap_modulesr   Zref_typeF)superrY  r8   r   rU  r   r7   r6   r   r   r   torch_fn_metadatarm  r   rW  r   rU   rV   rY    s   
zPythonKeyTracer.__init__mr-   forwardCallable[..., Any]r   tuple[Any, ...]r   dict[str, Any]r   c                 C  s   ||i |S rQ   rU   )rX  rr  rs  r   r   rU   rU   rV   call_module  s   zPythonKeyTracer.call_moduleattrstrattr_valr   parameter_proxy_cachedict[str, Proxy]c                 C  s   |S rQ   rU   rX  rx  rz  r{  rU   rU   rV   getattr  s   zPythonKeyTracer.getattrafx.node.Nodec                   s   t |tjjr3| j D ]\}}||u r| d|di   S q| d}t| j|| | d|di S t |t	rD|j
jd us@J |j
jS t |S )Nget_attrrU   Z_param_constant)r   r   nn	ParameterrootZnamed_parameterscreate_nodeZget_fresh_qualnamesetattrrD   r   r   ro  
create_arg)rX  r  r  pqualnamerq  rU   rV   r    s   

zPythonKeyTracer.create_argr
  r   Union[Proxy, Tensor]c                 C  r   rQ   rU   rX  r
  rU   rU   rV   unwrap_proxy.  r   zPythonKeyTracer.unwrap_proxyr{   Union[Proxy, PySymType]c                 C  r   rQ   rU   r  rU   rU   rV   r  2  r   r   r   c                 C  r   rQ   rU   r  rU   rU   rV   r  6  r   rM   c                 C  sR   t |trt|| |dd S t |trt|| |dd S t |tr't|| |S |S )Nc                 S     | j S rQ   r  r   rU   rU   rV   rW   >      z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>c                 S  s   |   S rQ   )r  r
  rU   rU   rV   rW   @  rZ   )r   r   r   rD   r   r  rU   rU   rV   r  <  s   


Nkindtargetr+   tuple[Argument, ...]dict[str, Argument]rA  Optional[str]	type_exprOptional[Any]torch.fx.Nodec                   sd   t  ||||||}ddd}t|tjjjtjjjfr0tjj	
||f|\}	}
|	|
f|jd< |S )	Nr   r   re   Optional[_ExtractValType]c                 S  sN   t | tjjrd| jvrd S | jd }t |tjr t |ts d S t| jd S )Nr   )r   r   r  Noder}   r   r    r   )r   r   rU   rU   rV   map_fnQ  s   
z+PythonKeyTracer.create_node.<locals>.map_fnZarg_kwarg_vals)r   r   re   r  )ro  r  r   r   Z_higher_order_opsZtriton_kernel_wrapZTritonKernelWrapperFunctionalZTritonKernelWrapperMutationr  r   Zmap_aggregater}   )rX  r  r  r   r   rA  r  r   r  Zarg_inpZ	kwarg_inprq  rU   rV   r  F  s   	
zPythonKeyTracer.create_noderg  )
rr  r-   rs  rt  r   ru  r   rv  re   r   rx  ry  rz  r   r{  r|  re   r   )r  r   re   r  )r
  r   re   r  )r
  r{   re   r  )r
  r   re   r   )r
  rM   re   r   )NN)r  ry  r  r+   r   r  r   r  rA  r  r  r  re   r  )rw   rx   ry   r   r   rY  rw  r~  r  r   r  r  __classcell__rU   rU   rq  rV   r@     s*   
 



r@   mode_tytype[TorchFunctionMode]CCallable[[], _GeneratorContextManager[Optional[TorchFunctionMode]]]c                   s   t d fdd}|S )Nre   2Generator[Optional[TorchFunctionMode], None, None]c               	   3  s   ddl m} m}m} g }d }|  dkr)| }t| r|}n
|| |  dkst|D ]}|| q-z/|V  W |d ur`t|}|dkrP| }|d8 }|dksE|| t|D ]}|| qYd S d S |d urt|}|dkr{| }|d8 }|dksp|| t|D ]}|| qw w )Nr   )_len_torch_function_stack	_pop_moder0   r9   )torch.overridesr  r  r0   r   r6  r,  re  )r  r  r0   Ztemp_elementsZremoved_modemoder3   r  rU   rV   context_manager_fnl  sJ   








zB_make_temp_remove_mode_context_manager.<locals>.context_manager_fn)re   r  )r	   )r  r  rU   r  rV   &_make_temp_remove_mode_context_manageri  s    r  r  Union[Module, Callable]r'   concrete_argsOptional[tuple[Any, ...]]r%   c                 C  s^   | | |}d	dd}|| ddlm} || t| tr#| jjn| j}tj	
|j||S )
Nr  fx.Nodere   r   c                 S  sR   ddl m} |  rdS || rdS t| jdtr'tdd | jD r'dS dS )Nr9   )is_accessor_nodeTFr   c                 s  s.    | ]}t |tjrt |jd tV  qdS )r   N)r   r  r  r}   r/  rD   r\   r  rU   rU   rV   rh     s    

z6dispatch_trace.<locals>.impure_pred.<locals>.<genexpr>)	symbolic_shapesr  Z	is_impurer   r}   r/  rD   rG  r   )r  r  rU   rU   rV   impure_pred  s   
z#dispatch_trace.<locals>.impure_predr   )dedupe_symints)r  r  re   r   )traceZeliminate_dead_codeZ,torch._inductor.fx_passes.dedupe_symint_usesr  r   r-   r   rw   r  Z_lazy_graph_moduleZ_make_graph_moduler  )r  r   r  r-  r  r  rA  rU   rU   rV   rA     s   

rA   tensorsc                   s0   t \}t d	 fdd}|S )
Nproxiesr   _unusedr   re   rP   c                    s   t | \}}t|tksJ t }t|tsJ t|d d W d    n1 s.w   Y  dfdd}  }t t||}t t	fdd	|}dfdd}t t
||}|S )NrE  r  r   re   Union[Tensor, Proxy]c                      t |  | dd S )Nc                 S  r  rQ   r  r   rU   rU   rV   rW     r  zJwrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slot.<locals>.<lambda>r"  r>  r   rU   rV   get_tensor_proxy_slot  s   z8wrap_key.<locals>.wrapped.<locals>.get_tensor_proxy_slotc                   r  )Nc                 S  r   rQ   rU   r   rU   rU   rV   rW     r   z=wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>r"  r>  r   rU   rV   rW     s    z+wrap_key.<locals>.wrapped.<locals>.<lambda>r{   r&   c                   s   t |   S rQ   )r   r  r>  r   rU   rV   get_sym_proxy_slot  s   z5wrap_key.<locals>.wrapped.<locals>.get_sym_proxy_slot)r  r   re   r  )r  r{   re   r&   )r[   rF  re  disable_proxy_modes_tracingr   r$  r  Ztree_map_onlyr   r   rD   )r  r  Zflat_proxiesZ_proxies_specrr  r  rS  r  r   Zflat_tensorsr  r   rU   rV   wrapped  s   zwrap_key.<locals>.wrapped)r  r   r  r   re   rP   )r[   rF  r   wraps)r   r  r   r1  Z_tensors_specr  rU   r  rV   wrap_key  s   r  zOptional[object]ORIGINAL_ATENc              	   c  sV    t d u r&t r&| a | tjd< zd V  W d a d tjd< d S d a d tjd< w d V  d S )NZoriginal_aten)r  fx_tracebackZhas_preserved_node_metaZcurrent_meta)r#  rU   rU   rV   set_original_aten_op  s   

r  c                   @  &   e Zd ZdddZ		ddddZdS )TorchFunctionMetadataModer   r   re   r   c                 C  s
   || _ d S rQ   r   rX  r   rU   rU   rV   rY    rZ  z"TorchFunctionMetadataMode.__init__rU   Nr#  r=   types tuple[torch._C._TensorMeta, ...]r   r2  r   Optional[dict[str, object]]r   c                 C  s:   |pi }|| j _| j j|dd | j j|< ||i |S )Nr   r9   )r   rp  rm  r/  rX  r#  r  r   r   rU   rU   rV   __torch_function__  s   z,TorchFunctionMetadataMode.__torch_function__r   r   re   r   rU   N
r#  r=   r  r  r   r2  r   r  re   r   rw   rx   ry   rY  r  rU   rU   rU   rV   r    s
    
r  c                   @  r  )PreDispatchTorchFunctionModer   r   re   r   c                 C  s   || _ g | _d S rQ   )r   enter_autocast_nodesr  rU   rU   rV   rY  	  s   
z%PreDispatchTorchFunctionMode.__init__rU   Nr#  Union[OpOverload, Callable]r  r  r   r2  r   r  r   c                 C  s   |pi }|t v rC|tjjjkr| j }|f}| jd||i }|tjjj	kr-| j
| |tjjtjjj	tjjjfv rAd |jd< |S ||i |S )Nr   r   )r)   r   ampZautocast_modeZ_exit_autocastr  popr   r  Z_enter_autocastr6  _CZ_set_grad_enabledr}   )rX  r#  r  r   r   Z
enter_noder   rU   rU   rV   r    s    

z/PreDispatchTorchFunctionMode.__torch_function__r  r  )
r#  r  r  r  r   r2  r   r  re   r   r  rU   rU   rU   rV   r    s
    
r  c                      s   e Zd Zed4ddZ			d5d6 fddZe		d7d8ddZd9 fdd Zd: fd(d)Z	e
d4d*d+Zd;d/d0Zd<d2d3Z  ZS )=r$  re   r   c                 C  r   r   rU   rW  rU   rU   rV   enable_tracing6  r   z%ProxyTorchDispatchMode.enable_tracingFTr   r   tracing_modery  r1  r5  rO  r   c                   sl   |rt jjjnd }t | || _|| _|| _|| _	|| _
t jjj| _g | _d| _ddlm} |j| _d S )Nr   )config)r   r  ZDispatchKeyZPreDispatchro  rY  r   r  r1  r5  rO  _TorchDispatchModeKeyPROXYZ	_mode_keyenter_stackr%  Ztorch._inductorr  r&  )rX  r   r  r1  r5  rO  Zdkr  rq  rU   rV   rY  :  s   zProxyTorchDispatchMode.__init__rU   Nr#  r=   r  r  r   r2  r   r  r   c                 C  sp   t |* |pi }|tjjfv r||i |W  d    S t| || j||W  d    S 1 s1w   Y  d S rQ   )r  primr   r   rT  r1  r  rU   rU   rV   __torch_dispatch__U  s   
$z)ProxyTorchDispatchMode.__torch_dispatch__r   c                   s$   t tjjj}| j| t  S rQ   )	r1   r   r  r  r  r  r6  ro  	__enter__)rX  Zmaybe_prev_proxy_moderq  rU   rV   r  e  s   
z ProxyTorchDispatchMode.__enter__exc_typeOptional[type[BaseException]]	exc_valueOptional[BaseException]	tracebackOptional[types.TracebackType]Optional[bool]c                   s.   t  |||}| j }|d urt| |S rQ   )ro  __exit__r  r  r0   )rX  r  r  r  bZmb_previous_proxy_moderq  rU   rV   r  k  s
   
zProxyTorchDispatchMode.__exit__c                 C  r   r   rU   )clsrU   rU   rV   is_infra_modez  r   z$ProxyTorchDispatchMode.is_infra_moderS  r{   r&   c                   s   t |dkrt|d ttfrt fdd|d D f}nt fdd|D } jd||i }t| j}t|| |S )Nr9   r   c                 3  0    | ]}t |trt| j jn|V  qd S rQ   r   rD   r   r   r  r   r  rW  rU   rV   rh         
z8ProxyTorchDispatchMode._compute_proxy.<locals>.<genexpr>c                 3  r  rQ   r  r  rW  rU   rV   rh     r  r   )	re  r   rR   rX   r   r  r  r&   r   )rX  r#  r   rS  Zn_argsZn_outZp_outrU   rW  rV   _compute_proxy~  s   		
z%ProxyTorchDispatchMode._compute_proxyr3  c                 C  s   |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rIt| j| j|||d}t|| j| |S )Nr9   r   )r#  r   rS  )	operatormulr   rd   rD   r   r   r  r   )rX  r#  r  r   r   rS  Zp_out_thunkrU   rU   rV   __sym_dispatch__  s   
	
z'ProxyTorchDispatchMode.__sym_dispatch__)re   r   )FFT)r   r   r  ry  r1  r   r5  r   rO  r   re   r   r  r  )re   r   )r  r  r  r  r  r  re   r  )r#  r=   r   r2  rS  r{   re   r&   )
r#  r=   r  r  r   r2  r   r3  re   r   )rw   rx   ry   propertyr  rY  r3   r  r  r  classmethodr  r  r  r  rU   rU   rq  rV   r$  4  s"    
c                      s\   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dZ  ZS )rJ   ri  r   z*MutableMapping[PySymType, _PySymProxyType]r   rk  r   rj  r   zOptional[OpOverload]rp  rl  rm  Fr   r   r-  fx.graph.Graphre   r   c                   sB   t  | t | _t | _i | _td t	d| _
d | _i | _d S )Nrn  )ro  rY  weakrefr   r   r8   r   r   r7   r6   r   rp  rm  )rX  r-  rq  rU   rV   rY    s   

z _GraphAppendingTracerEx.__init__)r-  r  re   r   )rw   rx   ry   r   r   rY  r  rU   rU   rq  rV   rJ     s   
 rJ   c                      sZ   e Zd Z	dd fddZd fddZd fddZd fddZd fddZ  ZS )rC   Nmodulefx.GraphModule	new_graphfx.Graphrp   rq   r   r   re   r   c                   sD   t  j|fi | || _t| j| _|pi | _t| jdd| _d S )Nreal)r  )ro  rY  r  rJ   r   rp   r$  r  )rX  r  r  rp   r   rq  rU   rV   rY    s
   
z!DecompositionInterpreter.__init__r  ry  r   r2  r3  c                   <   t  |||}t| j|| j}t||d | jd |S NrE  )ro  placeholderr  r&   r  r   r  rX  r  r   r   rS  r   rq  rU   rV   r    s   z$DecompositionInterpreter.placeholderc                   r  r  )ro  r  r  r&   r  r   r  r  rq  rU   rV   r    s   z!DecompositionInterpreter.get_attrc                   sB   t  |||}ddd d fd
d}jt|| |S )Nr^   r   re   r  c                 S  s   | j jS rQ   )r   r   r   rU   rU   rV   get_proxy_node  s   z7DecompositionInterpreter.output.<locals>.get_proxy_noder
  r   Union[Tensor, fx.Node]c                   s   t | j|  S rQ   )r   r   r  r  rX  rU   rV   unwrap  r]  z/DecompositionInterpreter.output.<locals>.unwrap)r^   r   re   r  )r
  r   re   r  )ro  outputr  r[   tree_map)rX  r  r   r   rS  r  rq  r  rV   r     s
   
zDecompositionInterpreter.outputc              	     sv   t | j, | j t j|i |W  d    W  d    S 1 s$w   Y  W d    d S 1 s4w   Y  d S rQ   )rs   rp   r  ro  run)rX  r   r   rq  rU   rV   r    s   RzDecompositionInterpreter.runrQ   )
r  r  r  r  rp   rq   r   r   re   r   )r  ry  r   r2  r   r3  re   r   )r   r   r   r   re   r   )	rw   rx   ry   rY  r  r  r   r  r  rU   rU   rq  rV   rC     s    	
rC   Callable[..., R]0tuple[Callable[[list[object]], R], list[object]]c                   s*   t ||f\}d fdd}||fS )N	flat_argslist[object]re   rP   c                   s   t | \}} |i |S rQ   )r[   rN  )r  Zfn_argsZ	fn_kwargsr#  rQ  rU   rV   r    s   z-wrapper_and_args_for_make_fx.<locals>.wrapped)r  r  re   rP   )r[   rF  )r#  r   r   r  r  rU   r  rV   wrapper_and_args_for_make_fx  s   r  c               	   c  s8    t  } t d zd V  W t |  d S t |  w NF)r   Zis_autocast_cache_enabledZset_autocast_cache_enabled)	old_valuerU   rU   rV   disable_autocast_cache  s   
r  c                   @  rt   )#_ModuleNotInstalledAsSubmoduleErrorNrv   rU   rU   rU   rV   r  &  rz   r  c                   @  s   e Zd Zd
ddZd	S )
_AttrProxybaser-   pathry  re   r   c                 C  r   rQ   rU   rX  r  r  rU   rU   rV   reset_proxy_mapping,  rd  z_AttrProxy.reset_proxy_mappingN)r  r-   r  ry  re   r   )rw   rx   ry   r  rU   rU   rU   rV   r  +  s    r  c                      sj   e Zd ZdZd+ fddZd,ddZd- fddZd. fddZd/d"d#Zd0d&d'Z	d1 fd)d*Z
  ZS )2_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
    
scope_rootr%   re   r   c                   s   t    || _d| _i | _| jjddD ]\}}|| jv r,td| j| | d| _q|| j|< qt | _	t | _
t | _d| _tt| _| jjddD ]\}}| jt| | qM| G  fdddt  | _d S )NF)Zremove_duplicatez<Shared module found between %s and %s, AttrProxy is enabled.Tr   c                      sd   e Zd ZdfddZd fddZdfddZd fddZedfddZ  Z	S )z._ModuleStackTracer.__init__.<locals>.AttrProxyr  Union[Module, _AttrProxy]r  ry  re   r   c                   sr   t |tr	| }t |tsJ t|jj| j|jfi | _|j| _|jj| j_|jj	| j_	| j
| < | j| < d S rQ   )r   r  get_baser-   r   r   rw   __dict__rx   ry   proxy_pathsproxy_modulesr  r   rU   rV   rY  b  s   


z7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__rA  	AttrProxyc                   s@   t | tsJ t |}t |ts|S  |j|  d | S N.)r   r-   ro  __getattr__r  )rX  rA  rz  r  r   r   rU   rV   r  w  s
   
z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__r-   c                   s
    j |  S rQ   )r  rW  r   rU   rV   r    rZ  z7_ModuleStackTracer.__init__.<locals>.AttrProxy.get_baser  Union[int, slice]c                   s   t |trIt | tjjr(tjtt| j | } |j	|   d| S t | tjj
rItj
t| j | } |j	|   d| S t |S r  )r   slicer   r  Z
Sequentialr   rR   _modulesr   r  Z
ModuleListvaluesro  r_  )rX  r  r   r  rU   rV   r_    s   
z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getitem__dict[str, AttrProxy]c                   s@   d j v sJ  j d }t|tsJ  fdd| D S )Nr   c                   s:   i | ]\}}||d ur |j  d t| n|qS r  )r  ry  )r\   r  r   )r  rX  r   rU   rV   r     s    zK_ModuleStackTracer.__init__.<locals>.AttrProxy._modules.<locals>.<dictcomp>)r  r   r   r   )rX  Z
submodulesr  r   rW  rV   r     s   
z7_ModuleStackTracer.__init__.<locals>.AttrProxy._modules)r  r  r  ry  re   r   )rA  ry  re   r  )re   r-   )r  r  re   r  )re   r"  )
rw   rx   ry   rY  r  r  r_  r  r   r  rU   r#  rq  rV   r  a  s    r  )ro  rY  r  enable_attr_proxyZsubmodule_pathsnamed_modulesr   infor   r  attr_proxy_mapr  counterr   rR   Zmodule_id_cacher   r6  r  
proxy_type)rX  r  rA  rr  modrq  r#  rV   rY  C  s.   



Az_ModuleStackTracer.__init__r*  r-   ry  c              
   C  sP   || j u rdS t|tr| j| S zt| |W S  ty' } zt|d}~w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  )rX  r*  r
  rU   rU   rV   r,    s   


z!_ModuleStackTracer.path_of_modulerx  rz  r   r{  r|  c                   st   t |trt |tjs| jst |||S t |tr|S || jvr,| 	||| j|< n	| j| 
|| | j| S rQ   )r   r-   r  r%   r$  ro  r~  r  r'  r)  r  r}  rq  rU   rV   r~    s   



z_ModuleStackTracer.getattrr  r  r  r  r  c                   s~   t  ||}g }| j D ]\}}|| jv r|||f qd	dd}|D ]\}}	|| j| | j|	 }
t|
| j| q&|S )
Nr   r-   r  ry  re   r   c                 S  s   | d}|d d |d }}t| tsJ | }|D ]}t||s% dS t||}t|ttfs4 dS qt||s<dS tt||tsFdS t|| dS )Nr  FT)splitr   r-   r   r~  r  delattr)r   r  Zatomsr  Ztarget_submodr*  rL  rU   rU   rV   _delete_proxy_attr  s"   




z4_ModuleStackTracer.trace.<locals>._delete_proxy_attr)r   r-   r  ry  re   r   )ro  r  r  r%  r  r6  r(   )rX  r  r  r   Z!proxy_module_names_to_be_replacedrA  r  r1  Zproxy_module_nameZproxy_moduleZactual_modulerq  rU   rV   r    s   


z_ModuleStackTracer.tracerr  rs  r   r   r2  r   r3  c                 C  sp   ddl m} t||tfr||i |S z
t| ||||W S  ty7   td| d ||i | Y S w )zlPythonKeyTracer overrides call_module to avoid the scope handling,
        but we actually want it.
        r   )OptimizedModulez&Unable to find the path of the module z. 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._dynamor2  r   r%   r'   rw  r  warningswarn)rX  rr  rs  r   r   r2  rU   rU   rV   rw    s   
	
z_ModuleStackTracer.call_modulemodule_qualified_namer   c                 C  r   r	  rU   )rX  rr  r6  rU   rU   rV   is_leaf_module  rd  z!_ModuleStackTracer.is_leaf_moduler  c           	        s8  t  j|i |}|jdvr;d|jvr| j|jd< |jd  D ]\}\}}t|tr:||jd |j	 f|jd |< q |jdkrf| j
durfd|jvrf| j
j d| j| j
  | j
jj d| j
j f|jd< d|jvr|jdvrt  }|rd	d
 |D }dd
 |D }|rtj|}d|  |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  r   Znn_module_stackr  r   NZtorch_fnrY   stack_tracec                 S  s&   g | ]}|j d ks|jdr|qS )rs  ztorch/__init__.py)rA  filenameendswithr\   framerU   rU   rV   r_   D  s    

z2_ModuleStackTracer.create_node.<locals>.<listcomp>c                 S  s(   g | ]}|j d s|j ds|qS )zfx/_symbolic_trace.pyzexport/_trace.py)r9  r:  r;  rU   rU   rV   r_   N  s    

r+  )ro  r  opr}   Zmodule_stackr   r   r   rx   ry   rp  rw   rm  r   r5   extractsummaryr  StackSummary	from_listrk   formatstrip)	rX  r   r   r   r  ZfqnZmod_clsZuser_frame_summaryr8  rq  rU   rV   r    s<   







	z_ModuleStackTracer.create_node)r  r%   re   r   )r*  r-   re   ry  r  )r  r  r  r  re   r  )
rr  r-   rs  r   r   r2  r   r3  re   r   )rr  r-   r6  ry  re   r   )r   r   r   r   re   r  )rw   rx   ry   rh  rY  r,  r~  r  rw  r7  r  r  rU   rU   rq  rV   r  0  s    
a
2
!r  c                   @  sn   e Zd Zd8ddZd9ddZd:ddZed;d%d&Zd<d)d*Zed=d,d-Z	d>d0d1Z
d?d3d4Zd>d5d6Zd7S )@_MakefxTracerrp   rq   r  ry  _allow_non_fake_inputsr   r1  record_module_stackr5  rO  re   r   c                 C  s~   t |pi | _| jtjjjjtjj	j || _
|| _|| _|| _|| _|| _d | _t | _t | _d | _t | _t | _d S rQ   )r   rp   
setdefaultr   r   r   r   r   _decompZdecompositionsr  rE  r1  rF  r5  rO  r   r   r   proxy_function_mode	fx_tracerpython_dispatcher_modetorch_fn_metadata_mode)rX  rp   r  rE  r1  rF  r5  rO  rU   rU   rV   rY  `  s(   z_MakefxTracer.__init__	list[Any]c                 C  s   | j | j| j| j| j| jgS rQ   r   r   rI  rJ  rK  rL  rW  rU   rU   rV   _checkpoint_modes  s   z_MakefxTracer._checkpoint_modesprev_fake_tensor_modeOptional[FakeTensorMode]prev_proxy_mode*Union[nullcontext, ProxyTorchDispatchMode]prev_proxy_function_mode0Union[nullcontext, PreDispatchTorchFunctionMode]prev_fx_tracerOptional[PythonKeyTracer]prev_python_dispatcher_modeUnion[nullcontext, Any]prev_torch_fn_metadata_mode-Union[nullcontext, TorchFunctionMetadataMode]c                 C  s(   || _ || _|| _|| _|| _|| _d S rQ   rN  )rX  rP  rR  rT  rV  rX  rZ  rU   rU   rV   _restore_modes  s   	
z_MakefxTracer._restore_modesr   r   r   r2  r   c           
      c  s   |   }zddlm} t|dr| jr|j}t|| _nt | _| j	dkrbdd l
}|jj|}|d u r^dd lm  m} |jdd td| j| dd	}W d    n1 sYw   Y  || _nX| j	d
krdd l
}|jj|}|d u r| }	dd lm  m} |jdd td| j|	d}W d    n1 sw   Y  |jd usJ d|| _n| j	dkstd| j	 | | j d V  W | j|  d S | j|  w )Nr9   )ShapeEnv	_orig_modfaker   F)Z(fake_tensor_allow_unsafe_data_ptr_accessT)r   allow_non_fake_inputs	shape_envZstatic_shapessymbolic)r   r`  ra  2shape_env should be set if tracing with 'symbolic'r  zUnexpected tracing type: )rO  r  r]  r   rF  r^  r  rJ  r@   r  r3  Z_dynamoutilsr   Ztorch._functorch.configZ
_functorchr  patchr!   rE  r   ra  AssertionError_construct_modes_with_fx_tracerr\  )
rX  r   r   
prev_modesr]  r  r   r   _configra  rU   rU   rV   _init_modes_from_inputs  s\   



z%_MakefxTracer._init_modes_from_inputsrJ  r   c                 C  sR   t || j| j| j| jd| _| jrt|| _| jdks| jr"t | _	t
|| _d S )N)r1  r5  rO  rb  )r$  r  r1  r5  rO  r   r  rI  r   rK  r  rL  )rX  rJ  rU   rU   rV   rg    s   
z-_MakefxTracer._construct_modes_with_fx_tracerparent_tracerc                 c  sf    |   }z'|j| _ddd}|jd usJ ||j| _| | j d V  W | j|  d S | j|  w )Nrk  r   re   r@   c                 S  s<   t | tkr	t S t | tkrt| jS tdt |  d)NzUnexpected tracer type: r  )r   r@   r  r  r   )rk  rU   rU   rV   _create_sub_fx_tracer  s   
zD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracer)rk  r   re   r@   )rO  r   rJ  rg  r\  )rX  rk  rh  rl  rU   rU   rV   _init_modes_from_parent  s   

z%_MakefxTracer._init_modes_from_parentr   r%   c           
   
     sl  dd l tfdd|}d fdd}ddd}||}|||}tt j}t m}|t	 j
  jr@| j | j | j | j || |t  |t   jd uskJ ztt|| j j jt|d}	W n ty   tddd  fddd  w W d    n1 sw   Y   jdkr jd usJ  jj|	_|	S )Nr   c                   s
    j jjS rQ   )r  Z_symbolic_traceZPHr   )r   rU   rV   rW     r?  z,_MakefxTracer._trace_inner.<locals>.<lambda>r   rM   re   c                   s8   d d
 fdd}dd ||d	}t |j | S )Nr   r^   r   re   c                   s   ddl m} jd usJ |d  }t| tr% d7  jj| |dS t| tu rLjdkrLjj	d us:J djj	j
jj	j| |d d| |d	S t| jr[jjj| S t| trhJ d
|  d| S )Nr   )ConstantSourceinputr9   )sourcerb  rc  )Zpositive)hintrp  zScriptObject z. has been fakified. Cannot wrap_fake it again.)Ztorch._dynamo.sourcern  r   r   r   Zfrom_tensorr   rd   r  ra  Zcreate_symintnodeZcreate_symbolScriptObjectZ_libraryZfake_class_registryZmaybe_to_fake_objr   )r^   rn  rp  )	arg_countrX  r   rU   rV   inner_wrap_fake  s6   

zG_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.inner_wrap_fakec                 S  r   rQ   rU   r   rU   rU   rV   rW   =  r   z@_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.<lambda>r  r_  rb  )r^   r   re   r   )r[   r  r  )r   rt  Zwrap_fn_maprX  r   )rs  rV   
_wrap_fake  s   $z._MakefxTracer._trace_inner.<locals>._wrap_faker   rb   phsSequence[PHBase]c                 S  s6   t t| drt| jjtj@ rt| t|S | S )N__code__)r   inspectr  rz  co_flags
CO_VARARGSro   re  )r   rx  rU   rU   rV   
_wrap_funcC  s   z._MakefxTracer._trace_inner.<locals>._wrap_func)r   r  artifactc                   S  s
   dddS )NZmake_fx_fail_partialstring)rA  encodingrU   rU   rU   rU   rV   rW   m  s   c                     s    j jjdddddjS )NrX  T)Zroot_moduleverboseZinclude_strideZinclude_device)rJ  r-  Zpython_codesrcrU   rW  rU   rV   rW   q  s    )Zmetadata_fnZ
payload_fnrb  )r   rM   re   rM   )r   rb   rx  ry  re   rb   )r3  r[   r  r   r   r$  r   r
   enter_contextrs   rp   r   rK  rI  rL  r  _set_make_fx_tracerrJ  rA   r  r1  rX   	Exceptionr   r  ra  )
rX  r   r   rx  rw  r~  r#  r   stackr  rU   rv  rV   _trace_inner  sP   
-





#
z_MakefxTracer._trace_innerr  c                 G  sB   |  || | j|g|R  W  d    S 1 sw   Y  d S rQ   )rj  r  )rX  r   r   rU   rU   rV   r    s   $z_MakefxTracer.tracec                 G  s`   t | jd| j| j| j| j| j}||  |j|g|R  W  d    S 1 s)w   Y  d S )Nr  )	rD  rp   rE  r1  rF  r5  rO  rm  r  )rX  r   r   Z
sub_tracerrU   rU   rV   trace_subgraph  s   	$z_MakefxTracer.trace_subgraphN)rp   rq   r  ry  rE  r   r1  r   rF  r   r5  r   rO  r   re   r   )re   rM  )rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  re   r   )r   r   r   r2  re   r   )rJ  r   re   r   )rk  rD  re   r   )r   r   r   r   re   r%   )r   r   r   r   re   r  )rw   rx   ry   rY  rO  r\  r	   rj  rg  rm  r  r  r  rU   rU   rU   rV   rD  _  s    

(


:

trD  zOptional[_MakefxTracer]_CURRENT_MAKE_FX_TRACERc                 c  s"    t }z
| a d V  W |a d S |a w rQ   )r  )r   Zprev_tracerrU   rU   rV   r    s   r  r  F)r1  rF  r5  rO  r  ry  rE  rF  r5  rO  Callable[..., GraphModule]c          	        s>   |dv sJ t |||||||t d	 fdd}|S )
z
    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.
    ru  r   r   re   r%   c                    s   j  g| R  S rQ   )r  )r   r   Zmake_fx_tracerrU   rV   r    s   zmake_fx.<locals>.wrappedN)r   r   re   r%   )rD  r   r  )	r   rp   r  rE  r1  rF  r5  rO  r  rU   r  rV   rB     s   
rB   list[TorchDispatchMode]c                   C  s   t jj S rQ   )r   rd  Z_python_dispatchZ _get_current_dispatch_mode_stackrU   rU   rU   rV   get_torch_dispatch_modes  rD  r   Optional[ProxyTorchDispatchMode]c                   C  s   t  S rQ   )rF   rU   rU   rU   rV   rE     s   rE   c                  C  sP   t jt jjj} t jt jjj}| du s$|du s$J d|  d| | p'|S )z
    Current the currently active proxy tracing mode, or None if
    we are not currently tracing.  This includes pre-dispatch proxy
    tracing.
    Nzpre_dispatch_mode=z, mode=)r   r'  Z_get_dispatch_mode_pre_dispatchr  r  r  _get_dispatch_mode)Zpre_dispatch_moder  rU   rU   rV   rF     s   rF   c                 C  sL   t  }|sJ t  g }|| |||W  d   S 1 sw   Y  dS )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)rF   r  r  )r#  r   r   r  r  rU   rU   rV   rG     s   $rG   -Generator[ProxyTorchDispatchMode, None, None]c                   C  s   t tjjjS rQ   )r/   r   r  r  r  rU   rU   rU   rV   r    s   r  r=  c                   s   ddl m}  tv rB|dd fddrtS | ! |  jd7  _t  |i |}|  jd8  _|W  d    S 1 s=w   Y  tS )Nr   )CompilerBisectorZaot_eager_decomp_partitiondecompositionc                     s   t  S rQ   )reprrU   r=  rU   rV   rW     rZ   z%maybe_handle_decomp.<locals>.<lambda>r9   )Z!torch._inductor.compiler_bisectorr  rL   Zdisable_subsystemrI  r%  )r   r=  r   r   r  rS  rU   r  rV   rJ    s    rJ  c                 C  sN   t | ||\}}t  t|||d|}W d   |S 1 s w   Y  |S )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.
    )rp   r  N)r  r  rB   )r#  r   r   r  rp   r  all_argsZgmrU   rU   rV   get_isolated_graphmodule	  s   
r  rS  	out_proxyc                 C  sf   ddl m} tjtjjj}|r-|jr/||j|  }r1t|t	s%J |||j
jd< dS dS dS dS )zOA helper function for setting up unbacked_bindings on the destination FX graph.r9   )compute_unbacked_bindingsZunbacked_bindingsN)r  r  r   r  r  r  ZFAKEra  r   r&   r   r}   )rS  r  r  r   Zsymbol_to_pathrU   rU   rV   r  !	  s   	
r  )ra   rb   rc   rd   re   rb   )rp   rq   re   rr   )r   r|   re   r   )r   r   r   r   r   r   re   r   )r   r   r   r   r   r&   re   r   )r   r{   r   r   r   r   re   r   )r   r   r   r   r   r   re   r   )r   r   r   r   re   r   )r   r   r   r   re   r   )r   r   r   r   r   rN   re   r   )
r   r   r   r   r   rN   r   r   re   r   )r   r   r   r   re   r&   )r   r   r   r   r   rN   re   r   )
r   r   r   r   r   rN   r   r   re   r   )r   r{   r   r   re   r   )r   r{   r   r   r   rM   re   r   )
r   r{   r   r   r   rN   r   r   re   r   )
r   r   r   r   r   r   r   r   re   r   )r   r   re   r   )r   r   re   r   )r   r   r   r   re   r   )re   r   )r   r&   r   r   re   r&   )
r   r   r   rb   r   r   r   r   re   r   )
r   r   r   r&   r   r   r   r   re   r   )
r  rM   r  r  r   r	  r   r   re   rM   )r   r   re   r  )r   r   r  r   re   r  )r   r   r  r   re   r   )r   r   r  r{   re   r!  )r   r   r  r   re   r   )r#  r   r   r$  re   r   )r   r$  r#  r=   r1  r   r   r2  r   r3  re   r   )r  r  re   r  rQ   )r  r  r   r'   r  r  re   r%   )
r   rb   r  r   r   r   r1  r   re   rb   )r#  r=   re   r   )r#  r  r   r2  r   r3  re   r  )r   rD  re   r   )Nr  F)r   r   rp   rq   r  ry  rE  r   r1  r   rF  r   r5  r   rO  r   re   r  )re   r  )re   r  )r#  rb   r   r   r   r   re   rP   )re   r  )
r   r$  r=  r=   r   r2  r   r3  re   r   )r  N)r#  r   r   r2  r   r3  r  ry  rp   rq   re   r%   )rS  r   r  r  re   r   )
__future__r   r   r{  loggingr  r  r   r   r4  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   Z
torch._opsZtorch.fxr  Ztorch.fx.tracebackr  Ztorch.utils._pytreerd  Z_pytreer[   r   r   r   Ztorch._dispatch.pythonr   Z"torch._library.fake_class_registryr   Ztorch._loggingr   Ztorch._subclasses.fake_implsr   Ztorch._subclasses.fake_tensorr    r!   r"   r#   Ztorch._subclasses.meta_utilsr$   r%   r&   r'   Ztorch.fx.graph_moduler(   Ztorch.fx.noder)   r*   r+   Ztorch.fx.passes.shape_propr,   Ztorch.nnr-   r  r.   Ztorch.utils._python_dispatchr/   r0   r1   r2   Ztorch.utils._statsr3   Ztorch.utils._thunkr4   Ztorch.utils._tracebackr5   Ztorch.utils.weakr6   r7   r8   Z_backward_stater:   Zsym_noder;   r  r<   r   r=   Ztorch.fx._symbolic_tracer>   Ztorch.typesr?   __all__r   rr  r   r   r   r   r  	getLoggerrw   r   Z_loggingZgetArtifactLoggerrH  rL   r   rB  rM   rN   rO   rP   r   Znull_ctx_typeZregister_pytree_nodeSizero   rs   r   Z
proxy_slotru   Z
no_defaultrD   r{   r|   r   r   r   r   r   r   rR   rX   r   ry  rd   r   r   r   r   r   rI   rH   r   r   r  r  r  r  r   r  r  r  r  r4  r0  rT  rU  r@   r  Z_disable_dynamorA   r  r  r  r  Z)_temp_remove_metadata_torch_function_moder  Z-_temp_remove_pre_dispatch_torch_function_moder$  r   ZGraphAppendingTracerrJ   ZInterpreterrC   r  r  r-  r  r  r  rD  r  r  rB   r  rE   rF   rG   r  rJ  r  r  rU   rU   rU   rV   <module>   s  (


,		

(IW [t', ' 
7	  1  6$