U
    yhaD                 
   @   s  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 d dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlZd dlZd dl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'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m;Z; d dl<m=Z= erd dl>m?Z? d dl@mAZA G dd dZBdd ZCeB ZDeZEeFeGZHzejIJeGdZKW n@ eLk
r ZM z deNeMkrd dlZKneMW 5 dZM[MX Y nX ejOjPZQedZReZSejTjUjVZVdZWd aXG dd dZYe	G d d! d!eZZ[e	G d"d# d#eZZ\e	G d$d% d%eZZ]e	G d&d' d'eZZ^d(d) Z_e j`d*d+ Zad,d- Zbd.d/ Zceddd0d1 Zeeddd2d3 ZfeeR e7d4d5d6ZgG d7d8 d8Zheddd9d: Zie j`d;d< Zje d=d>d?ZkG d@dA dAZlG dBdC dCZmG dDdE dEejnZoe	dFdGG dHdI dIZpejndIdJdKdLZqG dMdN dNerZse	dFdGG dOdP dPZte	dFdGG dQdR dReuZve	dFdGG dSdT dTZwG dUdV dVe5ZxdWdX ZyG dYdZ dZe0Zzd[d\ Z{d]d^ Z|d_d` Z}ejUj~jje{ejUjVjjdadb ejUjVjjdcdb ejUjVjjdddb iZe_ejUjVjjejUjVjjejUjVjjZd delmZmZmZmZmZmZmZmZ dS )f    N)defaultdict)	dataclass)AnyCallablecastDictListOptionalTupleTypeTYPE_CHECKINGTypeVarUnion)ReferenceType)is_functorch_wrapped_tensoris_legacy_batchedtensor)Source)
OpOverload)suggest_memory_format)	assert_eqassert_metadata_eqis_sparse_anyis_sparse_compressedMetaConverter)render_call)normalize_function)StorageWeakRef)TorchFunctionMode)no_dispatch)is_traceable_wrapper_subclassTorchDispatchMode)PyTreetree_map	tree_map_)count)CapturedTraceback)ShapeEnv)_boolc                   @   s   e Zd ZdS )_UnassignedN)__name__
__module____qualname__ r,   r,   O/var/www/html/venv/lib/python3.8/site-packages/torch/_subclasses/fake_tensor.pyr(   :   s   r(   c                 C   sB   t | tjko@| jtjko@| jp>| jp>t| p>t| p>t	|  S N)
typetorchTensorlayoutstrided	is_sparseZ	is_nestedr   r   _is_functional_tensortr,   r,   r-   _is_plain_tensor>   s    
r8   not_implementedz 'not_implemented' not registeredT   c                   @   s   e Zd Zdd Zdd ZdS )IncrementRecursionCountc                 C   s   t d7 a d S Nr;   RECURSION_COUNTselfr,   r,   r-   __init__l   s    z IncrementRecursionCount.__init__c                 C   s   t d8 a d S r=   r>   r@   r,   r,   r-   __del__p   s    zIncrementRecursionCount.__del__N)r)   r*   r+   rB   rC   r,   r,   r,   r-   r<   k   s   r<   c                   @   s   e Zd ZU eed< dS )UnsupportedFakeTensorExceptionreasonN)r)   r*   r+   str__annotations__r,   r,   r,   r-   rD   u   s   
rD   c                   @   s   e Zd ZU eed< dS )DynamicOutputShapeExceptionfuncNr)   r*   r+   r   rG   r,   r,   r,   r-   rH   z   s   
rH   c                   @   s   e Zd ZU eed< dS )DataDependentOutputExceptionrI   NrJ   r,   r,   r,   r-   rK      s   
rK   c                   @   s   e Zd ZU eed< dS )UnsupportedOperatorExceptionrI   NrJ   r,   r,   r,   r-   rL      s   
rL   c                  G   s   t | dS NT)dictfromkeys)itemsr,   r,   r-   ordered_set   s    rQ   c               	   c   s8   t jt jjj} z
| V  W 5 | d k	r2t j|  X d S r.   )r0   _C_unset_dispatch_mode_TorchDispatchModeKeyFAKE_set_dispatch_mode)oldr,   r,   r-   unset_fake_temporarily   s
    
rX   c                    s   t  trdS t rrt  \}} fdd|D }tdd |D }tdd |D }||ksntd|S t  tj	rt
 rtj }tjj |}t|S t  tj	rt rtjj }t|S dS )	NTc                    s   g | ]}t  |qS r,   )getattr).0attrxr,   r-   
<listcomp>   s     zis_fake.<locals>.<listcomp>c                 s   s   | ]}t |V  qd S r.   is_fakerZ   r]   r,   r,   r-   	<genexpr>   s     zis_fake.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r.   r_   ra   r,   r,   r-   rb      s     z got mixed fake and real tensors!F)
isinstance
FakeTensorr   r/   __tensor_flatten__allanyAssertionErrorr0   r1   r5   rR   $_functionalization_reapply_views_tls
_functorch_unwrap_functional_tensorr`   r   get_unwrapped)r]   attrs_Zflattened_tensorsZall_fakeZany_fakereapply_views	unwrappedr,   r\   r-   r`      s"    

r`   c                    s   t trjS tr\ \}}fdd|D }|d  t fdd|D sXt S t tjrt	rtj
 }tj
j|}t|S t tjrtrtj
j}t|S d S )Nc                    s   g | ]}t t |qS r,   )maybe_get_fake_moderY   )rZ   Zt_namer6   r,   r-   r^      s    z'maybe_get_fake_mode.<locals>.<listcomp>r   c                 3   s   | ]} |kV  qd S r.   r,   ra   )mr,   r-   rb      s     z&maybe_get_fake_mode.<locals>.<genexpr>)rc   rd   	fake_moder   re   rf   rh   r0   r1   r5   rR   ri   rj   rk   rq   r   rl   )r7   Zinner_tensor_namesrn   modesro   rp   r,   )rr   r7   r-   rq      s$    


rq   c                 C   s   t j| jS r.   )r0   rR   Z_SchemaInfo_schemarI   r,   r,   r-   get_schema_info   s    rw   c                 C   s6   ddl m} tjj}||  jdo4||  jt|kS )Nr   decomposition_tableztorch._decomp)	torch._decompry   r0   _decompdecompositionsr*   
startswithr)   dir)rI   ry   r|   r,   r,   r-   torch_decomp_decompositions   s    
r   )tytreec                    s   t |} fdd|D S )Nc                    s   g | ]}t | r|qS r,   )rc   )rZ   elemr   r,   r-   r^      s     
 z%tree_flatten_only.<locals>.<listcomp>)pytreetree_leaves)r   r   Z	flat_valsr,   r   r-   tree_flatten_only   s    
r   c                   @   s   e Zd ZU edd Zeed< eee	e
 f ed< eed< ddddd	Zd
d Zdd Zdd Zdd ZdddddddZdd ZdS )FakeTensorConverterc                 C   s   | j jS r.   )meta_convertertensor_memor@   r,   r,   r-   r      s    zFakeTensorConverter.tensor_memor   constant_storage_mappingexportF	copy_datar   c                C   s   t |d| _|| _i | _d S )N)r   )r   r   r   r   )rA   r   r   r,   r,   r-   rB      s    zFakeTensorConverter.__init__c                 C   sT   t |tr|jd k	stt|j }|| jkr:g | j|< | j| t	| d S r.   )
rc   rd   constantrh   r   _typed_storager   appendweakrefref)rA   Zfake_tensorweak_str,   r,   r-   add_constant_storage_mapping   s
    

z0FakeTensorConverter.add_constant_storage_mappingc                 C   s`   t |trtt| }|| jkr(d S | j| D ] }| }|d k	r2|  d |_q2| j|= d S r.   )rc   rd   rh   r   r   r   Z_fix_weakrefr   )rA   tensorr   Zweak_tensor_reftenr,   r,   r-   invalidate_constant_aliases   s    
z/FakeTensorConverter.invalidate_constant_aliasesc                 C   s(   | j jj|}|d krd S | j|S r.   )r   	describerZlookup_tensorgetr   )rA   r7   tidr,   r,   r-   	_get_memo  s    zFakeTensorConverter._get_memoc                 C   s   | j j|}|| j j|< d S r.   )r   r   Zget_tensor_idr   )rA   r7   vr   r,   r,   r-   set_tensor_memo  s    z#FakeTensorConverter.set_tensor_memoNT)sourcesymbolic_contexttracec             	      s  |s6|s6|r6t jj  }r6|jkr6|j }|j}| }	|	d k	rL|	S j jr`t	dt
t jjkrxrxt fdd}
| j||
|||d}|tkrt	dddlm} d }| jstrԈ dkrԈjj
dkrԈjt jt jt jt jt jfkr|d k	rt||s|d k	rdd	lm}m} dd
lm} t   ! }W 5 Q R X t||rx|j"}n||}|j#|||j$d}jt jkr|j%|||d|_&n jt jkr|j'|||d|_&r| (| |S )Nzquantized nyi in meta tensorsc              
      s8   t  ( t|   rnd dW  5 Q R  S Q R X d S )Nr   )r   rd   )Zmake_meta_tZexisting_devicers   make_constantr7   r,   r-   mk_fake_tensor:  s    
z<FakeTensorConverter.from_real_tensor.<locals>.mk_fake_tensor)	shape_envcallbackr   r   r   zmeta converter nyir   )RandomValueSourcecpu)CallMethodItemSourceFloatTensorSource)
DimDynamic)r   Zdynamic_dim)hintr   ))r0   Z_guardsZTracingContextZtry_getZtensor_to_contextZtensor_sourcer   deviceis_quantizedrD   r/   nn	Parameterrh   r   NotImplementedZtorch._dynamo.sourcer   r   r8   dimdtypeZint64Zint32Zint16Zint8Zfloat64rc   r   r   %torch.fx.experimental.symbolic_shapesr   r   itembaseZcreate_unspecified_symbolZDYNAMICZcreate_symintnode	item_memoZcreate_symfloatnoder   )rA   rs   r7   r   r   r   r   r   Ztracing_context
maybe_memor   outr   valuer   r   r   Zitem_sourcesymbolr,   r   r-   from_real_tensor  s    





"$

z$FakeTensorConverter.from_real_tensorc                 C   sR   |j jdks td|j j d| |}|d k	r6|S t|||}| || |S )Nmetaz$tensor's device must be `meta`, got z instead)r   r/   rh   r   rd   r   )rA   rs   r7   r   r   r   r,   r,   r-   from_meta_and_device  s    

z(FakeTensorConverter.from_meta_and_device)FN)r)   r*   r+   propertyr   r   rG   r   r   r   r   boolrB   r   r   r   r   r   r   r,   r,   r,   r-   r      s&   

   r   c                   C   s6   t j r2t jjd kr$t jdddnt jddd d S )Nr;   cudar   )r0   r   is_availableversionZhipemptyzerosr,   r,   r,   r-   init_cuda_context  s
    
 r   c              
   c   s   | j }tj }||ks*t| d| tj B d| _ tj & tjd z
d V  W 5 || _ X W 5 Q R X W 5 Q R X d S )N, T)in_kernel_invocationr0   rR   Z_meta_in_tls_dispatch_includerh   Z_DisableTorchDispatchZ_PreserveDispatchKeyGuardZ!_set_meta_in_tls_dispatch_include)rs   Zprev_in_kernelZmeta_in_tlsr,   r,   r-   in_kernel_invocation_manager  s    

r   rv   c                 C   s$   t j|  dd dd S )Nz::.r   )r0   rR   Z _should_allow_numbers_as_tensorsnamesplitrv   r,   r,   r-   should_allow_numbers_as_tensors  s    r   c                   @   s   e Zd ZejdddkZdS )FakeTensorConfigZTORCH_FAKE_TENSOR_DEBUG01N)r)   r*   r+   osenvironr   debugr,   r,   r,   r-   r     s   r   c                   @   sN   e Zd ZU eed< dd Zdd Zdd Zdd	 ZdddddZ	dd Z
d
S )UnbackedMemoDescriptor_namec                 C   s
   || _ d S r.   r   )rA   ownerr   r,   r,   r-   __set_name__  s    z#UnbackedMemoDescriptor.__set_name__c                 C   s   d| j  S )Nrn   r   rA   objr,   r,   r-   _memo  s    zUnbackedMemoDescriptor._memoc                 C   s   d| j  dS )Nrn   Z_vcr   r   r,   r,   r-   _memo_vc  s    zUnbackedMemoDescriptor._memo_vcc                 C   s   d| j  dS )Nrn   Z_epochr   r   r,   r,   r-   _memo_epoch  s    z"UnbackedMemoDescriptor._memo_epochNrd   )r   c                 C   sd   t || | }d krd S t || ||jksJt || ||jjkr`t|| |d  d S |S r.   )rY   r   r   _versionr   rs   epochsetattr)rA   r   objtyperr,   r,   r-   __get__  s    zUnbackedMemoDescriptor.__get__c                 C   s   |d kr@t || |d  t || |d  t || |d  nDt st || || t || ||j t || ||jj d S r.   )	r   r   r   r   r0   is_inference_mode_enabledr   rs   r   )rA   r   r   r,   r,   r-   __set__  s    zUnbackedMemoDescriptor.__set__)N)r)   r*   r+   rF   rG   r   r   r   r   r   r   r,   r,   r,   r-   r     s   
r   c                       s   e Zd ZU dZejed< ded< eej ed< eej ed< e	 Z
e	 Ze	 ZejjjZedd Zed	d
 ZedddZ fddZedd ZeedddZeeejef dddZdd Z  ZS )rd   al  
    Meta tensors give you the ability to run PyTorch code without having to
    actually do computation through tensors allocated on a `meta` device.
    Because the device is `meta`, meta tensors do not model device propagation.
    FakeTensor extends MetaTensors to also carry an additional `fake_device`
    which tracks devices that would have been used.
    fake_deviceFakeTensorModers   r   real_tensorc                 C   s   | j jrtdS | jS d S Nr   )rs   r   r0   r   r   r@   r,   r,   r-   r   &  s    
zFakeTensor.devicec                 C   s   t dd S )Nz+torch.compile doesn't support named tensors)rD   r@   r,   r,   r-   names=  s    zFakeTensor.namesNc                 C   sF  t jj| ||jd|d}|js,t j| nt j| |jj	dksPt
|jj	t|t jr`|nt |}|js~|j	dks~t
|j	dkrt  |j	dddt j fkr|jd krtt |j	 rt |j	 dtt |j	  }nt |j	 d}||_||_||_t|trt
||_d |_d |_d |_tjrBt |_|S )	NT)Zdispatch_deviceZdevice_for_backend_keysr   r   ZhpuZxpu:z:0) r0   r1   Z_make_subclassrequires_grad_allow_unsafe_data_ptr_accessrR   Z_set_throw_on_mutable_data_ptrZ(_set_warn_deprecated_on_mutable_data_ptrr   r/   rh   rc   
allow_metar   Z_get_privateuse1_backend_nameindexrY   Zis_initializedZcurrent_devicer   rs   r   rd   r   nonzero_memor   unique_memor   r   r%   extractZ_debug_trace)clsrs   r   r   r   r   rA   r,   r,   r-   __new__C  sL    

zFakeTensor.__new__c                    s   t    d S r.   )superrB   )rA   argskwargs	__class__r,   r-   rB     s    zFakeTensor.__init__c                 C   s
   | | S r.   )from_tensor)r7   rs   r,   r,   r-   r     s    zFakeTensor.from_tensorr,   c           
   
   C   s  |t jjjjkrNt|dkr*t|d ts.t|d j	j
rDt dS |d jS t| }rd||S dd |D }|rtd| tS d }tj||D ]}t|tr|j	} qq|d k	stt jt jjj}	|	rtd||	 tS |j
rt| |||W  5 Q R  S Q R X d S )Nr;   r   r   c                 S   s$   g | ]}t |ts|tjk	r|qS r,   )
issubclassrd   r0   r1   rZ   r7   r,   r,   r-   r^     s    
 
 z1FakeTensor.__torch_dispatch__.<locals>.<listcomp>z(FakeTensor unrecognized subclass(es): %sz(FakeTensor mode already active: %s in %s)r0   opsprimr   defaultlenrc   rd   rh   rs   r   r   _DISPATCH_META_HANDLERSr   not_implemented_logr   r   r   Zarg_tree_leavesrR   _get_dispatch_moderT   rU   )
r   rI   typesr   r   handlerunrecognized_typesrs   argZmaybe_cur_fake_moder,   r,   r-   __torch_dispatch__  sF    

 
	
zFakeTensor.__torch_dispatch__returnc                    st   d  d}d dd  fdd}|D ]}|| q*t rV d krVd}td  d k	sltd  |fS )	NFc                 S   s   | j jdko|  dkS )Nr   r   )r   r/   r   r6   r,   r,   r-   cpu_zero_dim  s    z4FakeTensor._find_common_device.<locals>.cpu_zero_dimc                    s   t | tsd S  d kr(| j | d S | }| j krFrB|d S |rNd S r`| j |d S td d  d| j d S )Nz,Unhandled FakeTensor Device Propagation for z, found two different devices r   )rc   rd   r   RuntimeError)r7   Zt_is_cpu_zero_dimcommon_devicer  rI   Zis_cpu_zero_dimr,   r-   merge_devices  s(    

z5FakeTensor._find_common_device.<locals>.merge_devicesTr   z!Could not find common device for )r   r0   r   rh   )rI   	flat_argshas_scalar_only_inputsr  r	  r,   r  r-   _find_common_device  s    "

zFakeTensor._find_common_devicec                 C   sb   |   dkstd| jj}g }t| jd D ].}| }t| t	|dk |
| q.|S )Nr;   zNYI for higher dimsr      )r   rh   rs   r   rangeshapeZcreate_unbacked_symintr0   Z_check_is_size_checkr   )rA   r   r   rn   sr,   r,   r-   tolist  s    
zFakeTensor.tolist)NN)r,   N)r)   r*   r+   __doc__r0   r   rG   r	   r1   r   r   r   r   rR   rT   rU   	_mode_keyr   r   staticmethodr   rB   r   classmethodr$   r
  r
   r   r  r  __classcell__r,   r,   r   r-   rd     s0   




F
CGrd   T)frozenc                   @   s   e Zd ZU dZejed< ejed< ee	df ed< ej
ed< ejed< eej ed< eed	< ee ed
< eed< eed< eed< eed< eed< eed< ee ed< ee ed< ee ed< dS )TensorMetadatazK
    The Tensor metadata relevant to hashing FakeTensors when caching.
    r   r  .strider   r2   memory_formatstorage_offsetstorage_bytesr   r   is_conjis_negis_inferencer4   is_coalesced	dense_dim
sparse_dimN)r)   r*   r+   r  r0   r   rG   Sizer
   r   r   r2   r	   r#  intr   r,   r,   r,   r-   r!  ,  s$   




r!  )r7   r  c                 C   s   t | }t| s| j|ds d}t| j| j| jtjkr>| 	 nd| j
| j||  | jsb|   nd| j| j|  |  |  | j| jr|  nd| jr|  nd| jr|  nddS )z1
    Extract the TensorMetadata of a tensor.
    )r#  Nr,   )r   r  r"  r   r2   r#  r$  r%  r   r   r&  r'  r(  r4   r)  r*  r+  )r   r   Zis_contiguousr!  r   r  r2   r0   r3   r"  r   r$  r4   untyped_storagenbytesr   r   r&  r'  r(  r)  r*  r+  )r7   r#  r,   r,   r-   extract_tensor_metadataE  s,    r0  c                   @   s(   e Zd ZdZdZefddZdd ZdS )_DispatchCacheKeyz
    Key for the FakeTensor dispatch cache. Inspired by (copied from)
    _HashedSeq from the functools.lru_cache implementation.
    	hashvaluec                 C   s   || d d < ||| _ d S r.   r2  )rA   tuphashr,   r,   r-   rB   k  s    z_DispatchCacheKey.__init__c                 C   s   | j S r.   r3  r@   r,   r,   r-   __hash__o  s    z_DispatchCacheKey.__hash__N)r)   r*   r+   r  	__slots__r5  rB   r6  r,   r,   r,   r-   r1  c  s   r1  c                   @   sB   e Zd ZU dZdZee ed< dZee	 ed< dZ
ee ed< dS )_DispatchCacheEntrya:  
    Entry type for the FakeTensor dispatch cache. Accounts for two possibilities:
    1) The op is inplace, and a hit means we need to alias the argument at a given
    index. 2) We need to synthesize a new FakeTensor given tensor metadata. For view
    ops, we further capture the index of the arg to alias.
    Ninplace_idxmetadataview_idx)r)   r*   r+   r  r9  r	   r-  rG   r:  r!  r;  r,   r,   r,   r-   r8  s  s   
r8  c                   @   s   e Zd ZU dZeed< dS )_BypassDispatchCachez<
    Signals cases that should skip FakeTensor caching.
    rE   N)r)   r*   r+   r  rF   rG   r,   r,   r,   r-   r<    s   
r<  c                   @   s:   e Zd ZU dZeed< eed< eeef ed< eed< dS )DispatchCacheInfozG
    Information about the state of the FakeTensor dispatch cache.
    hitsmissesZbypassessizeN)r)   r*   r+   r  r-  rG   r   rF   r,   r,   r,   r-   r=    s
   
r=  c                       s  e Zd ZU i Zeeef ed< dZe	ed< dZ
e	ed< ee	Zeee	f ed< dZe	ed< dZeed< d	dd
d
ddddZdd Zedd Zedd ZedSddZ fddZ fddZeedddZedd Zeee d f ee d f eee f d!d"d#Z!eee d f eee f ed$d%d&Z"eee d f eee f d'd(d)Z#e e d*d+d,Z$eeee d f eee f e%ed-d.d/Z&eeee d f e%d0d1d2Z'e%eee d f ee d f eee f d3d4d5Z(dTd6d7Z)e%dd8d9Z*e+d:d;d<d=d>d?d@dAZ,edBdCdDZ-dEdF Z.dGdH Z/e+e0j1j2e0j3j4e0j5j4e0j6j4e0j7j4e0j8j4e0j9j4e0j:j4e0j;j4e0j<j=e0j>j4Z?dIdJ Z@e+e0jAj4e0jBj4ZCdKdL ZDdMdN ZEd
d
d
d	dOeFeG dPdQdRZH  ZIS )Ur   cacher   
cache_hitscache_missescache_bypassesr   Fr   TN)allow_fallback_kernelsallow_non_fake_inputsr   static_shapesr   c                C   s   t dt|  || _dd l}dd l}|jjj| _	t
| j	|d| _|d k	rR|| _n
|d k| _d| _|jjj| _|jjj| _|jjjo| j	 | _|jjj| _|| _d| _g | _|| _t | _d | _|jj j!| _"d S )Nzcreate_mode 0x%xr   r   F)#logr   idrE  Ztorch._dynamo.configZtorch._functorch.configrj   configZ"fake_tensor_propagate_real_tensorspropagate_real_tensorsr   fake_tensor_converterrG  Zallow_scalar_outputsZ(fake_tensor_allow_unsafe_data_ptr_accessr   Zfake_tensor_allow_metar   Z_dynamoZfake_tensor_cache_enabledcache_enabledZ$fake_tensor_cache_crosscheck_enabledcache_crosscheck_enabledrF  r   enter_stackr   	tracebackextract_stack_stack_trace_stackrR   rT   rU   r  )rA   rE  rF  r   rG  r   r0   r,   r,   r-   rB     s<    

	
zFakeTensorMode.__init__c                 C   s   t |to|j| kS r.   )rc   rd   rs   rA   r7   r,   r,   r-   is_our_fake  s    zFakeTensorMode.is_our_fakec                 C   s   t j  S r.   )r0   r   r   r@   r,   r,   r-   avoid_device_init  s    z FakeTensorMode.avoid_device_initc                 C   s$   | j d krdt| j| _ | j S )N )rS  joinrP  format_listrR  r@   r,   r,   r-   stack  s    
zFakeTensorMode.stackr,   c                 C   sV   t jt jjjd kst|z| ||||W S  tk
rP   t	d  Y nX d S )Nzfake tensor raised TypeError)
r0   rR   r  rT   rU   rh   dispatch	TypeErrorrH  	exception)rA   rI   r  r   r   r,   r,   r-   r
    s    
z!FakeTensorMode.__torch_dispatch__c                    st   d }| j r tj }tjd tj| j}| |k	rR| jd||f t	 
 S tj|  | jdd |f | S )NTF)rV  r0   rR   Z_only_lift_cpu_tensors_set_only_lift_cpu_tensorsrS   r  rO  r   r   	__enter__rV   )rA   Zprev_only_lift_cpu_tensorsmaybe_prev_fake_moder   r,   r-   r_  +  s    

zFakeTensorMode.__enter__c                    sP   | j  \}}}|rLt |||}|d k	r8tj| |d k	rLtj| d S r.   )rO  popr   __exit__r0   rR   rV   r^  )rA   abcliver`  Z maybe_prev_only_lift_cpu_tensorsr   r   r,   r-   rb  =  s    zFakeTensorMode.__exit__r  c                 C   s   t tjtjttjttjS )z8
        Query the state of the dispatch cache.
        )r=  r   rB  rC  rN   rD  r  rA  r   r,   r,   r-   
cache_infoK  s    zFakeTensorMode.cache_infoc                 C   s$   d| _ d| _| j  | j  dS )z+
        Clear the dispatch cache.
        r   N)rB  rC  rD  clearrA  rg  r,   r,   r-   cache_clearW  s    
zFakeTensorMode.cache_clear.)rI   r  r   r   c           	   
   C   s   t }z| |||}tj|d}|dk	r`| |||}t jd7  _| jr| ||||| nH| 	||| | 
||||}| |||||}|tj|< t jd7  _W n6 tk
r } ztj|j  d7  < W 5 d}~X Y nX |t kr| 
||||}|S )z
        Lookup a cache entry for the given arguments. If none exists, dispatch
        and cache the result (if the result is eligible for caching).
        Nr;   )_UNASSIGNED
_cache_keyr   rA  r   _output_from_cache_entryrB  rN  _crosscheck_cache_output_validate_cache_key_dispatch_impl_make_cache_entryrC  r<  rD  rE   )	rA   rI   r  r   r   outputkeyentryer,   r,   r-   _cached_dispatch_impla  s&    
&z$FakeTensorMode._cached_dispatch_impl)rI   r   r   r  c                 C   sR   ||r|  |nd|r |  |ndt tj t | jrD| jjndf}t|S )z
        Create a cache key given the dispatch args. Raises _BypassDispatchCache
        for any situation that precludes caching.
        r,   N)	_prep_args_for_hashr0   Zget_default_dtyperR   Z_get_default_devicer   r   settingsr1  )rA   rI   r   r   
key_valuesr,   r,   r-   rl    s    zFakeTensorMode._cache_key)rI   r   r   c                 C   s   t jj|jkrtdt jj|jkr,tdt jj|jkrBtd|tjj	krVtd|| j
krhtd| dkr|tdt jj|std|jrt j| t jjjrtdd	S )
za
        Validate that the cache key generated by _cache_key will be
        reasonable.
        zdata dependent outputzdynamic output shapezinplace viewzunsafe viewZliftzinductor::resize_storage_bytes_znon-builtinCompositeImplicitAutogradN)r0   TagZdata_dependent_outputtagsr<  Zdynamic_output_shapeinplace_viewatenZ_unsafe_viewr  lift_fnsr   _libraryutils
is_builtinis_viewrR   Z%_dispatch_has_kernel_for_dispatch_keyZDispatchKeyrz  )rA   rI   r   r   r,   r,   r-   ro    s&    
 z"FakeTensorMode._validate_cache_key)r   r  c                 C   sP  t |tr"t| t|  }g }|D ]}t |tr| |sLtd|jrZtd|j	dk	rltd|j
rztd|jtjtjtjtjfkrtdt |  tjrtdt|rtd|t| q*t |tjrtd	q*t |tjtjtjfrtdq*t |tttfr4|| | q*|t||f q*t|S )
a7  
        Translate the provided args into a form suitable for caching at FakeTensor
        dispatch, i.e., convert unhashable types like lists & dicts into tuples and
        convert FakeTensors into metadata. Raises _BypassDispatchCache to signal
        unsupported cases that should bypass caching.
        znot our fakezsymbolic shapeNconstant attributezsparse tensorzsparse tensor layoutzsymbolic nbyteszsparse compressed tensorznon-fake tensor)rc   rN   listkeysvaluesrd   rU  r<  _has_symbolic_sizes_stridesr   r4   r2   r0   Z
sparse_csrZ
sparse_cscZ
sparse_bsrZ
sparse_bscr.  r/  SymIntr   r   r0  r1   ZSymBoolZSymFloattupleextendrw  r/   )rA   r   resultr	  r,   r,   r-   rw    sB    






z"FakeTensorMode._prep_args_for_hash)rs  rI   r   r   rr  r  c                 C   s&  t |tstd|jdk	r$td|jr2tdt|rBtd| D ]}t|t|krJtdqJtt	|D ]*}t|| t|krtt
|ddd  S qtd}|jrdd	 t|D }	t	|	d
kst|	d }t|}
t
d|
|d}| |||}tj|}tj|}||kr"td|S )z
        Make a cache entry object for the given 'output' Tensor. Raises
        _BypassDispatchCache if the output tensor has characteristics that
        prevent caching it.
        znon-FakeTensor outputNr  zsparse outputzsparse compressed outputzkwarg aliases output)r9  r:  r;  c                 S   s    g | ]\}}t |tjr|qS r,   rc   r0   r1   )rZ   ir7   r,   r,   r-   r^   -  s      z4FakeTensorMode._make_cache_entry.<locals>.<listcomp>r;   r   zdispatch_key_set mismatch)rc   rd   r<  r   r4   r   r  rI  r  r  r8  r  	enumeraterh   r0  rm  r0   rR   Z_dispatch_key_set)rA   rs  rI   r   r   rr  Zkvalidxr;  Zidxsr:  rt  Zsynth_outputZsynth_key_setZkey_setr,   r,   r-   rq    sF    


    	
z FakeTensorMode._make_cache_entry)rt  rI   r   r  c              
   C   sX  |j dk	r||j  S |j}|r$|jr(ttj|j|j|j|j	d|j
d}|jr\tj|d |jrptj|d tj}| jdk	r| jj}|jr|tt|j  }t| . |  |||j|j|j W 5 Q R X W 5 Q R X nP|jdkr0| }t| . |  |||j|j|j W 5 Q R X W 5 Q R X |jdkrJ| d t| ||jS )z?
        Create a new FakeTensor from the cache entry.
        Nr   )r   r2   r   r   Tr   ) r9  r:  r4   rh   r0   empty_stridedr  r"  r   r2   r   r&  rR   Z	_set_conjr'  Z_set_neg
contextlibnullcontextr   Zsuppress_guardsr  r   r-  r;  r.  r   set_r$  r%  Zresize_rd   r   )rA   rt  rI   r   r:  r   Zmaybe_suppressZstorager,   r,   r-   rm  F  sP    

	
      z'FakeTensorMode._output_from_cache_entry)rr  rI   r  r   r   c                 C   s   z|  ||||}W nD tk
rX } z&td| d| d| d| |W 5 d}~X Y nX ztt|| W n> tk
r } z td| d| d| |W 5 d}~X Y nX dS )z
        Helper to validate that the output synthesized from the cache matches
        the output created by normal dispatch.
        z*FakeTensor cache crosscheck failure: func=z, args=z	, kwargs=z: Dispatch raised=N)rp  	Exceptionr  r   r   )rA   rr  rI   r  r   r   Ztrue_outputru  r,   r,   r-   rn  x  s     z'FakeTensorMode._crosscheck_cache_outputc              
   C   s   |pi }t   td||| W 5 Q R X |tkr>t| |S t tjkrdtddt | t }|t	krt
|  |||W  5 Q R  S Q R X | jr| ||||S | ||||S d S )Nz%s %s %sz'%sFakeTensorMode.__torch_dispatch__: %s )r   rH  r   r  getEffectiveLevelloggingDEBUGr?   r<   _DISPATCH_HANDLE_DIRECTLYr   rM  rv  rp  )rA   rI   r  r   r   incrr,   r,   r-   r[    s$      
zFakeTensorMode.dispatchc           !         s  t ||f\fddD }tdd |D pFtdd D jjk}|r`|rptrs|stdd |D st dfddD }t |\}}	||	}
t	|
t
jkr|
rt  |
 }
W 5 Q R X j|
d	d
S t}|r*dd D }td| tS |rt|dkrLt|dks^t| d| t	|d t
jkr|d S d}jr҈t
jjjjkrd|kr|d dkrd	}t
jjjjkrd	}\}~~tdd |D }t
jjjkrt
jj jkr|rt|dkrވs|sއfddD }t |\}}	t  ||	}
W 5 Q R X t !|
}dd |D }tfdd|D }|rt "t
jfdd|
S |D ]}#| qt \}}$|||  fdd	ddl%m&m'm(  t) 

j*rtdd |D rtfddD s	fddD }t |\}}||n*j*rt+d|j,rj,j-nd   
fd d!}r t. /}|d k	r ||f||S dd"l0m1} |kr2sdd#l0m3} |krs\t4rtd$d |D r | ||W  5 Q R  S Q R X , j5||}|tk	r|W  5 Q R  S W 5 Q R X d%j6j7krt8d&rt9s |j:||W  5 Q R  S Q R X t
j;j<j=>7 j?j@}|rt
j;j?At
j;j?Bfd'd< , |||}||W  5 Q R  W  5 Q R  S Q R X W 5 Q R X tCD ]<\}}|r|f||}|tk	r||  S qd,fd(d)	}tDs|| S z"tE ||}W 5 Q R X W nR tFk
rH }  z||  W Y S d } ~ X Y n$ tGk
rj   t+Hd*  Y nX |jI||/dd+S )-Nc                    s   g | ]}  |r|qS r,   )rU  r   r@   r,   r-   r^     s     
 z1FakeTensorMode._dispatch_impl.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S r.   )r  )rZ   r  r,   r,   r-   rb     s    z0FakeTensorMode._dispatch_impl.<locals>.<genexpr>c                 s   s   | ]}t |tjV  qd S r.   )rc   r0   r  rZ   rc  r,   r,   r-   rb     s     c                 s   s   | ]}|j d k	V  qd S r.   r   r   r,   r,   r-   rb     s    z. should not have fake inputs without constantsc                    s    g | ]}  |r|jn|qS r,   rU  r   r  r@   r,   r-   r^     s    Tr   c                 S   s   g | ]}t |rt|qS r,   )_check_for_subclass_argr/   ra   r,   r,   r-   r^     s     z,FakeTensorMode unrecognized subclass(es): %sr   r;   r  Fr   r   c                 s   s   | ]}|j d k	V  qd S r.   r   rZ   ru  r,   r,   r-   rb     s     c                    s    g | ]}  |r|jn|qS r,   r  r  r@   r,   r-   r^     s    c                 S   s   g | ]}t |tjr|qS r,   r  r   r,   r,   r-   r^   &  s      c                 3   s   | ]}  |V  qd S r.   )may_turn_constr   r@   r,   r-   rb   '  s     c                    s    j | ddS )NTr  )r   r6   )	converterrA   r,   r-   <lambda>,      z/FakeTensorMode._dispatch_impl.<locals>.<lambda>c                    sF   t | tr| jS t |  r>| j| jjjjjj	S | S d S r.   )
rc   rd   r   nodeZpytypeexprZxreplacer   Z
var_to_valunbacked_var_to_valr6   )SymTypesrA   r,   r-   maybe_to_real_tensor:  s    

z;FakeTensorMode._dispatch_impl.<locals>.maybe_to_real_tensor)compute_unbacked_bindingsfree_unbacked_symbolsr  c                 s   s   | ]}|j d k	V  qd S r.   )r   r  r,   r,   r-   rb   Q  s     c                 3   s<   | ]4}t |tjo2 | o2tfd dD V  qdS )c                 3   s   | ]}| j jkV  qd S r.   )r   r  rZ   r  r@   r,   r-   rb   W  s     z:FakeTensorMode._dispatch_impl.<locals>.<genexpr>.<genexpr>N)rc   r0   r  rg   r  )r  rA   symsr,   r-   rb   S  s
   
c                    s   g | ]} |qS r,   r,   r  )r  r,   r-   r^   \  s     z,propagate_real_tensors skipped %s(%s, %s) %sc                    sB   dd l   fdd}k	r>t||  j| dd | S )Nr   c                    sJ   t | tr|| _n4t |  rF| rFt | jjjrFj| jj| d S r.   )rc   rd   r   r  r  Symbolr   Zset_unbacked_var_to_val)r7   Zreal_t)r  r  rA   sympyr,   r-   goq  s
    
zOFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors.<locals>.goT)peek)r  r#   r   )Zfake_outr  )r  r  r  nilreal_outrA   )r  r-   maybe_propagate_real_tensorsn  s    zCFakeTensorMode._dispatch_impl.<locals>.maybe_propagate_real_tensors)
meta_tablerx   c                 s   s   | ]}|j  V  qd S r.   )r4   r  r,   r,   r-   rb     s     zprims::prim_meta_implc                      s    S r.   r,   r,   )ctxr,   r-   r    r  c                    sH   t jjrd S s s(t| d kr8t} t | S r.   )r0   r  r  Zcan_generate_trivial_fake_implcan_run_unsafe_fallbackrL   run_fallback_kernel)error)	args_specr  rI   has_symbolic_sizesrA   r,   r-   maybe_run_unsafe_fallback  s    z@FakeTensorMode._dispatch_impl.<locals>.maybe_run_unsafe_fallbackz*failed while attempting to run meta for %sr   )N)Jr   Ztree_flattenrg   rL  r  r   rf   rh   tree_unflattenr/   r0   r1   r  r   cloner   _check_for_subclassr  r   r   r  rV  r   r~  Z_to_copyr  primsZ
device_put%validate_and_convert_non_fake_tensorsr{  Znondeterministic_seededr|  r}  r   Ztree_map_onlyr   invalidate_written_to_constantsr   r  r  r  objectrK  rH  r   r  get_fast_op_implsr   rz   r  cpp_meta_supports_symintry   r   Z	decomposeru   r   hasattrstride_incorrect_opr  r  Zsimple_registryZ	singletonfindZabstract_implZkernelZAbstractImplCtxZset_ctx_getterop_implementations_checkshas_metar   NotImplementedErrorr  r]  +wrap_meta_outputs_with_default_device_logic)!rA   rI   r  r   r   flat_arg_fake_tensorsZis_lift_funcZconst_flat_argsZ
const_argsZconst_kwargsr   Zhas_unrecognized_typesr  Zavoiding_device_initZall_constantZflat_outZflat_out_tensorsr   Zreal_flat_argsZ	real_argsZreal_kwargsr  Z	fast_implr  ry   r   Zmaybe_abstract_implr  Zrun_impl_checkZop_implZop_impl_outr  Znot_implemented_errorr,   )r  r  r  r  r  r  r  rI   r  r  r  r  rA   r  r-   rp    sh   




 .
   




	 
	



0




   zFakeTensorMode._dispatch_implZ
debugprimsr  r~  ZxlaZvisionZ	torchtextZ
torchaudioZ	quantizedrv   c                 C   s"   | j s
dS |j| jkp | dkS )NFzfbgemm::gmm)rE  	namespace+_can_run_unsafe_fallback_allowed_namespacesr   rA   rI   r,   r,   r-   r    s
    
z&FakeTensorMode.can_run_unsafe_fallbackc                    s4   g  fddfddD }|fS )z
        Checks if the list of tensors are fake tensors.
        If not, try to convert them to fake tensors.
        Returns the original args, kwargs, and a flattened list of (args, kwargs) that are fake tensors.
        c                    s   t | tjs| S | stjjjkrNt \}}t	dt
|| jst | trp| jk	rpt	dt \}}t	dt
|| | } |  | S )NzECan't call metadata mutating ops on non-Fake Tensor inputs. Found in zMixing fake modes NYIzuPlease convert all Tensors to FakeTensors first or instantiate FakeTensorMode with 'allow_non_fake_inputs'. Found in )rc   r0   r1   rU  r{  r}  r|  r   r  rh   r   rF  rd   rs   r   r   )r]   r   r   )r  r  r  r  rI   rA   r,   r-   validate  s$    

zFFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.validatec                    s   g | ]} |qS r,   r,   r  )r  r,   r-   r^   (  s     zHFakeTensorMode.validate_and_convert_non_fake_tensors.<locals>.<listcomp>r,   )rA   rI   r  r  r  Zvalidated_argsr,   )r  r  r  r  rI   rA   r  r-   r    s    z4FakeTensorMode.validate_and_convert_non_fake_tensorsc                    s0   j d  d fdd}t||S )NFc                    s   t  tjs S d kr(t\ }|rVt jk fdd  S d k	rrn S 	 p|S n S d S )Nc                      s   dj  d  S )Nz-FakeTensor is wrapped to wrong device, found z, expected r   r,   )r  ru  r,   r-   r  C  r  zZFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap.<locals>.<lambda>)
rc   r0   r1   rd   r  rU  r  r   r   r   )ru  rU  r  r  r   r  rI   r  rA   ru  r-   wrap2  s.    

  zHFakeTensorMode.wrap_meta_outputs_with_default_device_logic.<locals>.wrap)rL  r"   )rA   r   rI   r  r   r  r,   r  r-   r  +  s
    !z:FakeTensorMode.wrap_meta_outputs_with_default_device_logicc                 C   s   t jj|jkrdS || jkS rM   )r0   r{  Z	view_copyr|  _cpp_meta_supports_symintr  r,   r,   r-   r  c  s    z'FakeTensorMode.cpp_meta_supports_symintc                 C   s.   |  tko,|j o,| | o,|jjdk S r   )ZnumelCONSTANT_NUMEL_LIMITr4   rU  r   r/   rT  r,   r,   r-   r  j  s    
zFakeTensorMode.may_turn_constc                 C   s   t dd |D }t|}|r| rt|||dd\}}| D ]N\}	}
|	dks\||	r`|	nd}	| |
rB||	rB|
jd k	rB| j	|
j qBd S )Nc                 s   s   | ]}|j d k	V  qd S r.   r   r  r,   r,   r-   rb   u  s     zAFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>T)r   r   Znormalize_to_only_use_kwargsinputrA   )
rg   rw   Z
is_mutabler   rP   Zhas_argumentrU  r   rL  r   )rA   rI   r  r   r   Zany_constantZschema_inforn   Z
new_kwargskr   r,   r,   r-   r  r  s$       
z.FakeTensorMode.invalidate_written_to_constants)rG  r   r   r   )r   c                C   sD   | j }|d kr| j}|r,|d ks(tdd }| jj| |||||dS )Nz2cannot set both static_shapes and symbolic_context)r   r   r   r   )r   rG  rh   rL  r   )rA   r   rG  r   r   r   r   r,   r,   r-   r     s"    	zFakeTensorMode.from_tensor)r,   N)r,   N)Jr)   r*   r+   rA  r   r1  r8  rG   rB  r-  rC  r   rD  rF   r   r   r   rB   rU  r   rV  rZ  r$   r
  r_  rb  r  r=  rh  rj  r   r
   r   rv  rl  ro  rw  rd   rq  rm  rn  r[  rp  rQ   r  r  r  r  r~  r   r#  r  r  Zas_strided_scatterZ
as_stridedZas_strided_r   detachZview_as_realZview_as_complexr  Zsource_Storage_storage_offsetZ(_sparse_coo_tensor_with_dims_and_tensorsr  r  Z
lift_freshZlift_fresh_copyr  r  r  r	   r   r   r  r,   r,   r   r-   r     s   

c





&

!

*3

H  
4



  C&*r   c              	      s   t jj|jkri t @  fddfdd|D }t||\}}|||}W 5 Q R X t }t |D ]&}	t|	t j	rr|	j
sr|	 j qr fdd}
t|
|S )Nc                    sB     | r>tj| | jd}| jr.||   | t|< |S | S )Nr   )rU  r0   Z
zeros_liker   r4   Z_coalesced_r)  rI  )ru  r   )rs   	inp_implsr,   r-   to_real_tensor  s    
z+run_fallback_kernel.<locals>.to_real_tensorc                    s   g | ]} |qS r,   r,   r  )r  r,   r-   r^     s     z'run_fallback_kernel.<locals>.<listcomp>c                    sl   t | kr0t| tjr0| js0|  jkr0t| tjrdt | krTt |  S  j | S n| S d S r.   )	rI  rc   r0   r1   r4   r   _cdatarL  r   r  )rs   r  orig_not_implemented_exceptionstoragesr,   r-   map_out  s    
z$run_fallback_kernel.<locals>.map_out)r0   r{  r}  r|  r   r   r  setrc   r1   r4   addr   r  r"   )rs   rI   r  r  r  r   r   r   Ztensor_implsru  r  r,   )rs   r  r  r  r  r-   r    s     	r  c                   @   s   e Zd Zdd ZdddZdS )FakeCopyModec                 C   s
   || _ d S r.   )rs   )rA   rs   r,   r,   r-   rB     s    zFakeCopyMode.__init__r,   Nc              
   C   s   |r|ni }|t jjjkr6|| jj|d ddf|S |t jjkrt|dkrZt|dks^t	|\}}t
||kr~|t
| S | jj|dd}||t
|< |S t j  |||W  5 Q R  S Q R X d S )Nr   T)rG  r  )r0   rR   Z
TensorBaser  rs   r   r1   __deepcopy__r  rh   rI  ZDisableTorchFunctionSubclass)rA   rI   r  r   r   r   memor   r,   r,   r-   __torch_function__  s"    zFakeCopyMode.__torch_function__)r,   N)r)   r*   r+   rB   r  r,   r,   r,   r-   r    s   r  c                 C   sB   t | dkrt| d tst| d jjr4tdS | d jS d S )Nr;   r   r   )	r  rc   rd   rh   rs   r   r0   r   r   r   r,   r,   r-   _device_handler  s    
r  c                 C   s   t dd | D S )Nc                 s   s   | ]}t |V  qd S r.   )r  ra   r,   r,   r-   rb     s     z&_check_for_subclass.<locals>.<genexpr>)rg   )r  r,   r,   r-   r    s    r  c                 C   s6   t | t o4t | tjo4t| tjk	o4t| tjjk	S r.   )rc   rd   r0   r1   r/   r   r   r\   r,   r,   r-   r    s    
r  c                 C   s   t dd | d  D S )Nc                 s   s   | ]}t |V  qd S r.   r-  r  r,   r,   r-   rb   !  s     <lambda>.<locals>.<genexpr>r   )r  r@  r  r,   r,   r-   r  !  r  r  c                 C   s   t dd | d  D S )Nc                 s   s   | ]}t |V  qd S r.   r  r  r,   r,   r-   rb   "  s     r  r   )r  r"  r  r,   r,   r-   r  "  r  c                 C   s   t | d  S )Nr   )r-  r$  r  r,   r,   r-   r  #  r  )_device_not_kwarg_ops_is_tensor_constructor_like_tensor_constructorscontains_tensor_typesr  r  r  r  )r  	functoolsr  r   rP  r   collectionsr   dataclassesr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r0   Ztorch._custom_opZtorch._loggingZtorch._C._functorchr   r   Ztorch._guardsr   Z
torch._opsr   Ztorch._prims_commonr   Ztorch._subclasses.meta_utilsr   r   r   r   r   Ztorch._utilsr   Ztorch.fx.operator_schemasr   Z torch.multiprocessing.reductionsr   Ztorch.overridesr   Ztorch.utils._mode_utilsr   Ztorch.utils._python_dispatchr   r    Ztorch.utils._pytreer!   r"   r#   Ztorch.utils._statsr$   Ztorch.utils._tracebackr%   r   r&   Ztorch.typesr'   r(   r8   rk  ZDimList	getLoggerr)   rH  Z_loggingZgetArtifactLoggerr  
ValueErrorru  rF   r  Z_pytreer   r:   ZTensorWeakRefZ_opsr   r~  r  r?   r<   r  rD   rH   rK   rL   rQ   contextmanagerrX   r`   rq   	lru_cacherw   r   r   r   r   r   r   r   r   r1   rd   r!  r0  r  r1  r8  r  r<  r=  r   r  r  r  r  r  r   r   r  r@  r"  r$  r  r)  r*  r+  r  Ztorch._subclasses.fake_implsr  r  r  r  r  r  r  r  r,   r,   r,   r-   <module>   s   4




	
	
	 O

+  !        	?

 
 
 
 


