o
    ei	                    @  s  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m	Z	 d dl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mZmZ d dlmZmZmZmZ d dl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-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 erd dl5m6Z6m7Z7 d dlm8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@ duddZAeBZCeddejDZEedZFedejDdZGedejDd d!ZHdvd$d%ZIdwd'd(ZJdxd)d*ZKdyd.d/ZLeM ZNd0eN_Oedzd2d3ZPd0d0d4d{d;d<ZQd|d>d?ZRd}dBdCZSd|dDdEZTd|dFdGZUd~dKdLZVddOdPZWddRdSZXedTeYZZedUeYZ[edVeYZ\e\d a]G dWdX dXZ^ed dYG dZd[ d[Z_ed dYG d\d] d]eeG Z`ed dYG d^d_ d_e`d` Zaed dYG dadb dbe`eG eeG ZbG dcdd ddeeeH ZcG dedf dfed0dgZdG dhdi dieeeH Zeed dYG djdk dkeeG ZfddodpZgddqdrZhG dsdt dteeG Zid dljmkZl dS )    )annotationsN)abstractmethod)AbstractContextManagercontextmanager)	dataclass)
AnyClassVarGenericNewTypeOptionalProtocolTYPE_CHECKING	TypeGuardTypeVarUnion)override	TypedDictTypeIsUnpack)CreationMeta)_add_batch_dim_unwrap_functional_tensor_wrap_functional_tensorget_unwrappedis_batchedtensoris_functorch_wrapped_tensoris_gradtrackingtensoris_legacy_batchedtensormaybe_get_bdimmaybe_get_levelpeek_interpreter_stack)enable_python_dispatcher)trace_structured)no_dispatch)is_traceable_wrapper_subclass)WeakIdKeyDictionary)Callable	Generator)CInterpreter)Source)
FakeTensorFakeTensorMode)ShapeEnvSymbolicContexttobjectreturnTypeIs[FakeTensor]c                 C  s   ddl m} t| |S )Nr   )r*   )torch._subclasses.fake_tensorr*   
isinstance)r.   r*    r4   f/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_subclasses/meta_utils.py_is_fake_tensor=   s   
r6   _TensorLikeTMetaTensorDesc[Any]_T_TensorT)bound_TensorT_covT)r;   	covariant(Union[MetaTensorDesc[Any], torch.Tensor]boolc                 C  s   z| j W S  ty   Y dS w )NF)is_leafRuntimeErrorr.   r4   r4   r5   safe_is_leafJ   s
   rC   Optional[_TensorLikeT]c                 C  s<   t jt jjj | jW  d    S 1 sw   Y  d S N)torch_logginghide_warnings	_internalsafe_grad_filtergradrB   r4   r4   r5   	safe_gradR   s   $rL   c                 C  s   t | }|d u rtd|S )Nz3Expected tensor to have a gradient but grad is None)rL   AssertionError)r.   rK   r4   r4   r5   _expect_safe_gradX   s   rN   abNonec                 C  s   | |krt |  d| d S )Nz != )rM   )rO   rP   r4   r4   r5   	assert_eq_   s   rR   FGenerator[None, None, None]c                  c  s0    t tdd} dt_z	d V  W | t_d S | t_w )Ndisable_inference_modeFT)getattrtlsrT   )priorr4   r4   r5   $disable_inference_mode_for_fake_propk   s   rX   skip_symbolic	skip_leaf Callable[[object, object], None]m1m2torch.TensorrZ   r[   c                  s:   t |tjrt |n|}d	 fdd||S )
Nr]   r8   r^   r_   r0   rQ   c                   s   | j |j  s | j|j  | j|j s  | j|j  | j|j ttdds6 | j|  n | jd  | j|   | j	|	   | j
d ut|d u | j
d ure| j
t| | jr | j|j  | j|   | j|   | j|  d S t| r | j|j  | j|   | j|  d S s | j|   | j|   | j|  | jr| jd u rtd|jd u rtd| j|j d S d S )NrT   Fz*m1.base must not be None for a view tensorz+m2._base must not be None for a view tensor)dtypeshaperequires_gradr@   	is_sparserU   rV   is_inferenceis_conjis_negrK   rL   rN   layout	dense_dim
sparse_dimis_coalescedis_sparse_compressedstridestorage_offsetis_view_is_viewbaserM   _base)r]   r^   rR   gor[   rZ   r4   r5   rs      sF   


zassert_metadata_eq.<locals>.go)r]   r8   r^   r_   r0   rQ   )r3   rF   TensorMetaTensorDescriberdescribe_tensor)rR   r]   r^   rZ   r[   r4   rr   r5   assert_metadata_equ   s   


-rw   TypeGuard[torch.Tensor]c                 C  s   t | tjo| jtju S rE   )r3   rF   rt   rg   
sparse_coorB   r4   r4   r5   is_sparse_coo   s   rz   rg   torch.layoutc                 C  s   | t jt jt jt jhv S rE   )rF   
sparse_csr
sparse_csc
sparse_bsr
sparse_bsc)rg   r4   r4   r5   is_sparse_compressed_layout   s   r   c                 C  s   t | tjo
t| jS rE   )r3   rF   rt   r   rg   rB   r4   r4   r5   rk      s   rk   c                 C  s   t | pt| S rE   )rz   rk   rB   r4   r4   r5   is_sparse_any      r   tytype[_T]objc                 C  s&   t || std|  dt| |S )Nz	expected z	 but got )r3   rM   type)r   r   r4   r4   r5   _checked_cast   s   
r   rp   torch.UntypedStoragec                 C     | j S rE   real_storage)rp   r4   r4   r5   _get_real_storage   s   r   r   c                 C  s
   || _ d S rE   r   )rp   r   r4   r4   r5   _set_real_storage   s   
r   MetaStorageIdMetaTensorId_DescriberIdc                   @  sV   e Zd ZdZddd dd	Zd!ddZd"ddZddd#ddZdddd$ddZdS )%ru   a  
    Given a Tensor/Storage, generate a MetaTensorDesc/MetaStorageDesc
    for it, which is enough information to reconstruct a meta tensor/fake tensor
    corresponding to a Tensor as faithfully as possible.

    This is a stateful conversion object because we keep track of the IDs
    of the tensors/storages passed to us, so we can consistently give
    the same ID when we see the same tensor/storage.
    F	copy_datar   r?   r0   rQ   c                C  sP   t | _tt d a td| _td| _t | _t | _	|| _
t | _t | _d S )N   r   )DESCRIBER_NEXT_IDidr   r   next_tensor_idr   next_storage_idr%   lookup_tensorlookup_storager   settraced_tensorstraced_storagesselfr   r4   r4   r5   __init__   s   

zMetaTensorDescriber.__init__r.   r_   r   c                 C  0   || j vr| j| j |< t| jd | _| j | S Nr   )r   r   r   r   r.   r4   r4   r5   get_tensor_id      

z!MetaTensorDescriber.get_tensor_idsr   r   c                 C  r   r   )r   r   r   r   r   r4   r4   r5   get_storage_id  r   z"MetaTensorDescriber.get_storage_idtracer   MetaStorageDescc                  sZ   t || jr|nd d |r+ jjvr+td fddd j j  S )N)r   sizedatadescribe_storagec                          jS rE   as_jsonr   r4   rr   r4   r5   <lambda>      z6MetaTensorDescriber.describe_storage.<locals>.<lambda>metadata_fn)r   r   r   r   r   r   r"   add)r   r   r   r4   r   r5   r   	  s   z$MetaTensorDescriber.describe_storageTrecurser   r   r8   c              	     s  t } }j}j}j}t}	t}
j}t}t	}t
}t}d }d}|sNt|sN|r;|	rN|sN|
sN|sNj d} }d }|s^t|s^|rZ|	r^ }d }d }d }|sh|rrjtd}n9|rjjdvr rtd|
st jtd}}ntj }jt|d}tjj }d }|
rtjj }W d    n1 sw   Y  d }d }d }|	rt dst!d" \}}fdd|D }t}dd	l#m$} t%&}t't(d
d}t)dFi d*d|d|rdn+ d|dj,d- dj.d|d|d|
d|d|d|d|d/ d0 dt1tj2j3d|	d|d|v r\| j45 nd d |d!|d"jd#6 d$|d%|d&t7t'd't8 d(t'd)i d*jst9r: nd d+jst9r; nd d,jr< nd d-|rǈjtj=tj>hv rǈj? dd.nd d/|rjtj=tj>hv rj@ dd.nd d0|rjtjAtjBhv rjC dd.nd d1|rjtjAtjBhv rjD dd.nd d2|r*t9r*jE dd.nd d3tF }d ur=j|dnd d4 rLtjjGHnd d5|d6|sX|r\tInd d7|rftJnd d8|r rjKd urjjKdnd d9tjLjMNd:|d;|d<|d=|d>|d?|d@|dAjOrnd  rň jPjQvrtRdB fdCdDdE jQS jP  S )GNr   r   xlalazyzVCannot safely fakify a view because this process drops the view information right now.__tensor_flatten__z>Traceable wrapper subclass must have __tensor_flatten__ methodc                   s"   i | ]}| j t|d qS )r   )rv   rU   ).0attr)r   r.   r   r4   r5   
<dictcomp>z  s    z7MetaTensorDescriber.describe_tensor.<locals>.<dictcomp>)_tensor_symint_registryrT   Fr   storagerd   r@   rb   ndimr`   rc   	is_mkldnnis_functorch_wrappedr   r   r   rn   re   rf   is_parameterr$   	is_nested
nested_intis_functionalrg   devicer   rl   rm   dynamo_dynamic_indices_dynamo_dynamic_indicesdynamo_hint_overrides_dynamo_hint_overridesri   rh   rj   crow_indicesr   col_indicesccol_indicesrow_indicesvaluesrK   creation_meta	unwrappedlevelbdimrp   	fake_mode	view_funcattrsctxr   functorch_stackautograd_meta_fromcurrent_levelr   rv   c                     r   rE   r   r4   r   r4   r5   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   r4   )TrC   ro   rc   rg   r   r$   r   r   r   r   r   rF   _is_functional_tensorr   r   untyped_storagerm   rl   rv   r   r   r   rA   _sync_from_functional_tensor_C$_functionalization_reapply_views_tlsr   
_functorchr   pyfunctorch#temporarily_clear_interpreter_stackhasattrrM   r   $torch.nested._internal.nested_tensorr   ViewFuncfrom_tensorrU   rV   MetaTensorDescr   rd   rb   dimr`   re   rf   r3   nn	Parameternoder   r   listr   rk   ri   rh   rj   r|   r~   r   r   r}   r   r   r   r   rL   	_autograd_get_creation_metar   r   rq   _subclassesfake_tensormaybe_get_fake_moder   r   r   r"   r   ) r   r.   r   r   r@   rn   rc   rg   r   is_traceable_wrapper_subclass_vr   r   is_batchedtensor_vis_legacy_batchedtensor_vis_gradtrackingtensor_vr   r   rm   rl   r   r   r   reapply_viewsmaybe_functorch_stackr   r   type_v	raw_attrsr   r   is_inference_mode_disabledrK   r4   )r   r   r.   r   r5   rv     s  









 !"#%&')+,27<AFKOQTWZ]^`abfghikz#MetaTensorDescriber.describe_tensorNr   r?   r0   rQ   )r.   r_   r0   r   )r   r   r0   r   )r   r   r   r?   r0   r   )r.   r_   r   r?   r   r?   r0   r8   )	__name__
__module____qualname____doc__r   r   r   r   rv   r4   r4   r4   r5   ru      s    


ru   )frozenc                   @  s0   e Zd ZU ded< ded< ded< dddZdS )r   r   r   intr   Optional[torch.UntypedStorage]r   describer_idr   r0   dict[str, object]c                 C  s*   | j |t| jtr| jdS t| jdS )N)r   r  r   )r   r3   r   r  repr)r   r  r4   r4   r5   r     s   zMetaStorageDesc.as_jsonNr  r   r0   r	  )r  r  r  __annotations__r   r4   r4   r4   r5   r     s
   
 r   c                   @  s.   e Zd Ze		ddd
dZedddZdS )r   Nr.   r:   new_basesymint_visitor_fnOptional[Callable[[int], int]]tensor_visitor_fn,Optional[Callable[[torch.Tensor], _TensorT]]r0   c                 C     d S rE   r4   r   r.   r  r  r  r4   r4   r5   apply  s   zViewFunc.applyr_   ViewFunc[Any]c                 C  s   t | rt S t| jS rE   )r6   _FakeTensorViewFunc_CustomViewFunc_view_func_unsaferB   r4   r4   r5   r     s   
zViewFunc.from_tensorNN)
r.   r:   r  r:   r  r  r  r  r0   r:   )r.   r_   r0   r  )r  r  r  r   r  staticmethodr   r4   r4   r4   r5   r     s    r   c                   @  s    e Zd Ze		ddddZdS )r  Nr.   r_   r  r  r  r  .Optional[Callable[[torch.Tensor], FakeTensor]]r0   r*   c                 C  s   t jjj||||S rE   )rF   r   r   r*   r  r  r4   r4   r5   r     s   
z_FakeTensorViewFunc.applyr  )
r.   r_   r  r_   r  r  r  r  r0   r*   )r  r  r  r   r  r4   r4   r4   r5   r    s
    r  r*   c                   @  s*   e Zd ZU ded< e		ddddZdS )r  zpCallable[[torch.Tensor, Optional[Callable[[int], int]], Optional[Callable[[torch.Tensor], _TensorT]]], _TensorT]funcNr.   r_   r  r  r  r  r  r0   r:   c                 C  s   |  |||S rE   )r  r  r4   r4   r5   r  <  s   	z_CustomViewFunc.applyr  )
r.   r_   r  r_   r  r  r  r  r0   r:   )r  r  r  r  r   r  r4   r4   r4   r5   r  1  s   
 	r  c                   @     e Zd Zd
ddZd	S )_MetaTensorCallbackargCallable[[], torch.Tensor]r   Union[torch.device, str]r0   r<   c               C  r  rE   r4   )r   r  r   r4   r4   r5   __call__N  s   z_MetaTensorCallback.__call__N)r  r   r   r!  r0   r<   r  r  r  r"  r4   r4   r4   r5   r  M      r  c                   @  s   e Zd ZU ded< dS )_MetaTensorCallbackKwargsr!  r   N)r  r  r  r  r4   r4   r4   r5   r%  S  s   
 r%  )totalc                   @  r  )_MetaTensorCallbackOptDevicer  r   kwargs!Unpack[_MetaTensorCallbackKwargs]r0   r<   c                K  r  rE   r4   )r   r  r(  r4   r4   r5   r"  \  s   z%_MetaTensorCallbackOptDevice.__call__N)r  r   r(  r)  r0   r<   r#  r4   r4   r4   r5   r'  [  r$  r'  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ed< ejZded< dZded< dZded< dZ	ded< dZ
ded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded < dZded!< dZded"< dZded#< dZded$< dZded%< dZd&ed'< d(Zded)< dZd*ed+< dZded,< dZded-< dZd.ed/< dZd0ed1< dZd0ed2< dZ d0ed3< dZ!d0ed4< dZ"d0ed5< dZ#d0ed6< dZ$ded7< dZ%d0ed8< dZ&d9ed:< dZ'd;ed<< dZ(d0ed=< h d>Z)d?ed@< dZ*dAedB< dZ+dCedD< dZ,dEedF< dZ-dGedH< dZ.dedI< dZ/dedJ< dZ0dKedL< dZ1dMedN< dZ2dMedO< dXdTdUZ3e4dYdVdWZ5dS )Zr   r   r   r  r   torch.dtyper`   ztorch.devicer   tuple[int, ...]r   z	list[int]r   zdict[int, int]r   r{   rg   Fr?   rd   r@   rb   rc   r   r   r   r   r   rn   r   NzOptional[int]r   r$   r   re   rf   r   Optional[tuple[int, ...]]rl   r   rm   zOptional[MetaStorageDesc]r   ri   rh   zOptional[bool]rj   zOptional[MetaTensorDesc[Any]]r   r   r   r   r   r   r   rp   z(Optional[dict[str, MetaTensorDesc[Any]]]r   zOptional[CreationMeta]r   rK   >
   r   r   r   r   r   r   r   r   r   r   zClassVar[set[str]]_UNSERIALIZABLEzOptional[object]r   zOptional[type]r   zOptional[FakeTensorMode]r   zOptional[ViewFunc[Any]]r   r   r   zOptional[list[CInterpreter]]r   Optional[torch.Tensor]r   r   r  r   r0   r	  c                   s:   d fdd  fdd	t D }|d
|i |S )Nkstrvr/   r0   c                   s    dv rd S  t jv rt|S t|tjtjtjfrt|S t|tjr(t|S t|t	t
fr9 fdd|D S t|tt frC|jS t|trLt|S  dkr^t|tr^dd | D S |S )N)r   r   c                   s   g | ]} |qS r4   r4   )r   v1)jsonr/  r4   r5   
<listcomp>      z8MetaTensorDesc.as_json.<locals>.json.<locals>.<listcomp>r   c                 S  s   i | ]\}}||j qS r4   )r   )r   k1r2  r4   r4   r5   r     s    z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)r   r-  r
  r3   rF   r   r`   rg   SymInttupler   r   r   r   r0  dictitems)r/  r1  )r3  )r/  r5   r3    s"   

z$MetaTensorDesc.as_json.<locals>.jsonc                   sL   i | ]"}t |j|ju s$|jd krt |jr|j |jt |jqS r   )rU   namedefault)r   fieldr3  r   r4   r5   r     s    

z*MetaTensorDesc.as_json.<locals>.<dictcomp>r  )r/  r0  r1  r/   r0   r/   )dataclassesfieldsupdate)r   r  r   r4   r?  r5   r     s   zMetaTensorDesc.as_jsonc                 C  r   rE   )r   r   r4   r4   r5   ra     s   zMetaTensorDesc.shaper  )r0   r+  )6r  r  r  r  rF   stridedrg   rd   r@   rb   rc   r   r   r   r   r   rn   r   r   r$   r   re   rf   r   rl   rm   r   ri   rh   rj   r   r   r   r   r   r   r   rp   r   r   rK   r-  r   r   r   r   r   r   r   r   r   r   propertyra   r4   r4   r4   r5   r   d  sr   
 

$r   dstsrcr.  c                 C  s    t |tjur	d S | | d S rE   )r   rF   rt   copy_)rF  rG  r4   r4   r5   
_safe_copy	  s   rI  c                 C  s   t | tjur	d S |  S rE   )r   rF   rt   clone)rG  r4   r4   r5   _safe_clone  s   rK  c                   @  s   e Zd Zddd=ddZd>d	d
Zd?ddZd@ddZdAddZdBddZdCddZ	dDd d!Z
edEd#d$Ze	%dFdGd)d*ZedHd+d,ZdId5d6Z	%dFd%d%d%d7d8dJd;d<Zd%S )KMetaConverterFr   r   r?   r0   rQ   c                C  sB   t  | _t  | _d| _d| _d | _d| _|| _t	|d| _
d S )Nr   r   )weakrefWeakValueDictionarystorage_memotensor_memohitmissdel_hookarg_cntr   ru   	describerr   r4   r4   r5   r     s   zMetaConverter.__init__c                 C  s   | j dko	| jdkS )Nr   )rQ  rR  rC  r4   r4   r5   
successful2  s   zMetaConverter.successfulr.   r8   r.  c                 C     | j |jd S rE   )rP  getr   r   r4   r4   r5   get_tensor_memo5  r   zMetaConverter.get_tensor_memor:   c                 C  s.   | j |jd }|d u rtd|j d|S )NzTensor memo for id z is None)rP  rX  r   rM   )r   r.   r   r4   r4   r5   _checked_get_tensor_memo8  s   z&MetaConverter._checked_get_tensor_memor1  c                 C     || j |j< d S rE   )rP  r   )r   r.   r1  r4   r4   r5   set_tensor_memo>  r   zMetaConverter.set_tensor_memor   r   r  c                 C  rW  rE   )rO  rX  r   r   r4   r4   r5   get_storage_memoA  r   zMetaConverter.get_storage_memor   c                 C  r[  rE   )rO  r   )r   r   r1  r4   r4   r5   set_storage_memoD  r   zMetaConverter.set_storage_memocallback0Callable[[Callable[[], torch.Tensor]], _TensorT]c              	     s   |    }d u rV| fdd }| jrNt , t   jd u r(tdt| j	  W d    n1 s:w   Y  W d    n1 sIw   Y  | 
 | |S |S )Nc                     s   t j jt jddS Nmetar`   r   )rF   emptyr   uint8r4   r   r4   r5   r   P  s    z,MetaConverter.meta_storage.<locals>.<lambda>z.s.data must not be None when copy_data is True)r]  r   r   rF   no_gradr#   r   rM   r   rJ  r^  )r   r   r_  memor_sr4   rf  r5   meta_storageG  s&   

 zMetaConverter.meta_storager_   c                 C  s   t t|S rE   )typingcastr:   )clsr.   r4   r4   r5   _checked_cast_tensor_t`  s   z$MetaConverter._checked_cast_tensor_tNr   r   "Optional[Union[torch.device, str]]c                 C  s   |  | S rE   )rn  )rm  r.   r   r4   r4   r5   _identity_callablee  s   z MetaConverter._identity_callablec                 C  s$   t jjdd}||}tt|S )Nz9Internal error: Tried to backward() through example inputr   )rF   r   
_functionsDelayedErrorrk  rl  r:   )rm  r.   errfnerrr4   r4   r5   _backward_errorm  s   zMetaConverter._backward_error	shape_envOptional[ShapeEnv]	callback__MetaTensorCallback[_TensorT]sourceOptional[Source]symbolic_contextOptional[SymbolicContext]c           !        s  t j|jdd u rddlm} |dtj d}tj	 
tjjjr-t| jd7  _tj	d ur>	jfd_	fddfd`fdd}fda	fdddbfd#d$	fdcfd&d'}	d u rd( tj jrj}
fd)d*}jrՈjd u rtd+t ) t  t|std,tj|_W d    n1 sw   Y  W d    n1 sw   Y  t|std-|t j! j"rd.|_"j"r|
s#|$ }t%  |t j! W d    n	1 sw   Y  n$t&j'rj}
j'tj(tj)hv r_j*d u r5td/j+d u r?td0j,d u rItd1j-j* j+ }j,j.|d |d2  nd3j'tj/tj(hv rzj0d u rutd4j0j1nj2d u rtd5j2j1fd6d*}jr؈jd u rtd+t + t  t|std,tj|_W d    n	1 sw   Y  W d    n	1 sw   Y  t|std-j"rd.|_"j"r|
s3|}nFj4rj5sdd7l6m7} |d8t8d9g d: n,j9rj}
\
}
fd;d*}jrt X t D j:d u r@td<j;d u rJtd=t|sStd,tj<j:j;j1jd>|_jd u rktd+t=|jj W d    n	1 s}w   Y  W d    n	1 sw   Y  t|std-j"rd.|_"j"r|
s3|}nj>rۈj?rdd7l6m7} |d?t8d9g d: dd 	fd@dA}naj@rjjAdBvrjBd u rtdCj>rtdDCjB	}#tD|}tEjF| n)j?r~jGd u r!tdEd }	rId urIddFlHmI} tJ|s@tdGtA jKd urIjK}CjG	tjLjMNdH|}ddIlHmO} |	| dedNdO}tjPtjjjQ}tjRtjjjQdP z|j1j1krn+||j1j1r#tS|}n|j1|j1r#tT|}n	#|Uj1}jrt  |	|}W d    n	1 sw   Y  j"|_"n{jGj"j"krt%  |	|}W d    n	1 sw   Y  nXj"stdQt % tV  #|U|j.}W d    n	1 sw   Y  W d    n	1 s+w   Y  j"|_"t%  |	|}W d    n	1 sIw   Y  jWd u rXtdRtjjXY|jW W tjRtjjjQ| ntjRtjjjQ| w j|_Znj}
j[sj\sj>sj]rt^W  d    S \
}j5r
dS}ni
fdTd*}jrt N t : j:d u rtd<j;d u rtd=t|std,tj<j:j;j1jd>|_t=|jj W d    n	1 sw   Y  W d    n	1 sw   Y  t|s!td-j"r1j"|_"|
s13|}j_}|d u r=tdU|j`javr|j4sV|; kr|b |krc||d  jrt|sktd,|jd u rutdVte|d |jd  njf|dW}t }ddXlgmh}mi} ||}|d ur||}t   { | |j||
 W d    n	1 sw   Y  jrt G t 3 t|std,|jd u rtdVj;d u rtd=|jjtk|jbj:j; W d    n	1 sw   Y  W d    n	1 sw   Y  W d    n	1 s'w   Y  W d    n	1 s7w   Y  jld urVddYlmN} Cjl	|dZ|_ltjm|jn tjo|jp W d    n	1 sqw   Y  j\o~jq k}trts|d.|d[ dd\lHmt}  j_d ur| j_j:dkr|d ud jvrd.|_wjxd urt|std]|jyjzjxd^|_{|| }S )fNr   r   )ConstantSource__meta_utils_unknown_tensora   This indicates you set no_dispatch() before calling into this function.  This is an error: we may be creating fake tensors and will perform operations on them which need fake tensor mode to be active.  You will segfault if you are in a no_dispatch() block.r   r.   r8   rG  torch._guards.Sourcer|  ?Optional[torch.fx.experimental.symbolic_shapes.SymbolicContext]r0   ,tuple[tuple[int, ...], tuple[int, ...], int]c              	     s&  ddl m  jd u rtdd urj}t fddjD p2t fddjD p2 j}|d urD|ju rDjjjfS |d urV|sV|d u rVjjjfS t	fddjD }t	fddjD }
j}j|||fd	d
tjD ||jdS jjjfS )Nr   is_symbolict.stride must not be Nonec                 3      | ]} |V  qd S rE   r4   r   szr  r4   r5   	<genexpr>      zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  r  rE   r4   r   sdr  r4   r5   r    r  c                 3      | ]}  |V  qd S rE   #_maybe_specialize_sym_int_with_hintr  rv  r4   r5   r    
    
c                 3  r  rE   r  r  r  r4   r5   r    r  c                   s   g | ]}| j v qS r4   r;  )r   drB   r4   r5   r4    r5  zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>)r|  hint_overrides)%torch.fx.experimental.symbolic_shapesr  rl   rM   r   anyr   rm   rv  r8  r  -_create_symbolic_sizes_strides_storage_offsetranger   r   )r.   rG  r|  r   has_symbolict_sizet_stridet_storage_offsetr  )r  r.   r5    sym_sizes_strides_storage_offset  sH   

zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetinner_t	inner_srcr_   c                   s&    | ||\}}}t j||| jddS ra  rF   empty_stridedr`   )r  r  r|  inner_sizesinner_strides_inner_storage_offset)r  r4   r5   empty_create  s   
z/MetaConverter.meta_tensor.<locals>.empty_create
outer_sizer+  outer_striderz  Optional[torch._guards.Source]r:   c                   s  ddl m  ddlm | jd u rtd| jd u rtd|d ur$|n| j}|d ur-|n| j}|d urBt	|sBtdt| d fdd|d u rUtd| ||||}|j
|krrtd| j d| d|j
 | |krtd| j d| d|  |S )Nr   
AttrSource)SubclassSymbolicContext%t.attrs must not be None for subclass$t.type must not be None for subclassz.Expected SubclassSymbolicContext or None, got r.   r8   r  r,  r  r|  r  r_  &_MetaTensorCallbackOptDevice[_TensorT]rz  r  r0   r:   c                   s   | j d u r| |||S i }| j  D ]F\}}d }	|d ur?t|s-tdt| |j|  }
d ur?ttj	j
jj|
}	 ||}tj||jd}||j|j|	||}|||< q| jd u retd| j|| j||S )Nz&Expected SubclassSymbolicContext, got r~  r  )r   meta_tensorr:  r3   rM   r   inner_contextsr   rF   fxexperimentalsymbolic_shapesr-   	functoolspartialr   r   rl   __tensor_unflatten__r   )r.   r  r  r|  r_  rz  inner_tensorsr   meta_tensor_desccurrent_contextcurrent_context_current_sourceinner_callbacknew_empty_tensor)r  r  _empty_create_subclassr   rv  r4   r5   r  (  sR   






zXMetaConverter.meta_tensor.<locals>.empty_create_subclass.<locals>._empty_create_subclasszsource must not be NonezExpected return value from z.__tensor_unflatten__() to have shape equal to z, but got: z/__tensor_unflatten__() to have stride equal to )r.   r8   r  r,  r  r,  r|  r  r_  r  rz  r  r0   r:   )torch._dynamo.sourcer  r  r  r   rM   r   r   rl   r3   ra   )r.   r  r  r|  rz  sub)r_  r   rv  )r  r  r  r5   empty_create_subclass  sJ   	


9


z8MetaConverter.meta_tensor.<locals>.empty_create_subclassrv  8Optional[torch.fx.experimental.symbolic_shapes.ShapeEnv]r_  ry  5torch.fx.experimental.symbolic_shapes.SymbolicContextc                   s   ddl m} ddlm}m}m} d }| jr)| jd u rtd | j||d||}|j	g| j
 }	| jrq| jd u r<tdi }
| j D ]\}}t|tsUtdt|  |||||||
|< qC||	d g| j
 |
||d}|S ||	d g| j
 |d	}|S )
Nr   r  )
DimDynamicStatelessSymbolicContextr  't.base must not be None for view tensorrq   r  zExpected attr to be str, got )dynamic_sizesconstraint_sizesr  tensor_sourceview_base_context)r  r  r  )r  r  r  r  r  r  rn   rp   rM   DYNAMICr   r$   r   r:  r3   r0  r   )r.   rz  rv  r_  r  r  r  r  r  t_dynamic_sizesr  r   innert_symbolic_context)all_dynamic_symbolic_contextr4   r5   r  {  sL   





z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_contextrp   c              	     s  t   
|	\}}}|js7t| s7  | |||W  d    W  d    S 1 s2w   Y  ddlm  ddlmm} d fdd}i |jr|j	d u r]t
d	|jd u rft
d
|||d}| \}	}
|	D ]}t|||j	| j< qufd fdd}|jd u rt
d|j|| ||}t|| | t|| | t|| | |W  d    S 1 sw   Y  d S )Nr   )EphemeralSource)r  sym_eqr   r  r0   c                   sn   ddl m  d uotot fddjD }|s!d u r#| S d}j| |d d}j|| |dS )Nr   r  c                 3  s    | ]}| j u V  qd S rE   )STATIC)r   xr  r4   r5   r    r  z_MetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fn.<locals>.<genexpr>r  )positive)hintrz  )r  r  r3   allr  create_symbolcreate_symintnode)r   all_static_sizes
sym_sourcesymbol)r  r  rv  r|  r  r5   r    s   		zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnr  r  r  r  	visited_tr_   rv  r  r_  r  c                   s^   | d u rd S j | }|}|d ur|S j | } d}||||||||S )Nr  )rU  r   rX  rv   r  )r  rv  r_  
visited_idfake_visited_tvisited_desctemp_source)r  r  real_to_fake_mappingr   r4   r5   r  %  s"   

zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.tensor_visitor_fnz,t.view_func must not be None for view replay)r   r  r0   r  )r  r_   rv  r  r_  r  r0   r_   )r!   r$   rn  
as_stridedr  r  r  r  r  r   rM   r   r   rU   r   r   r  rF   _checkr   rl   rm   )rp   r.   rv  sizesstridesrm   r  r  fake_tr   _r   r  )r  r_  r  maybe_suppressr   rz  r  r|  )r  r  r  rv  r5   view_from_base  sX   



, $z1MetaConverter.meta_tensor.<locals>.view_from_basec                     s$   t jjj j j j jt jddS )Nrb  )r`   rg   r   )	rF   opsaten_sparse_coo_tensor_with_dimsri   rh   r   r`   ry   r4   rB   r4   r5   r   l  s    z+MetaConverter.meta_tensor.<locals>.<lambda>.t.data must not be None when copy_data is TruezExpected r to be a FakeTensorz)the callback you passed in doesn't detachTz5t.sparse_dim must not be None for sparse block layoutz4t.dense_dim must not be None for sparse block layoutz1t.values must not be None for sparse block layout   r4   z9t.crow_indices must not be None for sparse csr/bsr layoutz9t.ccol_indices must not be None for sparse csc/bsc layoutc                
     s&   t jjjdjj jjddS )Nr   rb  )rg   r`   r   )rF   r  r  #_sparse_compressed_tensor_with_dimsrh   ra   rg   r`   r4   )	blocksizeindex_dtyper.   r4   r5   r     s    )unimplementedz;attempted to apply meta conversion to strided nested tensorzThis is not supported.)gb_typecontextexplanationhintsc                        t j jddS ra  r  r4   r  r  r.   r4   r5   r     s    
z.t.size must not be None when copy_data is Truez0t.stride must not be None when copy_data is Truerc  z;attempted to apply meta conversion to view functorch tensorc              	     s  j rMjd u rtdjd u rtdjd u rtdj}j}j}tjjj	 
t|||}W d    |S 1 sFw   Y  |S jrƈjd u rYtdjd u rbtdtjj}|  j}W d    n1 syw   Y  j}|kr|}n#tjjj	 
tjj||}W d    n1 sw   Y  j}jrt|rd|_|S jr|sĈ|}|S jrjd u rtdjd u rtdj	}
t|j}|S jd u rtd	j j fd
d}jr^t D t ' tjjjjjd|_ j!d u r.tdt"|j j! W d    n1 s@w   Y  W d    |S W d    |S 1 sYw   Y  |S )Nz.t.unwrapped must not be None for batchedtensorz*t.level must not be None for batchedtensorz)t.bdim must not be None for batchedtensorz3t.unwrapped must not be None for gradtrackingtensorz/t.level must not be None for gradtrackingtensorT2t.unwrapped must not be None for functional tensorz6t.current_level must not be None for functional tensorr  c                     r  ra  r  r4   r  r4   r5   r   r      zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>rc  r  )#r   r   rM   r   r   rF   r   r   %temporarily_restore_interpreter_stackr   rn  r   r   r   _DisableFuncTorch_wrap_for_gradr@   rb   rC   ru  r   r   r  r   rl   r   r   rg  r#   r  r`   r   real_tensorr   rI  )r.   ftlvlr   r   disable_functorchr@   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorr_  r   rv  rz  r|  r  r5   r    s   





WW

8

6


!
	*z2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   r  z0Expected non-functorch wrapped functional tensorr  )r  z'Expected StatelessSymbolicContext, got rq   )compute_unbacked_bindingscomplex_dtyper*  
real_dtyper?   c                 S  s   t | ot | |kS rE   )utilsis_complex_dtypecorresponding_real_dtype)r  r	  r4   r4   r5   	is_c_of_r  s
   
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFz.t.requires_grad must be True for non-leaf viewz0t.creation_meta must not be None for view tensorr  c                     r  ra  r  r4   r  r4   r5   r   G  r  zt.storage must not be Nonez5r.real_tensor must not be None when copy_data is True)r_  )in_kernel_invocation_managerr   r  rK   rY   )guard_or_falsez,Expected r to be a FakeTensor for nested int)nt_tensor_id)r.   r8   rG  r  r|  r  r0   r  )r  r8   r  r  r|  r  r0   r_   )r.   r8   r  r+  r  r+  r|  r  rz  r  r0   r:   )
r.   r8   rz  r  rv  r  r_  ry  r0   r  )rp   r:   r.   r8   rv  r  r0   r:   r.   r8   r0   r:   )r  r*  r	  r*  r0   r?   )~r  r  r   r  r  lenrP  rF   r   _dispatch_tls_local_exclude_sethasDispatchKeyPythonrM   rT  
contextlibnullcontextsuppress_guardsrY  inference_moderd   rc   r@   r   r   rg  r#   r6   rK  r  rC   _coalesced_r?   rj   rb   rn  rJ  enable_gradr   rg   r~   r   ri   rh   r   r   ra   r|   r   r`   r   ru  r   r$   torch._dynamo.excr  r0  r   r   rl   r  rI  r   rn   r   r   r   r  _to_functional_tensor_mirror_autograd_meta_tor   rp   r  r  r3   r  _dynamorz  r  r  &_dispatch_tls_is_dispatch_key_excludedADInplaceOrView'_dispatch_tls_set_dispatch_key_excludedview_as_realview_as_complexviewr!   r   r   _set_creation_metafake_devicer   r   r   NotImplementedr   r   rO  rm   r^  r   r   rj  r2   r  r   set_r   rK   	_set_conjre   _set_negrf   r   rw   rR   r  resize_r   	_is_paramr   r   create_symbolic_nested_intnested_int_memor\  rZ  )!r   r.   rv  rx  rz  r|  r  msgr  r  r@   r   	batch_dimr  _storage_offsetr   base_symbolic_contextr  rp   r  r  old_excludemidrm   r   ri  maybe_fake_mgrr  r   mb_fake_moder  r[   r  r4   )r  r  r  r  r_  r  r  r  r   rv  r  rz  r  r  r|  r.   r5   r  |  sH  <zY 


 


 



 

	q






 


      
\
 





          ~

zMetaConverter.meta_tensorT)r_  rz  r|  r   'Optional[_MetaTensorCallback[_TensorT]]r   c                  s  |d u r j }n|}t|tjr7|jjdks&|js&| r/|jd ur/|jj	r/  j
d7  _
tS   jd7  _ntj|rF  j
d7  _
tS |S d u rNd} jj||d|rld u r`tdtd fddd	 t *}|tjj  t }	|	d ur|tjj   |||}
W d    n1 sw   Y  t|tjju rd
|
_ t!|ddrd
|
_"t#|dr|j$|
_$|
S )Nr   r   Fr   z*source must not be None when trace is Truedescribe_sourcec                     s    j jjjdS )N)r  r   rz  )rU  r   r<  r4   r   rz  t_descr4   r5   r   =  s   z(MetaConverter.__call__.<locals>.<lambda>r   T
_is_buffer
persistent)%rp  r3   rF   rt   r   r   is_quantizedro   rq   rc   rR  r)  rQ  	overridesis_tensor_likerU  rv   rM   r"   r  	ExitStackenter_context	_dispatchpythonsuspend_functionalizationr    r   r   r   r  r   r   r.  rU   r=  r   r>  )r   r.   rv  r_  rz  r|  r   rx  
exit_stackstr   r4   r;  r5   r"    sb   


zMetaConverter.__call__r   )r0   r?   )r.   r8   r0   r.  r  )r.   r8   r1  r:   r0   rQ   )r   r   r0   r  )r   r   r1  r   r0   rQ   )r   r   r_  r`  r0   r   )r.   r_   r0   r:   rE   )r.   r   r   ro  r0   r:   )r.   r:   r0   r:   )r.   r8   rv  rw  rx  ry  rz  r{  r|  r}  r0   r:   )r.   r_   rv  rw  r_  r9  rz  r{  r|  r}  r   r?   r0   r:   )r  r  r  r   rV  rY  rZ  r\  r]  r^  rj  classmethodrn  rp  ru  r  r"  r4   r4   r4   r5   rL    sB    







         rL  )r.   r/   r0   r1   )r.   r>   r0   r?   )r.   r7   r0   rD   )r.   r7   r0   r7   )rO   r9   rP   r9   r0   rQ   )r0   rS   )rR   r\   r]   r>   r^   r_   rZ   r?   r[   r?   r0   rQ   )r.   r/   r0   rx   )rg   r{   r0   r?   )r   r   r   r/   r0   r9   )rp   r   r0   r   )rp   r   r   r   r0   rQ   )rF  r_   rG  r.  r0   rQ   )rG  r_   r0   r.  )m
__future__r   r  r@  r  	threadingrk  rM  abcr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   typing_extensionsr   r   r   r   rF   torch._C._autogradr   torch._C._functorchr   r   r   r   r   r   r   r   r   r   r    torch._dispatch.pythonr!   torch._loggingr"   torch.utils._mode_utilsr#   torch.utils._python_dispatchr$   torch.utils.weakr%   collections.abcr&   r'   r(   torch._guardsr)   r2   r*   r+   r  r,   r-   r6   r   DimListrt   r7   r9   r:   r<   rC   rL   rN   rR   localrV   rT   rX   rw   rz   r   rk   r   r   r   r   r  r   r   r   r   ru   r   r   r  r  r  r%  r'  r   rI  rK  rL  torch._prims_common_prims_commonr
  r4   r4   r4   r5   <module>   s    04





?









  	 
%
          V