o
    Hh?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   V/var/www/vscode/kcb/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   )pytreeSequenceKey).0ixrU   rU   rV   
<listcomp>   s    z<lambda>.<locals>.<listcomp>)	enumeraterS   rU   rU   rV   rW      s   z
torch.Size)flatten_with_keys_fn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()rd   )joinrangeeval)rd   rf   argnamesrU   rU   rV   fake_signature   s   rr   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   )rs   old_decomposition_tablerU   rU   rV   	decompose   s   rw   c                   @     e Zd ZdS )
_NoDefaultN__name__
__module____qualname__rU   rU   rU   rV   ry          ry   )rD   	PySymTypec                   @  s   e Zd ZU ded< dS )_HasMetazdict[str, PySymType]metaNr{   r|   r}   __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   ry   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_sparsetorch._guardsr   r!   torchempty_stridedshapestrider   r   rg   floatr   typing_extensions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   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   rh   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atensym_sizerg   r_   r^   r   r   rU   rV   rW         ztrack_tensor.<locals>.<lambda>c                   r   r   )r   r  r   r  r  
sym_striderg   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  sym_storage_offsetr   r   r  rU   rV   rW   ?  s    
)
r   r?   r   r   r   r   r   r   rh   r   )ra   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  rh   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  idxrg   rh   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  rg   rh   r  )r   r   r&   r  r   rD   r   r   r   rX   rR   fxra   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  rh   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   rh   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   	is_numberr   r   r   r   rg   r   rD   r   force)r  nr   rU   rV   inner  s   



zfetch_sym_proxy.<locals>.inner)r  r   rh   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   Tlow_precision_pointwise_barrier)decomp_layersemulate_precision_castsr   r   _opsr=   Tag	pointwisetagsnextiterreversedr   graphnodesr   getr   r   bfloat16float16)r/  r   	last_noder(  rU   rU   rV   _maybe_record_pointwise_barrier  s   rA  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   rh   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   _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   )rJ  rU   rV   rk     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   rk   9      
c                 s  s    | ]}t |tV  qd S rQ   )r   rD   r   rU   rU   rV   rk   @  rl   c                 S      g | ]}t |tr|jn|qS rU   rK  rL  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  rN  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   rR  r   rU   rV   r`   _  s    r   )namec                 s  s$    | ]}t |tr|jd uV  qd S rQ   rK  rL  rU   rU   rV   rk     rM  r(  c                 S  s   |   tkS rQ   )r  CONSTANT_NUMEL_LIMITrP  rU   rU   rV   tensor_numel_in_limit     z)proxy_call.<locals>.tensor_numel_in_limitc                 S  rN  rU   rK  rL  rU   rU   rV   r`     rO  r   r   )r_   r   rh   r   )r(  r   rh   r   )-r[   tree_flattenallnot_implemented_logr   NotImplementedmaybe_handle_decomprA  r   r  r  sizer   r   r  rw   
is_nonzeroitemr   anyr5  data_dependent_outputr7  tree_unflattenr#   _error_on_data_dependent_opstree_all_onlyr   r   
lift_freshlift_fresh_copyr  r;  _target_to_stroverloadpacketr{   r   r  rT  r   r&   r   clonenondeterministic_seededr   )r   r/  rB  r   r   flat_args_kwargsspecr   f_flat_args_kwargsall_constantconst_flat_args_kwargs
const_argsconst_kwargsproxy_flat_args_kwargs
proxy_argsproxy_kwargs	proxy_outoutany_constantr   rU  rU   )rJ  r   r   rI  rV   
proxy_call  s   




 

 


#
$

rx  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
    rh   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   rz  r   )r|  r  r   rU   rU   rV   __setitem__     z_SymNodeDict.__setitem__c                 C  s   | j |j S rQ   r  r|  r  rU   rU   rV   __getitem__  rV  z_SymNodeDict.__getitem__r   c                 C  s   |j | jv S rQ   )r   rz  r  rU   rU   rV   __contains__  rV  z_SymNodeDict.__contains__Nr   Optional[_PySymProxyType]c                 C  s   | j |j|S rQ   )rz  r=  r   )r|  r  r   rU   rU   rV   r=    s   z_SymNodeDict.getr   c                 C  s   t rQ   )NotImplementedErrorr{  rU   rU   rV   __iter__     z_SymNodeDict.__iter__rg   c                 C  s
   t | jS rQ   )lenrz  r{  rU   rU   rV   __len__  r~  z_SymNodeDict.__len__rh   r   )r  r   r   r   rh   r   )r  r   rh   r   )r  r   rh   r   rQ   )r  r   r   r  rh   r   )rh   r   )rh   rg   )r{   r|   r}   __doc__r}  r  r  r  r=  r  r  rU   rU   rU   rV   ry    s    




ry  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   ry  r   dict[sympy.Symbol, object]r   $MutableMapping[Tensor, _ProxyTensor]r   dict[OpOverload, int]torch_fn_countsFr   r   rh   r   c                   sJ   t  jdd t | _t | _td td| _t	 | _
d | _i | _d| _d S )NrU   )autowrap_modulesr   ref_typeF)superr}  r8   r   ry  r   r7   r6   r   r   r   torch_fn_metadatar  r   r{  r   rU   rV   r}    s   
zPythonKeyTracer.__init__mr-   forwardCallable[..., Any]r   tuple[Any, ...]r   dict[str, Any]r   c                 C  s   ||i |S rQ   rU   )r|  r  r  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   r|  r  r  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   _param_constant)r   r   nn	Parameterrootnamed_parameterscreate_nodeget_fresh_qualnamesetattrrD   r   r   r  
create_arg)r|  r  r%  pqualnamer  rU   rV   r    s   

zPythonKeyTracer.create_argr  r   Union[Proxy, Tensor]c                 C  r   rQ   rU   r|  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]rS  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   rh   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_fnarg_kwarg_vals)r   r   rh   r  )r  r  r   r   _higher_order_opstriton_kernel_wrapTritonKernelWrapperFunctionalTritonKernelWrapperMutationr  r   map_aggregater   )r|  r  r  r   r   rS  r  r   r  arg_inp	kwarg_inpr  rU   rV   r  F  s   	
zPythonKeyTracer.create_noder  )
r  r-   r  r  r   r  r   r  rh   r   r  r  r  r   r  r  rh   r   )r  r   rh   r  )r  r   rh   r  )r  r   rh   r  )r  r   rh   r,  )r  rM   rh   r   )NN)r  r  r  r+   r   r  r   r  rS  r  r  r  rh   r  )r{   r|   r}   r   r   r}  r  r  r  r   r  r  __classcell__rU   rU   r  rV   r@     s*   
 



r@   mode_tytype[TorchFunctionMode]CCallable[[], _GeneratorContextManager[Optional[TorchFunctionMode]]]c                   s   t d fdd}|S )Nrh   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   rH  r:  r  )r  r  r0   temp_elementsremoved_modemoder3   r  rU   rV   context_manager_fnl  sJ   








zB_make_temp_remove_mode_context_manager.<locals>.context_manager_fn)rh   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.Noderh   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   rk     s    

z6dispatch_trace.<locals>.impure_pred.<locals>.<genexpr>)	symbolic_shapesr  	is_impurer   r   r=  rD   rY  r   )r%  r  rU   rU   rV   impure_pred  s   
z#dispatch_trace.<locals>.impure_predr   )dedupe_symints)r%  r  rh   r   )traceeliminate_dead_code,torch._inductor.fx_passes.dedupe_symint_usesr  r   r-   r   r{   r  _lazy_graph_module_make_graph_moduler  )r  r   r  r;  r  r  rS  rU   rU   rV   rA     s   

rA   tensorsc                   s0   t \}t d	 fdd}|S )
Nproxiesr   _unusedr   rh   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 )NrW  r(  r   rh   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.  rP  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.  rP  r   rU   rV   rW     s    z+wrap_key.<locals>.wrapped.<locals>.<lambda>r   r&   c                   s   t |   S rQ   )r   r$  rP  r   rU   rV   get_sym_proxy_slot  s   z5wrap_key.<locals>.wrapped.<locals>.get_sym_proxy_slot)r(  r   rh   r  )r(  r   rh   r&   )r[   rX  r  disable_proxy_modes_tracingr   r0  r   tree_map_onlyr   r   rD   )r  r  flat_proxies_proxies_specr  r  rv  r  r   flat_tensorsr  r   rU   rV   wrapped  s   zwrap_key.<locals>.wrapped)r  r   r  r   rh   rP   )r[   rX  r   wraps)r   r  r   rB  _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 )Noriginal_aten)r  fx_tracebackhas_preserved_node_meta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   rh   r   c                 C  s
   || _ d S rQ   r   r|  r   rU   rU   rV   r}    r~  z"TorchFunctionMetadataMode.__init__rU   Nr/  r=   types tuple[torch._C._TensorMeta, ...]r   rC  r   Optional[dict[str, object]]r   c                 C  s:   |pi }|| j _| j j|dd | j j|< ||i |S )Nr   r9   )r   r  r  r=  r|  r/  r  r   r   rU   rU   rV   __torch_function__  s   z,TorchFunctionMetadataMode.__torch_function__r   r   rh   r   rU   N
r/  r=   r  r  r   rC  r   r  rh   r   r{   r|   r}   r}  r	  rU   rU   rU   rV   r    s
    
r  c                   @  r  )PreDispatchTorchFunctionModer   r   rh   r   c                 C  s   || _ g | _d S rQ   )r   enter_autocast_nodesr  rU   rU   rV   r}  	  s   
z%PreDispatchTorchFunctionMode.__init__rU   Nr/  Union[OpOverload, Callable]r  r  r   rC  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   ampautocast_mode_exit_autocastr  popr   r  _enter_autocastrH  _C_set_grad_enabledr   )r|  r/  r  r   r   
enter_noder   rU   rU   rV   r	    s    

z/PreDispatchTorchFunctionMode.__torch_function__r
  r  )
r/  r  r  r  r   rC  r   r  rh   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 )=r0  rh   r   c                 C  r   r   rU   r{  rU   rU   rV   enable_tracing6  r   z%ProxyTorchDispatchMode.enable_tracingFTr   r   tracing_moder  rB  rF  rc  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  DispatchKeyPreDispatchr  r}  r   r  rB  rF  rc  _TorchDispatchModeKeyPROXY	_mode_keyenter_stackr2  torch._inductorr  r3  )r|  r   r  rB  rF  rc  dkr  r  rU   rV   r}  :  s   zProxyTorchDispatchMode.__init__rU   Nr/  r=   r  r  r   rC  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   rx  rB  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!  rH  r  	__enter__)r|  maybe_prev_proxy_moder  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   )r  __exit__r!  r  r0   )r|  r(  r*  r,  bmb_previous_proxy_moder  rU   rV   r/  k  s
   
zProxyTorchDispatchMode.__exit__c                 C  r   r   rU   )clsrU   rU   rV   is_infra_modez  r   z$ProxyTorchDispatchMode.is_infra_moderv  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  r{  rU   rV   rk         
z8ProxyTorchDispatchMode._compute_proxy.<locals>.<genexpr>c                 3  r4  rQ   r5  r  r{  rU   rV   rk     r6  r   )	r  r   rR   rX   r   r  r  r&   r   )r|  r/  r   rv  n_argsn_outp_outrU   r{  rV   _compute_proxy~  s   		
z%ProxyTorchDispatchMode._compute_proxyrD  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   rv  )	operatormulr   rg   rD   r   r   r:  r   )r|  r/  r  r   r   rv  p_out_thunkrU   rU   rV   __sym_dispatch__  s   
	
z'ProxyTorchDispatchMode.__sym_dispatch__)rh   r   )FFT)r   r   r  r  rB  r   rF  r   rc  r   rh   r   r  r  )rh   r   )r(  r)  r*  r+  r,  r-  rh   r.  )r/  r=   r   rC  rv  r   rh   r&   )
r/  r=   r  r  r   rC  r   rD  rh   r   )r{   r|   r}   propertyr  r}  r3   r%  r&  r/  classmethodr3  r:  r>  r  rU   rU   r  rV   r0  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   r  r   z*MutableMapping[PySymType, _PySymProxyType]r   r  r   r  r   zOptional[OpOverload]r  r  r  Fr   r   r;  fx.graph.Graphrh   r   c                   sB   t  | t | _t | _i | _td t	d| _
d | _i | _d S )Nr  )r  r}  weakrefr   r   r8   r   r   r7   r6   r   r  r  )r|  r;  r  rU   rV   r}    s   

z _GraphAppendingTracerEx.__init__)r;  rA  rh   r   )r{   r|   r}   r   r   r}  r  rU   rU   r  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.Graphrs   rt   r   r   rh   r   c                   sD   t  j|fi | || _t| j| _|pi | _t| jdd| _d S )Nreal)r  )r  r}  rE  rJ   r   rs   r0  r  )r|  rC  rE  rs   r   r  rU   rV   r}    s
   
z!DecompositionInterpreter.__init__r  r  r   rC  rD  c                   <   t  |||}t| j|| j}t||d | jd |S NrW  )r  placeholderr  r&   rE  r   r   r|  r  r   r   rv  r   r  rU   rV   rJ    s   z$DecompositionInterpreter.placeholderc                   rH  rI  )r  r  r  r&   rE  r   r   rK  r  rU   rV   r    s   z!DecompositionInterpreter.get_attrc                   sB   t  |||}ddd d fd
d}jt|| |S )Nr_   r   rh   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  rL  r|  rU   rV   unwrap  r  z/DecompositionInterpreter.output.<locals>.unwrap)r_   r   rh   r  )r  r   rh   rM  )r  outputrE  r[   tree_map)r|  r  r   r   rv  rO  r  rN  rV   rP    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   )rw   rs   r  r  run)r|  r   r   r  rU   rV   rR    s   RzDecompositionInterpreter.runrQ   )
rC  rD  rE  rF  rs   rt   r   r   rh   r   )r  r  r   rC  r   rD  rh   r   )r   r   r   r   rh   r   )	r{   r|   r}   r}  rJ  r  rP  rR  r  rU   rU   r  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]rh   rP   c                   s   t | \}} |i |S rQ   )r[   rb  )rU  fn_args	fn_kwargsr/  rl  rU   rV   r    s   z-wrapper_and_args_for_make_fx.<locals>.wrapped)rU  rV  rh   rP   )r[   rX  )r/  r   r   rU  r  rU   rY  rV   wrapper_and_args_for_make_fx  s   rZ  c               	   c  s8    t  } t d zd V  W t |  d S t |  w NF)r   is_autocast_cache_enabledset_autocast_cache_enabled)	old_valuerU   rU   rV   disable_autocast_cache  s   
r_  c                   @  rx   )#_ModuleNotInstalledAsSubmoduleErrorNrz   rU   rU   rU   rV   r`  &  r~   r`  c                   @  s   e Zd Zd
ddZd	S )
_AttrProxybaser-   pathr  rh   r   c                 C  r   rQ   rU   r|  rb  rc  rU   rU   rV   reset_proxy_mapping,  r  z_AttrProxy.reset_proxy_mappingN)rb  r-   rc  r  rh   r   )r{   r|   r}   re  rU   rU   rU   rV   ra  +  s    ra  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%   rh   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)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>.AttrProxyrb  Union[Module, _AttrProxy]rc  r  rh   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   ra  get_baser-   r   r   r{   __dict__r|   r}   proxy_pathsproxy_modulesrd  r   rU   rV   r}  b  s   


z7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__rS  	AttrProxyc                   s@   t | tsJ t |}t |ts|S  |j|  d | S N.)r   r-   r  __getattr__rl  )r|  rS  r  rn  r   r   rU   rV   rq  w  s
   
z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__r-   c                   s
    j |  S rQ   )rm  r{  r   rU   rV   rj    r~  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 ro  )r   slicer   r  
Sequentialr   rR   _modulesr   rl  
ModuleListvaluesr  r  )r|  r  r   rr  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 )Nrv  c                   s:   i | ]\}}||d ur |j  d t| n|qS ro  )rl  r  )r]   r  r   )rn  r|  r   rU   rV   r     s    zK_ModuleStackTracer.__init__.<locals>.AttrProxy._modules.<locals>.<dictcomp>)rk  r   r   r   )r|  
submodulesrn  r   r{  rV   rv    s   
z7_ModuleStackTracer.__init__.<locals>.AttrProxy._modules)rb  ri  rc  r  rh   r   )rS  r  rh   rn  )rh   r-   )r  rs  rh   rn  )rh   ry  )
r{   r|   r}   r}  rq  rj  r  r?  rv  r  rU   r{  r  rV   rn  a  s    rn  )r  r}  rg  enable_attr_proxysubmodule_pathsnamed_modulesr   infor   rl  attr_proxy_maprm  counterr   rR   module_id_cacher   rH  ra  
proxy_type)r|  rg  rS  r  modr  r{  rV   r}  C  s.   



Az_ModuleStackTracer.__init__r  r-   r  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)rg  r   ra  rl  r'   path_of_module	NameErrorr`  )r|  r  r  rU   rU   rV   r    s   


z!_ModuleStackTracer.path_of_moduler  r  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|  r  r  ra  r  r  re  r  r  rU   rV   r    s   



z_ModuleStackTracer.getattrr  r  r  r  rF  c                   s~   t  ||}g }| j D ]\}}|| jv r|||f qd	dd}|D ]\}}	|| j| | j|	 }
t|
| j| q&|S )
Nr   r-   r  r  rh   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 )Nrp  FT)splitr   r-   r   r  ra  delattr)r   r  atomsrc  target_submodr  r_  rU   rU   rV   _delete_proxy_attr  s"   




z4_ModuleStackTracer.trace.<locals>._delete_proxy_attr)r   r-   r  r  rh   r   )r  r  r  r~  rm  rH  r(   )r|  r  r  r   !proxy_module_names_to_be_replacedrS  rC  r  proxy_module_nameproxy_moduleactual_moduler  rU   rV   r    s   


z_ModuleStackTracer.tracer  r  r   r   rC  r   rD  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._dynamor  r   r%   r'   r  r`  warningswarn)r|  r  r  r   r   r  rU   rU   rV   r    s   
	
z_ModuleStackTracer.call_modulemodule_qualified_namer   c                 C  r   r[  rU   )r|  r  r  rU   rU   rV   is_leaf_module  r  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.
        )rJ  rP  nn_module_stackrp  r   Ntorch_fnrY   stack_tracec                 S  s&   g | ]}|j d ks|jdr|qS )r  ztorch/__init__.py)rS  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)r  r  r  rU   rU   rV   r`   N  s    

r  )r  r  opr   module_stackr   r   r   r|   r}   r  r{   r  r   r5   extractsummaryr,  StackSummary	from_listrn   formatstrip)	r|  r   r   r   r  fqnmod_clsuser_frame_summaryr  r  rU   rV   r    s<   







	z_ModuleStackTracer.create_node)rg  r%   rh   r   )r  r-   rh   r  r  )r  r  r  r  rh   rF  )
r  r-   r  r   r   rC  r   rD  rh   r   )r  r-   r  r  rh   r   )r   r   r   r   rh   r  )r{   r|   r}   r  r}  r  r  r  r  r  r  r  rU   rU   r  rV   rf  0  s    
a
2
!rf  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 )@_MakefxTracerrs   rt   r  r  _allow_non_fake_inputsr   rB  record_module_stackrF  rc  rh   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   rs   
setdefaultr   r  r  r
  r   _decompdecompositionsr  r  rB  r  rF  rc  r   r   r   proxy_function_mode	fx_tracerpython_dispatcher_modetorch_fn_metadata_mode)r|  rs   r  r  rB  r  rF  rc  rU   rU   rV   r}  `  s(   z_MakefxTracer.__init__	list[Any]c                 C  s   | j | j| j| j| j| jgS rQ   r   r   r  r  r  r  r{  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   r  )r|  r  r  r  r  r  r  rU   rU   rV   _restore_modes  s   	
z_MakefxTracer._restore_modesr   r   r   rC  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)(fake_tensor_allow_unsafe_data_ptr_accessT)r   allow_non_fake_inputs	shape_envstatic_shapessymbolic)r   r  r  2shape_env should be set if tracing with 'symbolic'rG  zUnexpected tracing type: )r  r  r  r   r  r  rf  r  r@   r  r  _dynamoutilsr   torch._functorch.config
_functorchr  patchr!   r  r   r  AssertionError_construct_modes_with_fx_tracerr  )
r|  r   r   
prev_modesr  rg  r   r   _configr  rU   rU   rV   _init_modes_from_inputs  s\   



z%_MakefxTracer._init_modes_from_inputsr  r   c                 C  sR   t || j| j| j| jd| _| jrt|| _| jdks| jr"t | _	t
|| _d S )N)rB  rF  rc  r  )r0  r  rB  rF  rc  r   r  r  r   r  r  r  )r|  r  rU   rU   rV   r    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 )Nr  r   rh   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: rp  )r   r@   rf  rg  r   )r  rU   rU   rV   _create_sub_fx_tracer  s   
zD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracer)r  r   rh   r@   )r  r   r  r  r  )r|  r  r  r  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  _symbolic_tracePHr   )r   rU   rV   rW     rQ  z,_MakefxTracer._trace_inner.<locals>.<lambda>r   rM   rh   c                   s8   d d
 fdd}dd ||d	}t |j | S )Nr   r_   r   rh   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   )sourcer  r  )positive)hintr  zScriptObject z. has been fakified. Cannot wrap_fake it again.)torch._dynamo.sourcer  r   r   r   from_tensorr   rg   r  r  create_symintnodecreate_symbolScriptObject_libraryfake_class_registrymaybe_to_fake_objr   )r_   r  r  )	arg_countr|  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>rG  r  r  )r_   r   rh   r   )r[   rQ  r  )r   r  wrap_fn_mapr|  r   )r  rV   
_wrap_fake  s   $z._MakefxTracer._trace_inner.<locals>._wrap_faker   re   phsSequence[PHBase]c                 S  s6   t t| drt| jjtj@ rt| t|S | S )N__code__)r   inspectrO  r  co_flags
CO_VARARGSrr   r  )r   r  rU   rU   rV   
_wrap_funcC  s   z._MakefxTracer._trace_inner.<locals>._wrap_func)r   r  artifactc                   S  s
   dddS )Nmake_fx_fail_partialstring)rS  encodingrU   rU   rU   rU   rV   rW   m  s   c                     s    j jjdddddjS )Nr|  T)root_moduleverboseinclude_strideinclude_device)r  r;  python_codesrcrU   r{  rU   rV   rW   q  s    )metadata_fn
payload_fnr  )r   rM   rh   rM   )r   re   r  r  rh   re   )r  r[   rQ  r   r   r0  r   r
   enter_contextrw   rs   r   r  r  r  r_  _set_make_fx_tracerr  rA   r  rB  rX   	Exceptionr   r  r  )
r|  r   r   r  r  r  r/  r   stackr(  rU   r  rV   _trace_inner  sP   
-





#
z_MakefxTracer._trace_innerrD  c                 G  sB   |  || | j|g|R  W  d    S 1 sw   Y  d S rQ   )r  r  )r|  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 )NrG  )	r  rs   r  rB  r  rF  rc  r  r  )r|  r   r   
sub_tracerrU   rU   rV   trace_subgraph  s   	$z_MakefxTracer.trace_subgraphN)rs   rt   r  r  r  r   rB  r   r  r   rF  r   rc  r   rh   r   )rh   r  )r  r  r  r  r  r  r  r  r  r  r  r  rh   r   )r   r   r   rC  rh   r   )r  r   rh   r   )r  r  rh   r   )r   r   r   r   rh   r%   )r   r   r   r   rh   rD  )r{   r|   r}   r}  r  r  r	   r  r  r  r  r  r  rU   rU   rU   rV   r  _  s    

(


:

tr  zOptional[_MakefxTracer]_CURRENT_MAKE_FX_TRACERc                 c  s"    t }z
| a d V  W |a d S |a w rQ   )r	  )r   prev_tracerrU   rU   rV   r    s   r  rG  F)rB  r  rF  rc  r  r  r  r  rF  rc  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.
    r  r   r   rh   r%   c                    s   j  g| R  S rQ   )r  )r   r   make_fx_tracerrU   rV   r    s   zmake_fx.<locals>.wrappedN)r   r   rh   r%   )r  r   r  )	r   rs   r  r  rB  r  rF  rc  r  rU   r  rV   rB     s   
rB   list[TorchDispatchMode]c                   C  s   t jj S rQ   )r   r  _python_dispatch _get_current_dispatch_mode_stackrU   rU   rU   rV   get_torch_dispatch_modes  rV  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   r4  _get_dispatch_mode_pre_dispatchr  r  r  _get_dispatch_mode)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   )CompilerBisectoraot_eager_decomp_partitiondecompositionc                     s   t  S rQ   )reprrU   r  rU   rV   rW     rZ   z%maybe_handle_decomp.<locals>.<lambda>r9   )!torch._inductor.compiler_bisectorr  rL   disable_subsystemr[  r2  )r   r  r   r   r  rv  rU   r  rV   r\    s    r\  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.
    )rs   r  N)rZ  r  rB   )r/  r   r   r  rs   r  all_argsgmrU   rU   rV   get_isolated_graphmodule	  s   
r   rv  	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_bindingsunbacked_bindingsN)r  r"  r   r  r  r  FAKEr  r   r&   r   r   )rv  r!  r"  r   symbol_to_pathrU   rU   rV   r  !	  s   	
r  )rd   re   rf   rg   rh   re   )rs   rt   rh   ru   )r   r   rh   r   )r   r   r   r   r   r   rh   r   )r   r   r   r   r   r&   rh   r   )r   r   r   r   r   r   rh   r   )r   r   r   r   r   r   rh   r   )r   r   r   r   rh   r   )r   r   r   r   rh   r   )r   r   r   r   r   rN   rh   r   )
r   r   r   r   r   rN   r   r   rh   r   )r   r   r   r   rh   r&   )r   r   r   r   r   rN   rh   r   )
r   r   r   r   r   rN   r   r   rh   r   )r   r   r   r   rh   r   )r   r   r   r   r   rM   rh   r   )
r   r   r   r   r   rN   r   r   rh   r   )
r   r   r   r   r   r   r   r   rh   r   )r   r   rh   r   )r   r   rh   r   )r   r   r   r   rh   r   )rh   r   )r   r&   r   r   rh   r&   )
r   r   r   re   r   r   r   r   rh   r   )
r   r   r   r&   r   r   r   r   rh   r   )
r  rM   r  r  r   r  r   r   rh   rM   )r   r   rh   r!  )r   r   r(  r   rh   r)  )r   r   r(  r   rh   r,  )r   r   r(  r   rh   r-  )r   r   r(  r   rh   r   )r/  r   r   r0  rh   r   )r   r0  r/  r=   rB  r   r   rC  r   rD  rh   r   )r  r  rh   r  rQ   )r  r  r   r'   r  r  rh   r%   )
r   re   r  r   r   r   rB  r   rh   re   )r/  r=   rh   r   )r/  rS  r   rC  r   rD  rh   rT  )r   r  rh   r   )NrG  F)r   r   rs   rt   r  r  r  r   rB  r   r  r   rF  r   rc  r   rh   r  )rh   r  )rh   r  )r/  re   r   r   r   r   rh   rP   )rh   r  )
r   r0  r  r=   r   rC  r   rD  rh   r   )rG  N)r/  r   r   rC  r   rD  r  r  rs   rt   rh   r%   )rv  r   r!  r  rh   r   )
__future__r   r   r  loggingr;  r,  r   r   r  rB  collectionsr   r   collections.abcr   r   r   
contextlibr   r	   r
   r   dataclassesr   r   r   r   r   r   r   r   r   r   r   r   r   r   
torch._opstorch.fxr  torch.fx.tracebackr  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.nnr-   r  r.   torch.utils._python_dispatchr/   r0   r1   r2   torch.utils._statsr3   torch.utils._thunkr4   torch.utils._tracebackr5   torch.utils.weakr6   r7   r8   _backward_stater:   sym_noder;   r  r<   r   r=   torch.fx._symbolic_tracer>   torch.typesr?   __all__r   r  r   r   r  r  r$  	getLoggerr{   r   _logginggetArtifactLoggerrZ  rL   r   rT  rM   rN   rO   rP   r   null_ctx_typeregister_pytree_nodeSizerr   rw   r   
proxy_slotry   
no_defaultrD   r   r   r   r   r   r   r   r   rR   rX   r   r  rg   r   r   r   r   r   rI   rH   r   r   r  r  r  r   r   r'  r+  r  r  rE  rA  rx  ry  r@   r  _disable_dynamorA   r  r  r  r  )_temp_remove_metadata_torch_function_moder  -_temp_remove_pre_dispatch_torch_function_moder0  r   GraphAppendingTracerrJ   InterpreterrC   rZ  r_  r  r`  ra  rf  r  r	  r  rB   r  rE   rF   rG   r  r\  r   r  rU   rU   rU   rV   <module>   s  (


,		

(IW [t', ' 
7	  1  6$