U
    yh?                     @   s  U d dl Z d dlZd dlmZmZmZmZmZmZm	Z	 d dl
Z
d dlm  mZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	l m!Z! d d
l"m#Z# d dl m$Z$m%Z% d dl&Z&d dl'm(Z( d dlZd dl)Z)d dl*Z*d dl+m,Z, d dl-m.Z. d dl/Z/d dl0m1Z1 d dl2Z2d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? d dlm@Z@ d dlAm  m*ZB d dl
mCZCmDZDmEZE d dlFmGZGmHZHmIZI ddddddgZJe
jKjLZLe
jKjMZMe/NeOZPe
jQReOdZSi aTee
jUjVef eWd < dZXeYe%ZZej[e
j\d!d" d#d" d$d" d% d&d' Z]e$d(d) Z^e_ Z`e_ ZaeCeDeEfZbd*d+ Zcd,d- Zdd.d/ Zeead0d" fd1d2Zfd3d4 Zgd5d6 Zhd7d8 Zid9d: Zjd;d< Zkd=d> Zld?d@ Zme(G dAdB dBZndCdD ZodEdF Zpe
jqe
jrjsefZtdGdH ZuG dIdJ dJZvG dKd deZwe$dLdM Zxe
jyd}e	e
jrjzef eeeedNf  edOdPdZ{e|dQdRdSZ}da~e$dTdU ZG dVdW dWe4ZG dXdY dYe4ZG dZd[ d[e6ZG d\d] d]e?ZG d^d de
jjZd_d` Ze$dadb ZG dcdd ddeZG dedf dfewZG dgdh dhZdaee eWdi< e$eddjdkdlZd~dndndndodpdqdZdrds Zdtd Ze j$dudv Zdwdx ZddydzZd{d| ZdS )    N)AnyCallableDictListOptionalTupleUnion)TracerGraphModule)_assign_attr)WeakKeyDictionary)defaultdict)
FakeTensorFakeTensorModeunset_fake_temporarilyis_fake)enable_python_dispatcher)1_side_effectful_need_to_be_preserved_pre_dispatch)_extract_tensor_metadata)contextmanagernullcontext)	dataclass)count)CapturedTraceback)FakeScriptObject)TorchFunctionMode)TorchDispatchMode_disable_infra_mode
_push_mode_unset_infra_mode   )BackwardState)SymNode)SymDispatchMode)Proxy)SymIntSymFloatSymBool)WeakTensorKeyDictionaryWeakIdKeyDictionary_WeakHashRefPythonKeyTracerdispatch_tracemake_fxDecompositionInterpreterpy_sym_typesget_innermost_proxy_modenot_implementedCURRENT_DECOMPOSITION_TABLEc                 C   s   t | d fS N)listxs r7   T/var/www/html/venv/lib/python3.8/site-packages/torch/fx/experimental/proxy_tensor.py<lambda>D       r9   c                 C   s   t | S r3   )tuple)r6   _r7   r7   r8   r9   E   r:   c                 C   s   dd t | D d fS )Nc                 S   s   g | ]\}}t ||fqS r7   )pytreeZSequenceKey).0ixr7   r7   r8   
<listcomp>G   s     z<lambda>.<locals>.<listcomp>)	enumerater5   r7   r7   r8   r9   F   s    )Zflatten_with_keys_fnc                 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 )argNr7   )r>   r?   r7   r7   r8   	<genexpr>M   s     z!fake_signature.<locals>.<genexpr>zlambda z: fn()fn)joinrangeeval)rG   nargsargnamesr7   r7   r8   fake_signatureK   s    rM   c                 c   s   t }| a z
t V  W 5 |a X d S r3   )r2   )decomposition_tableZold_decomposition_tabler7   r7   r8   	decomposeP   s
    
rO   c                 C   s,   t | dstdd| jko*t| jd tS )Nmetaz3All nodes traced with proxy_tensor should have metaval)hasattrAssertionErrorrP   
isinstancer/   )noder7   r7   r8   is_sym_node`   s    rV   c                 C   sb   t | tjr||j| < nFt | tjtfr4||j| < n*t | tsJtt	| | |j
kr^||j
| < d S r3   )rT   torchTensortensor_trackerScriptObjectr   script_object_trackerr/   rS   typesymnode_tracker)objtracerproxyr7   r7   r8   set_proxy_slotd   s    
ra   c                 C   s.   t | tjtfstt| t| |ddd S )NFc                 S   s   dS NTr7   r<   r7   r7   r8   r9   y   r:   z has_proxy_slot.<locals>.<lambda>)rT   rW   rX   r"   rS   r\   get_proxy_slot)r^   r_   r7   r7   r8   has_proxy_slotw   s    re   c                 C   s   | S r3   r7   r@   r7   r7   r8   r9   ~   r:   c                 C   sz   t | tjr|j}n4t | tjtfr,|j}nt | tsBtt	| |j
}| |krn|tkrjt|  d| |S |||  S )Nz is not tracked with proxy for )rT   rW   rX   rY   rZ   r   r[   r/   rS   r\   r]   
no_defaultRuntimeError)r^   r_   defaultZ	transformtrackerr7   r7   r8   rd   ~   s    rd   c                 C   s   |   S r3   )detach)rQ   r7   r7   r8   snapshot_fake   s    rl   c              
   C   s   t | rt| S t| tr| S t| tjtfr2| S t| tr@| S t| tt	frb| 
dd | D S t| tjr| jstdd}|* tj| j|  | j| jdW  5 Q R  S Q R X qd S nt| tttfr| S d S )Nc                 S   s   g | ]}t |qS r7   )extract_valr>   r@   r7   r7   r8   rA      s     zextract_val.<locals>.<listcomp>T)allow_fallback_kernels)devicedtype)r   rl   rT   r/   rW   rZ   r   r!   r4   r;   	__class__rX   	is_sparser   Zempty_stridedshapestriderp   rq   intfloatbool)rQ   fake_tensor_moder7   r7   r8   rm      s$    


0rm   c                 C   sP   t || jjd< t|r*t|| jjd< n"t|tjrL|jsLt|| jjd< | S )NrQ   Ztensor_meta)	rm   rU   rP   r   r   rT   rW   rX   rs   )r`   rQ   r7   r7   r8   set_meta   s    rz   c                 O   s   t dt j| f||S )zT
    Delays computation of f until it's called again
    Also caches the result
    r    )	functools	lru_cachepartial)fargskwargsr7   r7   r8   thunkify   s    r   c                   s   fdd}t | jD ]\}}|| fdd| qt |  D ]\}}|| fdd| qB||   fdd ||   fdd t| t | d S )Nc                    s2   t |stt| tr.t|  t|| f|  d S r3   )callablerS   rT   r%   ra   r   )Zouter_sZproxy_callabler   r_   r7   r8   try_set_proxy_slot   s    
z(track_tensor.<locals>.try_set_proxy_slotc                    s"   t dtjjjj |fi | S Ncall_function)rz   create_proxyrW   opsatenZsym_sizerv   r@   r?   r`   r_   r7   r8   r9      s    ztrack_tensor.<locals>.<lambda>c                    s"   t dtjjjj |fi | S r   )rz   r   rW   r   r   Z
sym_striderv   r   r   r7   r8   r9      s    c                    s    t dtjjjj fi | S r   )rz   r   rW   r   r   	sym_numelri   rf   r   r7   r8   r9      s    c                    s   t dtjjjj f| S r   )rz   r   rW   r   r   Zsym_storage_offsetri   rf   r   r7   r8   r9      s    )rB   rt   ru   numelstorage_offsetra   _ProxyTensor)Ztensorr`   constantr_   r   r?   sr7   r   r8   track_tensor   s    	r   c                   s6   t | | fdd fdd| |  | S )Nc                    s<  t | tjr*t|  |d t |  nt | trTt |  t|  fdd nt | tjtfr|t|   t |  nt | t	t
frt  tjrt |  t| D ]\}}| | | qnpt | tr|d kstt  tjrt |  |  D ]\}}| | d  qnt | tr8t |   | _n d S )N)r_   r   c                      s    S r3   r7   r7   r`   r7   r8   r9      r:   z<track_tensor_tree.<locals>.wrap_with_proxy.<locals>.<lambda>)rT   rW   rX   r   rz   r/   ra   rZ   r   r;   r4   fxr$   rB   dictrS   itemsr!   r`   )er`   r   idxeekeyrQ   )get_constantr_   wrap_with_proxyr   r8   r      s0    




z*track_tensor_tree.<locals>.wrap_with_proxyc                    s    d krd S  |  S d S r3   r7   )r   )r   r7   r8   r     s    z'track_tensor_tree.<locals>.get_constant)_set_unbacked_bindings)Z	inner_resZ	proxy_resr   r_   r7   )r   r   r_   r   r8   track_tensor_tree   s
    
(r   c                   C   s   t  S r3   )r   r7   r7   r7   r8   maybe_disable_fake_tensor_mode  s    r   c                   @   s$   e Zd ZU eed< eej ed< dS )r   r`   r   N)__name__
__module____qualname__r$   __annotations__r   rW   rX   r7   r7   r7   r8   r     s   
r   c                    s    fdd}|S )Nc                    sh   | j }|jd k	r|jS | j jjrXt| tr6t| j jS t| trLt| j jS t	| j jS t
|   S d S r3   )rU   r   exprZ	is_numberrT   r'   rx   r%   rv   rw   rd   )r   nr   r7   r8   inner  s    



zfetch_sym_proxy.<locals>.innerr7   )r_   r   r7   r   r8   fetch_sym_proxy  s    r   c                    s    fddS )Nc                    s   t |  | S r3   rd   tr   r7   r8   r9   .  r:   z$fetch_object_proxy.<locals>.<lambda>r7   r   r7   r   r8   fetch_object_proxy-  s    r   c              
      sL  g t ||f\}}fdd t fdd|D sJtd tS t|||}|tk	rd|S |s|tjj	j
jtjj	jjtjj	jjfkr* |j||}|tk	r|W  5 Q R  S W 5 Q R X jfdd|D }tdd |D  otd	d |D  }	tjj|jkr|	r\d
d |D }
t |
|\}}t  |||W  5 Q R  S Q R X jrt tjdd ||frtd| ddd |D }fdd|D }t ||\}}|tjj	jjkrtjj	jj}jjd|||jj|jj d}|jj d dkrf|jj d dkrft!|d t"r\t#|d D ]\}}|d | |_$q@n
||d _$|||}tdd |D }d }|tjj	jjkr|% t&krt  |d ' }W 5 Q R X nrtjj(|jkr4|	r4|r4t tjdd |r4t . dd |D }
t |
|\}}|||}W 5 Q R X nd }t)|||d |S )Nc                    sJ   t | tkpt|  j} jr4|p2t | tjjfk}|sFt |  |S r3   )	r\   HANDLED_TYPESre   r_   _allow_fake_constantrW   Z_subclassesr   append)r@   r)
proxy_modeunrecognized_typesr7   r8   can_handle_tensor6  s    z%proxy_call.<locals>.can_handle_tensorc                 3   s"   | ]}t |tjr |V  qd S r3   )rT   rW   rX   rn   )r   r7   r8   rE   @  s     zproxy_call.<locals>.<genexpr>zEProxyTensorMode tensors without proxy had unrecognized subclasses: %sc                    s0   g | ](}t |tjtjtfr(t |n|qS r7   )rT   rW   rX   rZ   r   r   rn   r   r7   r8   rA   Y  s   zproxy_call.<locals>.<listcomp>c                 s   s"   | ]}t |tr|jd kV  qd S r3   rT   r   r   r>   r   r7   r7   r8   rE   f  s   
c                 s   s   | ]}t |tttfV  qd S r3   )rT   r%   r&   r'   rn   r7   r7   r8   rE   m  s    c                 S   s    g | ]}t |tr|jn|qS r7   r   r   r7   r7   r8   rA   u  s   c                 S   s
   t |  S r3   )r   r   r7   r7   r8   r9     r:   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   s    g | ]}t |tr|jn|qS r7   )rT   r   r`   r>   r   r7   r7   r8   rA     s    c                    s.   g | ]&}t |tttfr&t j|n|qS r7   )rT   r%   r&   r'   r   r_   r   )r   r7   r8   rA     s   r   )namer<   r   c                 s   s"   | ]}t |tr|jd k	V  qd S r3   r   r   r7   r7   r8   rE     s   
c                 S   s   |   tkS r3   )r   CONSTANT_NUMEL_LIMITr   r7   r7   r8   r9      r:   c                 S   s    g | ]}t |tr|jn|qS r7   r   r   r7   r7   r8   rA     s   r   r_   )*r=   tree_flattenallnot_implemented_logdebugNotImplementedmaybe_handle_decomprW   r   r   sizeri   ru   r   rO   r_   anyTagZdata_dependent_outputtagstree_unflattenr   _error_on_data_dependent_opsZtree_all_onlyrX   rh   Z
lift_freshZlift_fresh_copyr   graphZ_target_to_strZoverloadpacketr   rT   r   rB   r`   r   r   cloneZnondeterministic_seededr   )r   funcpre_dispatchr   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_outr?   aoutZany_constantr   r7   )r   r   r_   r   r8   
proxy_call2  s    




   

#


  	 r   c                   @   sV   e Zd ZdZdd ZeedddZeddd	Zedd
dZ	deedddZ
dS )_SymNodeDictzM
    Wrapper around a dictionary that will hash SymInts with their nodes
    c                 C   s
   i | _ d S r3   )sym_node_dictselfr7   r7   r8   __init__  s    z_SymNodeDict.__init__)r   valuec                 C   s   || j |j< d S r3   r   rU   )r   r   r   r7   r7   r8   __setitem__  s    z_SymNodeDict.__setitem__)r   c                 C   s   | j |j S r3   r   r   r   r7   r7   r8   __getitem__  s    z_SymNodeDict.__getitem__c                 C   s   |j | jkS r3   )rU   r   r   r7   r7   r8   __contains__   s    z_SymNodeDict.__contains__N)r   ri   c                 C   s   | j |j|S r3   )r   getrU   )r   r   ri   r7   r7   r8   r   #  s    z_SymNodeDict.get)N)r   r   r   __doc__r   r/   r   r   r   r   r   r7   r7   r7   r8   r     s   r   c                       sp   e Zd Z fddZejjedef e	edf e
eef edddZdd Zed	 fd
dZdd Z  ZS )r+   c                    s<   t  jdd t | _t | _td td| _d | _	i | _
d S )Nr7   )Zautowrap_modules)r   Zref_type)superr   r(   rY   r   r]   r)   r*   r[   torch_fn_metadatatorch_fn_countsr   rr   r7   r8   r   '  s    zPythonKeyTracer.__init__.)mforwardr   r   returnc                 C   s
   |||S r3   r7   )r   r   r   r   r   r7   r7   r8   call_module6  s    zPythonKeyTracer.call_modulec                 C   s   |S r3   r7   r   attrattr_valZparameter_proxy_cacher7   r7   r8   getattr<  s    zPythonKeyTracer.getattr)r   c                    s   t |tjjrn| j D ]$\}}||kr| d|di   S qd }|s^| d}t| j|| | d|di S t |t	t
tfr|jjd k	st|jjS t |S )Nget_attrr7   Z_param_constant)rT   rW   nn	ParameterrootZnamed_parameterscreate_nodeZget_fresh_qualnamesetattrr%   r&   r'   rU   r   rS   r   
create_arg)r   r   r   pqualnamer   r7   r8   r   ?  s    
zPythonKeyTracer.create_argc                 C   sj   t |tjrt|| |dd S t |tjtjtjfrFt|| |dd S t |tjtfrbt|| |S |S d S )Nc                 S   s   | j S r3   r   r   r7   r7   r8   r9   R  r:   z.PythonKeyTracer.unwrap_proxy.<locals>.<lambda>c                 S   s   |  S r3   r7   r   r7   r7   r8   r9   T  r:   )	rT   rW   rX   rd   r%   r&   r'   rZ   r   )r   r   r7   r7   r8   unwrap_proxyP  s    zPythonKeyTracer.unwrap_proxy)r   r   r   r   rW   r   Moduler   r   r   r   strr   r   r   r   __classcell__r7   r7   r   r8   r+   &  s    
 
 
c               	   c   s   ddl m} m}m} g }d }|  dkrJ| }t|tr>|}qJq|| qt|D ]}|| qRz
d V  W 5 |d k	rt|}|dkr| }|d8 }q||| t|D ]}|| qX d S )Nr   )_len_torch_function_stack	_pop_moder   r    )	torch.overridesr   r   r   rT   PreDispatchTorchFunctionModer   reversedlen)r   r   r   Ztemp_elementsZpre_dispatch_modemoder   r7   r7   r8   -_temp_remove_pre_dispatch_torch_function_mode[  s*    





r   .)r   r_   concrete_argsr   c                 C   sN   | | |}ddlm} || t| tjjr6| jjn| j}t	j
|j||S )Nr   )dedupe_symints)traceZ,torch._inductor.fx_passes.dedupe_symint_usesr   rT   rW   r   r   rr   r   r   Z_lazy_graph_moduleZ_make_graph_moduler   )r   r_   r   r   r   r   r7   r7   r8   r,   |  s
    )r   c                    s.   t \}t  fdd}|S )Nc               	      s   t | \}}t|tks"tt $}t|ts8tt|d d W 5 Q R X   }t t	j
fdd|}t t	jtffdd|}t tttffdd|}|S )Nr   c                    s   t |  | dd S )Nc                 S   s   | j S r3   r   rf   r7   r7   r8   r9     r:   =wrap_key.<locals>.wrapped.<locals>.<lambda>.<locals>.<lambda>r   r   r   r7   r8   r9     r:   z+wrap_key.<locals>.wrapped.<locals>.<lambda>c                    s   t |  | dd S )Nc                 S   s   | S r3   r7   rf   r7   r7   r8   r9     r:   r  r   r   r   r7   r8   r9     r:   c                    s   t |   S r3   r   r   r   r7   r8   r9     r:   )r=   r   r   rS   disable_proxy_modes_tracingrT   ProxyTorchDispatchModer   Ztree_map_onlyrW   rX   rZ   r   r%   r&   r'   )proxiesZflat_proxiesZproxies_specr   r   r~   Zflat_tensorstensorsr_   r7   r8   wrapped  s,    


zwrap_key.<locals>.wrapped)r=   r   r{   wraps)r~   r  r_   r   Ztensors_specr  r7   r  r8   wrap_key  s    r	  c              	   c   sF   t d kr<t r<| a | tjd< z
d V  W 5 d a d tjd< X nd V  d S )NZoriginal_aten)ORIGINAL_ATENfx_tracebackZhas_preserved_node_metaZcurrent_meta)r   r7   r7   r8   set_original_aten_op  s    

r  c                   @   s   e Zd Zdd ZdddZdS )TorchFunctionMetadataModec                 C   s
   || _ d S r3   r   r   r_   r7   r7   r8   r     s    z"TorchFunctionMetadataMode.__init__r7   Nc                 C   s6   |pi }|| j _| j j|dd | j j|< |||S )Nr   r    )r_   r   r   r   r   r   typesr   r   r7   r7   r8   __torch_function__  s    z,TorchFunctionMetadataMode.__torch_function__)r7   Nr   r   r   r   r  r7   r7   r7   r8   r    s   r  c                   @   s   e Zd Zdd ZdddZdS )r   c                 C   s
   || _ d S r3   r   r  r7   r7   r8   r     s    z%PreDispatchTorchFunctionMode.__init__r7   Nc                 C   sF   |pi }|t kr<| jd||i }|tjjkr8d |jd< |S |||S )Nr   rQ   )r   r_   r   rW   _CZ_set_grad_enabledrP   )r   r   r  r   r   rU   r7   r7   r8   r    s    
z/PreDispatchTorchFunctionMode.__torch_function__)r7   Nr  r7   r7   r7   r8   r     s   r   c                       sN   e Zd Zd fdd	ZedddZ fd	d
Z fddZdddZ  Z	S )r  FTc                    sn   |rt jjjnd }t | || _|| _d| _|| _	|| _
|| _t|| _i | _g | _t jjj| _g | _d S rb   )rW   r  ZDispatchKeyZPreDispatchr   r   r_   tracing_modeenable_tracingr   r   r   ProxySymDispatchModesym_modeZtrace_state	_managers_TorchDispatchModeKeyPROXYZ	_mode_keyenter_stack)r   r_   r  r   r   r   Zdkr   r7   r8   r     s    
zProxyTorchDispatchMode.__init__r7   Nc                 C   sT   | j d> t|* | ||||W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S NF)r  enabler  inner_torch_dispatchr  r7   r7   r8   __torch_dispatch__  s    z)ProxyTorchDispatchMode.__torch_dispatch__c                    sD   | j d}| j| |  ttjjj	}| j
| t  S rb   )r  r  r  r   	__enter__r   rW   r  r  r  r  r   )r   r   Zmaybe_prev_proxy_moder   r7   r8   r     s    z ProxyTorchDispatchMode.__enter__c                    sX   | j  }t |||}| j }|d k	r4t| |sF||||S |d d d S d S r3   )r  popr   __exit__r  r   )r   exc_type	exc_value	tracebackr   bZmb_previous_proxy_moder   r7   r8   r"    s    

zProxyTorchDispatchMode.__exit__c                 C   s:   | j s|||S |tjjfkr(|||S t| || j||S r3   )r  primrp   ri   r   r   r  r7   r7   r8   r    s
    

z+ProxyTorchDispatchMode.inner_torch_dispatch)FFT)r7   N)r7   N)
r   r   r   r   r   r  r   r"  r  r   r7   r7   r   r8   r    s   
r  c                       sH   e Zd Z fddZedd Zeeee	f dddZ
dd	 Z  ZS )
r  c                    s   t    || _d| _d S rb   )r   r   r_   r  r  r   r7   r8   r     s    
zProxySymDispatchMode.__init__c                 c   s$   | j }|| _ z
d V  W 5 || _ X d S r3   )r  )r   r&  oldr7   r7   r8   r  "  s
    
zProxySymDispatchMode.enable)r   c                    sD   t  fdd|D } jd||i }t| j}t|| |S )Nc                 3   s,   | ]$}t |tr t| j jn|V  qd S r3   )rT   r/   rd   r_   rU   )r>   r   r   r7   r8   rE   ,  s   z6ProxySymDispatchMode._compute_proxy.<locals>.<genexpr>r   )r;   r_   r   r   r$   rz   )r   r   r   r   Zn_argsZn_outZp_outr7   r   r8   _compute_proxy+  s    
z#ProxySymDispatchMode._compute_proxyc                 C   s   | j s|||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 |rft|||}t|trt| j|||d}t	|| j
| |S )Nr    r   )r   r   r   )r  operatormulrT   rv   rS   r/   r   r)  ra   r_   )r   r   r  r   r   r   Zp_out_thunkr7   r7   r8   __sym_dispatch__8  s    



z%ProxySymDispatchMode.__sym_dispatch__)r   r   r   r   r   r  r   r%   r&   r'   r)  r,  r   r7   r7   r   r8   r    s
   
r  c                       s^   e Zd Zdejjejjd fddZ fddZ fddZ	 fd	d
Z
 fddZ  ZS )r.   N)module	new_graphc                    sx   t  j|f| || _tjj| j| _t | j_	t
 | j_|| _| jd krTi | _t| jdd| _d | j_i | j_d S )Nrealr  )r   r   r.  rW   r   r`   ZGraphAppendingTracerr_   r(   rY   weakrefr   r]   rN   r  r   r   r   )r   r-  r.  rN   r   r   r7   r8   r   Y  s    

z!DecompositionInterpreter.__init__c                    s>   t  |||}tj| j|| j}t||d | jd |S Nr   )r   placeholderrW   r   r$   r.  r_   r   r   targetr   r   r   r`   r   r7   r8   r3  k  s    z$DecompositionInterpreter.placeholderc                    s>   t  |||}tj| j|| j}t||d | jd |S r2  )r   r   rW   r   r$   r.  r_   r   r4  r   r7   r8   r   r  s    z!DecompositionInterpreter.get_attrc                    s4   t  |||} fdd} jt|| |S )Nc                    s   t |  j| dd S )Nc                 S   s   | j jS r3   )r`   rU   rf   r7   r7   r8   r9   ~  r:   zADecompositionInterpreter.output.<locals>.unwrap.<locals>.<lambda>)rd   r_   r   r   r7   r8   unwrap}  s    z/DecompositionInterpreter.output.<locals>.unwrap)r   outputr.  r=   tree_map)r   r5  r   r   r   r6  r   r   r8   r7  z  s    zDecompositionInterpreter.outputc                    sN   t | j: | j( t j||W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S r3   )rO   rN   r   r   run)r   r   r   r   r7   r8   r9    s    zDecompositionInterpreter.run)N)r   r   r   rW   r   r
   ZGraphr   r3  r   r7  r9  r   r7   r7   r   r8   r.   X  s
   c                    s(   t ||f\} fdd}||fS )Nc                    s   t | \}} ||S r3   )r=   r   )	flat_argsZfn_argsZ	fn_kwargsr   r   r7   r8   r    s    z-wrapper_and_args_for_make_fx.<locals>.wrapped)r=   r   )r   r   r   r:  r  r7   r;  r8   wrapper_and_args_for_make_fx  s    r<  c               	   c   s.   t  } t d z
d V  W 5 t |  X d S r  )rW   Zis_autocast_cache_enabledZset_autocast_cache_enabled)	old_valuer7   r7   r8   disable_autocast_cache  s
    

r>  c                   @   s   e Zd ZdS )#_ModuleNotInstalledAsSubmoduleErrorN)r   r   r   r7   r7   r7   r8   r?    s   r?  c                       sh   e Zd ZdZ fddZejjedddZ	 fddZ
 fd	d
Zdd Zdd Z fddZ  ZS )_ModuleStackTracera  Customized version of PythonKeyTracer that retains module stack
    information in node.meta["nn_module_stack"].

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

    So for this version we hold onto a reference to the original module
    (scope_root) and use that to match the path. Also when we see,
            A
           / \
          B   C
           \ /
            D
    we want to record the path as A.B.D by recording only one path.
    See Note [Preserving the nn module stack metadata during export non-strict mode]  # noqa: W605
    c                    s~   t    || _t | _t | _d| _tt| _	| jj
ddD ]\}}| j	t| | q>| G  fddd  | _d S )Nr   F)Zremove_duplicatec                       s>   e Zd ZfddZ fddZefddZ  ZS )z._ModuleStackTracer.__init__.<locals>.AttrProxyc                    sR   t |jj| j|jfi | _|j| _|jj| j_|jj| j_| j| < | j| < d S r3   )r\   rr   r   __dict__r   r   proxy_pathsproxy_modules)r   basepath)self_r7   r8   r     s    

z7_ModuleStackTracer.__init__.<locals>.AttrProxy.__init__c                    s^   t | tjjstt |}t | r4j| }nt |tjjsF|S  |j|  d | S )N.)	rT   rW   r   r   rS   r   __getattr__rC  rB  )r   r   r   )	AttrProxyrr   rF  r7   r8   rH    s    
z:_ModuleStackTracer.__init__.<locals>.AttrProxy.__getattr__c                    s@   d j kst j d }t|ts&t fdd| D S )N_modulesc                    s.   i | ]&\}}| |j  d  t| qS )rG  )rB  r   )r>   r   r   )rI  r   rF  r7   r8   
<dictcomp>  s    zK_ModuleStackTracer.__init__.<locals>.AttrProxy._modules.<locals>.<dictcomp>)rA  rS   rT   r   r   )r   Z
submodulesrI  rF  r   r8   rJ    s    
z7_ModuleStackTracer.__init__.<locals>.AttrProxy._modules)r   r   r   r   rH  propertyrJ  r   r7   rL  r   r8   rI    s   	rI  )r   r   
scope_rootr   rB  rC  counterr   r4   Zmodule_id_cachenamed_modulesidr   
proxy_type)r   rN  r   modr   rL  r8   r     s    

 z_ModuleStackTracer.__init__)rS  r   c              
   C   s`   || j krdS t|| jr$| j| S zt| |W S  tk
rZ } z
t|W 5 d}~X Y nX dS )z
        Use tracked access path during tracing instead of the default BFS behavior.
        Still use all the possible module paths to verify the result.
         N)rN  rT   rR  rB  r	   path_of_module	NameErrorr?  )r   rS  r   r7   r7   r8   rU    s    

z!_ModuleStackTracer.path_of_modulec                    sH   t |tjjrt |tjjr,t |||S t || jr<|S | ||S r3   )	rT   rW   r   r   r   r
   r   r   rR  r   r   r7   r8   r     s
    z_ModuleStackTracer.getattrc                    s   t  ||}g } j D ] \}}| jkr|||f q fdd}|D ],\}}	| j|  j|	 }
t|
 j| qN|S )Nc                    s   | d}|d d |d  }}t| tjjs2t| }|D ]8}t||sN dS t||}t| jtjjfs: dS q:t||sdS tt|| jsdS t	|| dS )NrG  r   FT)
splitrT   rW   r   r   rS   rR   r   rR  delattr)r^   r5  ZatomsrE  Ztarget_submodrS  itemr   r7   r8   _delete_proxy_attr  s     




z4_ModuleStackTracer.trace.<locals>._delete_proxy_attr)r   r   r   rP  rC  r   r   )r   r   r   resZ!proxy_module_names_to_be_replacedr   r-  rZ  Zproxy_module_nameZproxy_moduleZactual_moduler   r   r8   r     s    

z_ModuleStackTracer.tracec              
   C   s   ddl m} t||tfr$|||S zt| ||||W S  tk
rz } z$td| d ||| W Y S d}~X Y nX dS )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.N)	torch._dynamor\  rT   r
   r	   r   r?  warningswarn)r   r   r   r   r   r\  r   r7   r7   r8   r   +  s    

z_ModuleStackTracer.call_modulec                 C   s   dS r  r7   )r   r   Zmodule_qualified_namer7   r7   r8   is_leaf_moduleF  s    z!_ModuleStackTracer.is_leaf_modulec           	         s<  t  j||}|jdkrrd|jkr.| j|jd< |jd  D ]4\}\}}t|tr<||jd |j	 f|jd |< q<|jdkr| j
dk	rd|jkr| j
j d| j| j
  | j
jj d| j
j f|jd< d|jkr8|jdkr8t  }|r8d	d
 |D }dd
 |D }|r8t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.
        )r3  r7  Znn_module_stackrG  r   NZtorch_fnr<   stack_tracec                 S   s&   g | ]}|j d ks|jdr|qS )r   ztorch/__init__.py)r   filenameendswithr>   framer7   r7   r8   rA   i  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)rb  rc  rd  r7   r7   r8   rA   o  s   rT  )r   r   oprP   Zmodule_stackr   rT   r\   r   r   r   r   r   rr   r   extractsummaryr%  StackSummary	from_listrH   formatstrip)	r   r   r   rU   r   ZfqnZmod_clsZuser_frame_summaryra  r   r7   r8   r   I  s,    


 
z_ModuleStackTracer.create_node)r   r   r   r   r   rW   r   r   r   rU  r   r   r   r`  r   r   r7   r7   r   r8   r@    s   /1r@  c                   @   s   e Zd Zeeeef  eeeeeedddZe	e
 dddZeeef eeef eeef eeef eee
f eeef ddd	d
Zedd Zdd Zedd Zdd ZejjdddZdd ZdS )_MakefxTracer)rN   r  _allow_non_fake_inputsr   record_module_stackr   r   c                 C   s~   |pi | _ | j tjjjjtjjj || _	|| _
|| _|| _|| _|| _t | _t | _t | _t | _t | _t | _d S r3   )rN   
setdefaultrW   r   r   r   ri   _decompZdecompositionsr  rn  r   ro  r   r   r   ry   r   proxy_function_mode	fx_tracerpython_dispatcher_modetorch_fn_metadata_mode)r   rN   r  rn  r   ro  r   r   r7   r7   r8   r   }  s    
z_MakefxTracer.__init__)r   c                 C   s   | j | j| j| j| j| jgS r3   ry   r   rr  rs  rt  ru  r   r7   r7   r8   _checkpoint_modes  s    z_MakefxTracer._checkpoint_modesN)prev_fake_tensor_modeprev_proxy_modeprev_proxy_function_modeprev_fx_tracerprev_python_dispatcher_modeprev_torch_fn_metadata_moder   c                 C   s(   || _ || _|| _|| _|| _|| _d S r3   rv  )r   rx  ry  rz  r{  r|  r}  r7   r7   r8   _restore_modes  s    	z_MakefxTracer._restore_modesc           
   	   c   sz  |   }z^ddlm} t|dr:| jr:|j}t|| _nt	 | _| j
dkrdd l}|jj|}|d krdd lm  m} |jdd td| j| dd	}W 5 Q R X || _n| j
d
kr8dd l}|jj|}|d kr| }	dd lm  m} |jdd td| j|	d}W 5 Q R X |jd k	s0td|| _n| j
dksTtd| j
 | | j d V  W 5 | j|  X d S )Nr    )ShapeEnv	_orig_modfaker   F)Z(fake_tensor_allow_unsafe_data_ptr_accessT)ro   allow_non_fake_inputs	shape_envZstatic_shapessymbolic)ro   r  r  z2shape_env should be set if tracing with 'symbolic'r/  zUnexpected tracing type: )rw  r~  symbolic_shapesr  rR   ro  r  r@  rs  r+   r  r]  Z_dynamoutilsZdetect_fake_modeZtorch._functorch.configZ
_functorchconfigpatchr   rn  ry   r  rS   _construct_modes_with_fx_tracer)
r   r~   r   
prev_modesr  rN  rW   ry   _configr  r7   r7   r8   _init_modes_from_inputs  sN    


z%_MakefxTracer._init_modes_from_inputsc                 C   sR   t || j| j| j| jd| _| jr,t|| _| jdks<| jrDt | _	t
|| _d S )N)r   r   r   r  )r  r  r   r   r   r   r   rr  r   rt  r  ru  )r   rs  r7   r7   r8   r    s    
z-_MakefxTracer._construct_modes_with_fx_tracerc                 c   sL   |   }z2|j| _dd }||j| _| | j d V  W 5 | j|  X d S )Nc                 S   sD   t | tkrt }n,t | tkr,t| j}ntdt |  d|S )NzUnexpected tracer type: rG  )r\   r+   r@  rN  rh   )parent_tracer
sub_tracerr7   r7   r8   _create_sub_fx_tracer  s    zD_MakefxTracer._init_modes_from_parent.<locals>._create_sub_fx_tracer)rw  r~  ry   rs  r  )r   r  r  r  r7   r7   r8   _init_modes_from_parent  s    

z%_MakefxTracer._init_modes_from_parentc                    s,  t dd |}tt tt d fdd}dd }||}|||}t j  j  j  j  j	j
r  j`  j	N t < t ( tt|| j j jt|d}W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X  jd	kr( jj|_|S )
Nc                 S   s   t jS r3   )r   ZPHrc   r7   r7   r8   r9     r:   z,_MakefxTracer._trace_inner.<locals>.<lambda>)r   r   c                    s4   d  fdd}dd ||d}t |j | S )Nr   c                    s   ddl m} |d  }t| tjr> d7  jj| |dS t| tkrxj	dkrxjj
jjj
j| |d d| |dS t| tjrtjjj| S t| trtd	|  d
| S )Nr   )ConstantSourceinputr    )sourcer  )Zpositive)hintr  zScriptObject z. has been fakified. Cannot wrap_fake it again.)Ztorch._dynamo.sourcer  rT   rW   rX   ry   Zfrom_tensorr\   rv   r  r  Zcreate_symintnodeZcreate_symbolrZ   Z_libraryZfake_class_registryZto_fake_objr   rS   )r@   r  r  )	arg_countr   r7   r8   inner_wrap_fake  s    zG_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.inner_wrap_fakec                 S   s   | S r3   r7   rf   r7   r7   r8   r9   2  r:   z@_MakefxTracer._trace_inner.<locals>._wrap_fake.<locals>.<lambda>r/  r  r  )r=   r8  r  )r   r  Zwrap_fn_mapr   )r  r8   
_wrap_fake  s    z._MakefxTracer._trace_inner.<locals>._wrap_fakec                 S   s6   t t| dr$t| jjtj@ r2t| t|S | S )N__code__)rR   inspectr6  r  co_flags
CO_VARARGSrM   r   )r~   phsr7   r7   r8   
_wrap_func8  s    $z._MakefxTracer._trace_inner.<locals>._wrap_func)r_   r   r  )r=   r8  r   r   rO   rN   ry   rt  rr  r   r  ru  r>  _set_make_fx_tracerr,   r	  rs  r   r;   r  r  )r   r~   r   r  r  r  r   r   r7   r   r8   _trace_inner  s0    "
$`
z_MakefxTracer._trace_innerc              
   G   s4   |  || | j|f| W  5 Q R  S Q R X d S r3   )r  r  )r   r~   r   r7   r7   r8   r   U  s    z_MakefxTracer.tracec              
   G   sT   t | j| j| j| j| j| j| j}||  |j	|f| W  5 Q R  S Q R X d S r3   )
rm  rN   r  rn  r   ro  r   r   r  r  )r   r~   r   r  r7   r7   r8   trace_subgraphY  s    	z_MakefxTracer.trace_subgraph)r   r   r   r   r   r   r   rx   r   r   r   rw  r   null_ctx_typer   r  r   r	   r  r~  r   r  r  r  r  rW   r   r
   r   r  r7   r7   r7   r8   rm  {  s2    






.
Brm  _CURRENT_MAKE_FX_TRACER)r_   r   c                 c   s   t }z| a d V  W 5 |a X d S r3   )r  )r_   Zprev_tracerr7   r7   r8   r  i  s
    
r  r/  FT)r   ro  r   r   c          	         s<   |dkst t|||||||t  fdd}|S )Nr  c                     s   j  f|  S r3   )r   )r   r~   Zmake_fx_tracerr7   r8   r    s    zmake_fx.<locals>.wrapped)rS   rm  r{   r  )	r~   rN   r  rn  r   ro  r   r   r  r7   r  r8   r-   s  s    
c                   C   s   t jj S r3   )rW   r  Z_python_dispatchZ _get_current_dispatch_mode_stackr7   r7   r7   r8   get_torch_dispatch_modes  s    r  c                   C   s   t jt jjjS r3   )rW   r  _get_dispatch_moder  r  r7   r7   r7   r8   r0     s    c                   C   s   t tjjjS r3   )r   rW   r  r  r  r7   r7   r7   r8   r    s    r  c              
   C   s2   |t kr.|  t | ||W  5 Q R  S Q R X tS r3   )r2   r   )r   rf  r   r   r7   r7   r8   r     s     r   c              	   C   s6   t | ||\}}t  t||d|}W 5 Q R X |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.
    r0  )r<  r  r-   )r   r   r   r  r  Zall_argsZgmr7   r7   r8   get_isolated_graphmodule  s    r  c                 C   sH   ddl m} tjtjjj}|rD|jrD||j|  }rD||jj	d< dS )zOA helper function for setting up unbacked_bindings on the destination FX graph.r    )compute_unbacked_bindingsZunbacked_bindingsN)
r  r  rW   r  r  r  ZFAKEr  rU   rP   )r   Z	out_proxyr  Z	fake_modeZsymbol_to_pathr7   r7   r8   r     s    	
r   )N)Nr/  F)r/  )
contextlibr{   typingr   r   r   r   r   r   r   rW   Ztorch.utils._pytreer  Z_pytreer=   Ztorch.fxr	   r
   Ztorch.fx.graph_moduler   r1  r   collectionsr   Ztorch._subclasses.fake_tensorr   r   r   r   Ztorch._dispatch.pythonr   r   Ztorch.fx.noder   Ztorch.fx.passes.shape_propr   r   r   r  dataclassesr   r*  r%  Ztorch.utils._statsr   Ztorch.utils._tracebackr   loggingZ"torch._library.fake_class_registryr   r^  r   r   Ztorch.utils._python_dispatchr   r   r   r   Z_backward_stater!   Zsym_noder"   Z_sym_dispatch_moder#   r$   Ztorch.fx.tracebackr  r%   r&   r'   Ztorch.utils.weakr(   r)   r*   __all__r   r   r'  	getLoggerr   logZ_loggingZgetArtifactLoggerr   r2   Z_opsZOperatorBaser   r   r\   r  Zregister_pytree_nodeSizerM   rO   objectZ
proxy_slotrg   r/   rV   ra   re   rd   rl   rm   rz   r   r   r   r   r   r   r   rX   r   r   r   r   r   r+   r   Z_disable_dynamor   r,   rx   r	  r
  r  r  r   r  r  ZInterpreterr.   r<  r>  rV  r?  r@  rm  r  r  r-   r  r0   r  r   r  r   r7   r7   r7   r8   <module>   s    $
	


!
6 b5
  
>?1

	 [ m   

