o
     ƎiT                    @  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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l0m1Z1 d dl2m3Z3 d dl4m5Z5 erd dl6m7Z7 d dl m8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@ dtddZAeBZCeddejDZEedZFedejDdZGedejDd d!ZHdud$d%ZIdvd'd(ZJdwd)d*ZKdxd.d/ZLeM ZNd0eN_Oedyd2d3ZPd0d0d4dzd;d<ZQd{d>d?ZRd|dBdCZSd{dDdEZTd{dFdGZUd}dKdLZVd~dOdPZWddRdS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 djd deeG ZfddndoZgddpdqZhG drds dseeG Zid dljmkZl dS )    )annotationsN)abstractmethod)AbstractContextManagercontextmanager)	dataclass)
AnyCallableClassVarGenericNewTypeOptionalProtocolTYPE_CHECKINGTypeVarUnion)override	TypedDict	TypeGuard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)	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   X/home/jeff/fluffinator/venv/lib/python3.10/site-packages/torch/_subclasses/meta_utils.py_is_fake_tensor=   s   
r6   _TensorLikeTMetaTensorDesc_T_TensorT)bound_TensorT_covT)r;   	covariant#Union[MetaTensorDesc, 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s
J |S rE   )rL   )r.   rK   r4   r4   r5   _expect_safe_gradW   s   rM   abNonec                 C  s   | |ksJ |  d| d S )Nz != r4   )rN   rO   r4   r4   r5   	assert_eq]   s   rQ   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tlsrS   )priorr4   r4   r5   $disable_inference_mode_for_fake_proph   s   rW   skip_symbolic	skip_leaf Callable[[object, object], None]m1m2torch.TensorrY   rZ   c                  s:   t |tjrt |n|}d	 fdd||S )
Nr\   r8   r]   r^   r0   rP   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sJ |jd usJ | j|j d S d S )NrS   F)dtypeshaperequires_gradr@   	is_sparserT   rU   is_inferenceis_conjis_negrK   rL   rM   layout	dense_dim
sparse_dimis_coalescedis_sparse_compressedstridestorage_offsetis_view_is_viewbase_base)r\   r]   rQ   gorZ   rY   r4   r5   rr      sB   
zassert_metadata_eq.<locals>.go)r\   r8   r]   r^   r0   rP   )r3   rF   TensorMetaTensorDescriberdescribe_tensor)rQ   r\   r]   rY   rZ   r4   rq   r5   assert_metadata_eqr   s   


+rv   TypeGuard[torch.Tensor]c                 C  s   t | tjo| jtju S rE   )r3   rF   rs   rf   
sparse_coorB   r4   r4   r5   is_sparse_coo   s   ry   rf   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)rf   r4   r4   r5   is_sparse_compressed_layout   s   r   c                 C  s   t | tjo
t| jS rE   )r3   rF   rs   r   rf   rB   r4   r4   r5   rj      s   rj   c                 C  s   t | pt| S rE   )ry   rj   rB   r4   r4   r5   is_sparse_any      r   tytype[_T]objc                 C  s&   t || sJ d|  dt| |S )Nz	expected z	 but got )r3   type)r   r   r4   r4   r5   _checked_cast   s   "r   ro   torch.UntypedStoragec                 C     | j S rE   real_storage)ro   r4   r4   r5   _get_real_storage   s   r   r   c                 C  s
   || _ d S rE   r   )ro   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 )%rt   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   rP   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sJ ! \}}fdd|D }t}ddl"m#} t$%}t&t'd	d
}t(dEi d)d|d|rd
n* d|dj+d, dj-d|d|d|
d|d|d|d|d. d/ dt0tj1j2d|	d|d|v rZ| j34 nd d|d |d!jd"5 d#|d$|d%t6t&d&t7 d't&d(i d)jst8r9 nd d*jst8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 d/|rjtj@tjAhv rjB d
d-nd d0|rjtj@tjAhv rjC d
d-nd d1|r(t8r(jD d
d-nd d2tE }d ur;j|dnd d3 rJtjjFGnd d4|d5|sV|rZtHnd d6|rdtInd d7|r} r}jJd ur}jjJdnd d8tjKjLMd9|d:|d;|d<|d=|d>|d?|d@jNrnd  rÈ jOjPvrtQdA fdBdCdD jPR jO  S )FNr   r   xlalazyzVCannot safely fakify a view because this process drops the view information right now.__tensor_flatten__c                   s"   i | ]}| j t|d qS )r   )ru   rT   ).0attr)r   r.   r   r4   r5   
<dictcomp>q  s    z7MetaTensorDescriber.describe_tensor.<locals>.<dictcomp>)_tensor_symint_registryrS   Fr   storagerc   r@   ra   ndimr_   rb   	is_mkldnnis_functorch_wrappedr   r   r   rm   rd   re   is_parameterr%   	is_nested
nested_intis_functionalrf   devicer   rk   rl   dynamo_dynamic_indices_dynamo_dynamic_indicesdynamo_hint_overrides_dynamo_hint_overridesrh   rg   ri   crow_indicesr   col_indicesccol_indicesrow_indicesvaluesrK   creation_meta	unwrappedlevelbdimro   	fake_mode	view_funcattrsctxr   functorch_stackautograd_meta_fromcurrent_levelr   ru   c                     r   rE   r   r4   r   r4   r5   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   r4   )SrC   rn   rb   rf   r   r%   r   r   r   r   r   rF   _is_functional_tensorr   r   untyped_storagerl   rk   ru   r   r   r   rA   _sync_from_functional_tensor_C$_functionalization_reapply_views_tlsr   
_functorchr   pyfunctorch#temporarily_clear_interpreter_stackhasattrr   $torch.nested._internal.nested_tensorr   ViewFuncfrom_tensorrT   rU   r8   r   rc   ra   dimr_   rd   re   r3   nn	Parameternoder   r   listr   rj   rh   rg   ri   r{   r}   r   r   r|   r~   r   r   r   rL   	_autograd_get_creation_metar    r   rp   _subclassesfake_tensormaybe_get_fake_moder   r   r   r#   r   ) r   r.   r   r   r@   rm   rb   rf   r   is_traceable_wrapper_subclass_vr   r   is_batchedtensor_vis_legacy_batchedtensor_vis_gradtrackingtensor_vr   r   rl   rk   r   r   r   reapply_viewsmaybe_functorch_stackr   r   type_v	raw_attrsr   r   is_inference_mode_disabledrK   r4   )r   r   r.   r   r5   ru     s  








 !"#$%&(*+16;@EJNPSVY\]^_`defgiz#MetaTensorDescriber.describe_tensorNr   r?   r0   rP   )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   ru   r4   r4   r4   r5   rt      s    


rt   )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^   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  "  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__?  s   z_MetaTensorCallback.__call__N)r  r  r   r  r0   r<   r   r   r  r  r4   r4   r4   r5   r  >      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"  D  s   
 r"  )totalc                   @  r  )_MetaTensorCallbackOptDevicer  r  kwargs!Unpack[_MetaTensorCallbackKwargs]r0   r<   c                K  r  rE   r4   )r   r  r%  r4   r4   r5   r  M  s   z%_MetaTensorCallbackOptDevice.__call__N)r  r  r%  r&  r0   r<   r   r4   r4   r4   r5   r$  L  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 )Zr8   r   r   r  r   torch.dtyper_   ztorch.devicer   tuple[int, ...]r   z	list[int]r   zdict[int, int]r   rz   rf   Fr?   rc   r@   ra   rb   r   r   r   r   r   rm   r   NzOptional[int]r   r%   r   rd   re   r   Optional[tuple[int, ...]]rk   r   rl   zOptional[MetaStorageDesc]r   rh   rg   zOptional[bool]ri   zOptional[MetaTensorDesc]r   r   r   r   r   r   r   ro   z#Optional[dict[str, MetaTensorDesc]]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]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   k1r/  r4   r4   r5   r     s    z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)r8   r*  r  r3   rF   r   r_   rf   SymInttupler   r   r   r   r-  dictitems)r,  r.  )r0  )r,  r5   r0    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   )rT   namedefault)r   fieldr0  r   r4   r5   r     s    

z*MetaTensorDesc.as_json.<locals>.<dictcomp>r  )r,  r-  r.  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   r`     s   zMetaTensorDesc.shaper	  )r0   r(  )6r   r   r  r
  rF   stridedrf   rc   r@   ra   rb   r   r   r   r   r   rm   r   r   r%   r   rd   re   r   rk   rl   r   rh   rg   ri   r   r   r   r   r   r   r   ro   r   r   rK   r*  r   r   r   r   r   r   r   r   r   r   propertyr`   r4   r4   r4   r5   r8   U  sp   
 
$dstsrcr+  c                 C  s    t |tjur	d S | | d S rE   )r   rF   rs   copy_)rC  rD  r4   r4   r5   
_safe_copy  s   rF  c                 C  s   t | tjur	d S |  S rE   )r   rF   rs   clone)rD  r4   r4   r5   _safe_clone  s   rH  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   rP   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   rt   	describerr   r4   r4   r5   r     s   zMetaConverter.__init__c                 C  s   | j dko	| jdkS )Nr   )rN  rO  r@  r4   r4   r5   
successful!  s   zMetaConverter.successfulr.   r8   r+  c                 C     | j |jd S rE   rM  getr   r   r4   r4   r5   get_tensor_memo$  r   zMetaConverter.get_tensor_memor:   c                 C  s    | j |jd }|d usJ |S rE   rU  )r   r.   r   r4   r4   r5   _checked_get_tensor_memo'  s   z&MetaConverter._checked_get_tensor_memor.  c                 C     || j |j< d S rE   )rM  r   )r   r.   r.  r4   r4   r5   set_tensor_memo,  r   zMetaConverter.set_tensor_memor   r   r  c                 C  rT  rE   )rL  rV  r   r   r4   r4   r5   get_storage_memo/  r   zMetaConverter.get_storage_memor   c                 C  rY  rE   )rL  r   )r   r   r.  r4   r4   r5   set_storage_memo2  r   zMetaConverter.set_storage_memocallback0Callable[[Callable[[], torch.Tensor]], _TensorT]c              	     s   |    }d u rT| fdd }| jrLt * t   jd us&J t| j  W d    n1 s8w   Y  W d    n1 sGw   Y  | 	 | |S |S )Nc                     s   t j jt jddS Nmetar_   r   )rF   emptyr   uint8r4   r   r4   r5   r   >  s    z,MetaConverter.meta_storage.<locals>.<lambda>)
r[  r   r   rF   no_gradr$   r   r   rG  r\  )r   r   r]  memor_sr4   rd  r5   meta_storage5  s    
 zMetaConverter.meta_storager^   c                 C  s   t t|S rE   )typingcastr:   )clsr.   r4   r4   r5   _checked_cast_tensor_tK  s   z$MetaConverter._checked_cast_tensor_tNr  r   "Optional[Union[torch.device, str]]c                 C  s   |  | S rE   )rl  )rk  r.   r   r4   r4   r5   _identity_callableP  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DelayedErrorri  rj  r:   )rk  r.   errfnerrr4   r4   r5   _backward_errorX  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 tj	 
tjjjr)J  jd7  _tj	d ur:	jfdI	fddfdJfdd}fdK	fdddLfd"d#	fdMfd%d&}d u rod' tj jrj}	fd(d)}
jr͈jd usJ t ' t  t|
sJ tj|
_W d    n1 sw   Y  W d    n1 sw   Y  t|
sJ d*|
tj  j!rd+|
_!j!r|	s"|
# }
t$  |
tj  W d    n	1 s	w   Y  nt%j&rj}	j&tj'tj(hv rQj)d us+J j*d us3J j+d us;J j,j) j* }j+j-|d |d,  nd-j&tj.tj'hv rjj/d useJ j/j0nj1d usrJ j1j0fd.d)}
jrjd usJ t ) t  t|
sJ tj|
_W d    n	1 sw   Y  W d    n	1 sw   Y  t|
sJ d*j!rd+|
_!j!r|	sވ2|
}
nj3rj4sdd/l5m6} |d0 nj7rj}	\
}
fd1d)}
jrnt P t < j8d us"J j9d us*J t|
s1J tj:j8j9j0jd2|
_jd usGJ t;|
jj W d    n	1 sYw   Y  W d    n	1 siw   Y  t|
swJ d*j!r~d+|
_!j!r|	s2|
}
nXj<rj=rdd/l5m6} |d3 dN 	fd4d5}
n3j>rjj?d6vrj@d usJ j<rJ Aj@	}"tB|}
tCjD|
 nj=r8jEd usJ d }	rd urdd7lFmG} tH|s	J jId urjI}AjE	tjJjKLd8|}dOd=d>}tjMtjjjN}tjOtjjjNd? z|j0j0krCn+||j0j0rT"tP|}n|j0|j0re"tQ|}n	"|Rj0}jrt  ||}
W d    n	1 sw   Y  j!|
_!nyjEj!j!krt$  ||}
W d    n	1 sw   Y  nVj!sJ t % tS  "|R|j-}W d    n	1 sw   Y  W d    n	1 sw   Y  j!|_!t$  ||}
W d    n	1 sw   Y  jTd usJ tjjUV|
jT W tjOtjjjN| ntjOtjjjN| w j|
_Wnj}	jXsGjYsGj<sKjZrTt[W  d    S \
}j4ri
d@}
nc
fdAd)}
jrt H t 4 j8d usJ j9d usJ t|
sJ tj:j8j9j0jd2|
_t;|
jj W d    n	1 sw   Y  W d    n	1 sw   Y  t|
sJ d*j!rj!|
_!|	s2|
}
j\}|d usJ |j]j^vr.|
j3s|
9 kr.|
_ |kr.`||
a  jr-t|
sJ |
jd us#J tb|
a |
ja  njc|dB}t }ddCldme}mf} ||
}|d urN||}t   u | |
g||
 W d    n	1 smw   Y  jrt A t - t|
sJ |
jd usJ j9d usJ |
jgth|j_j8j9 W d    n	1 sw   Y  W d    n	1 sw   Y  W d    n	1 sw   Y  W d    n	1 sw   Y  jid urddDlmL} Aji	|dE|
_itjj|
jk tjl|
jm W d    n	1 sw   Y  jYo&jn k}totp|
d+|dF ddGlFmq} j\d urL|j\j8dkrL|
a rd jsrSd+|
_tjud urit|
s`J |
jvjwjudH|
_xy|
 zS )PNr   r   )ConstantSource__meta_utils_unknown_tensorr   r.   r8   rD  torch._guards.Sourcerz  ?Optional[torch.fx.experimental.symbolic_shapes.SymbolicContext]r0   ,tuple[tuple[int, ...], tuple[int, ...], int]c              	     s    j d usJ d urT j}|d ur|ju r 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 )Nc                 3      | ]}  |V  qd S rE   #_maybe_specialize_sym_int_with_hint)r   szrt  r4   r5   	<genexpr>  
    
zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  r  rE   r  )r   sdr  r4   r5   r    r  c                   s   g | ]}| j v qS r4   r8  )r   drB   r4   r5   r1    r2  zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>)rz  hint_overrides)rk   r   rt  r   rl   r5  r  -_create_symbolic_sizes_strides_storage_offsetranger   r   )r.   rD  rz  r   t_sizet_stridet_storage_offsetr  rB   r5    sym_sizes_strides_storage_offset  s0   
zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetinner_t	inner_srcr^   c                   s&    | ||\}}}t j||| jddS r_  rF   empty_stridedr_   )r  r  rz  inner_sizesinner_strides_inner_storage_offset)r  r4   r5   empty_create  s   
z/MetaConverter.meta_tensor.<locals>.empty_create
outer_sizer(  outer_striderx  Optional[torch._guards.Source]r:   c                   s   ddl m  ddlm | jd usJ | jd usJ |d ur |n| j}|d ur)|n| j}|d u s7t|s7J d fdd|d usHJ | ||||}|j	|kseJ d| j d| d|j	 | |ks{J d| j d| d|  |S )Nr   
AttrSource)SubclassSymbolicContextr.   r8   r  r)  r  rz  r  r]  &_MetaTensorCallbackOptDevice[_TensorT]rx  r  r0   r:   c                   s   | j d u r| |||S i }| j  D ]?\}}d }	|d ur8t|s&J |j|  }
d ur8ttjjj	j
|
}	 ||}tj||jd}||j|j|	||}|||< q| jd us\J | j|| j||S )Nr|  )r   meta_tensorr7  r3   inner_contextsr   rF   fxexperimentalsymbolic_shapesr-   	functoolspartialr   r   rk   r   __tensor_unflatten__r   )r.   r  r  rz  r]  rx  inner_tensorsr   meta_tensor_desccurrent_contextcurrent_context_current_sourceinner_callbacknew_empty_tensor)r  r  _empty_create_subclassr   rt  r4   r5   r    sJ   




zXMetaConverter.meta_tensor.<locals>.empty_create_subclass.<locals>._empty_create_subclassz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)  rz  r  r]  r  rx  r  r0   r:   )
torch._dynamo.sourcer  %torch.fx.experimental.symbolic_shapesr  r   r   r   rk   r3   r`   )r.   r  r  rz  rx  sub)r]  r   rt  )r  r  r  r5   empty_create_subclass  s:   	
5

z8MetaConverter.meta_tensor.<locals>.empty_create_subclassrt  8Optional[torch.fx.experimental.symbolic_shapes.ShapeEnv]r]  rw  5torch.fx.experimental.symbolic_shapes.SymbolicContextc                   s   ddl m} ddlm}m}m} d }| jr'| jd usJ  | j||d||}|jg| j	 }	| j
rf| jd us8J i }
| j D ]\}}t|tsJJ  |||||||
|< q?||	d g| j	 |
||d}|S ||	d g| j	 |d}|S )Nr   r  )
DimDynamicStatelessSymbolicContextr  rp   )dynamic_sizesconstraint_sizesr  tensor_sourceview_base_context)r  r  r  )r  r  r  r  r  r  rm   ro   DYNAMICr   r%   r   r7  r3   r-  )r.   rx  rt  r]  r  r  r  r  r  t_dynamic_sizesr  r   innert_symbolic_context)all_dynamic_symbolic_contextr4   r5   r  H  sB   


z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_contextro   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s[J |j
d usbJ |||d	}| \}	}
|	D ]}t|||j	| j< qqfd fdd}|jd usJ |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)hintrx  )r  r  r3   allr  create_symbolcreate_symintnode)r   all_static_sizes
sym_sourcesymbol)r  r  rt  rz  r  r5   r    s   		zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnr  r  	visited_tr^   rt  r  r]  r  c                   s`   | d u rd S j | }|d }|d ur|S j | } d}||||||||S )Nr  )rR  r   rV  ru   r  )r  rt  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_fn)r   r  r0   r  )r  r^   rt  r  r]  r  r0   r^   )r"   r%   rl  
as_stridedr  r  r  r  r  r   r   r   rT   r   r   r  rF   _checkr   rk   rl   )ro   r.   rt  sizesstridesrl   r  r  fake_tr   _r   r  )r  r]  r  maybe_suppressr   rx  r  rz  )r  r  r  rt  r5   view_from_base  sR   
+ $z1MetaConverter.meta_tensor.<locals>.view_from_basec                     s$   t jjj j j j jt jddS )Nr`  )r_   rf   r   )	rF   opsaten_sparse_coo_tensor_with_dimsrh   rg   r   r_   rx   r4   rB   r4   r5   r   0  s    z+MetaConverter.meta_tensor.<locals>.<lambda>z)the callback you passed in doesn't detachT   r4   c                
     s&   t jjjdjj jjddS )Nr   r`  )rf   r_   r   )rF   r  r  #_sparse_compressed_tensor_with_dimsrg   r`   rf   r_   r4   )	blocksizeindex_dtyper.   r4   r5   r   c  s    )unimplementedz;strided nested tensors are not supported by meta conversionc                        t j jddS r_  r  r4   r  r  r.   r4   r5   r     s    
ra  z;view functorch tensors are not supported by meta conversionc              	     s  j rGjd us
J jd usJ jd usJ j}j}j}tjjj 	t
|||}W d    |S 1 s@w   Y  |S jrjd usQJ jd usXJ tjj}|  j}W d    n1 sow   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sJ jd usJ j	}	t|j}|S jd usJ j j fdd}jrLt B t % tjjjjjd|_j d usJ t!|jj  W d    n1 s.w   Y  W d    |S W d    |S 1 sGw   Y  |S )NTc                     r  r_  r  r4   r  r4   r5   r         zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>ra  )"r   r   r   r   rF   r   r   %temporarily_restore_interpreter_stackr   rl  r   r   r   _DisableFuncTorch_wrap_for_gradr@   ra   rC   rs  r   r   r  r   rk   r   r   re  r$   r  r_   r   real_tensorr   rF  )r.   ftlvlr   r   disable_functorchr@   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorr]  r   rt  rx  rz  r  r5   r    s   


FF-

+
	*			z2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   )r  rp   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_rFr  c                     r  r_  r  r4   r  r4   r5   r     r  )r]  )in_kernel_invocation_managerr   r  rK   rX   )guard_or_false)nt_tensor_id)r.   r8   rD  r  rz  r  r0   r  )r  r8   r  r  rz  r  r0   r^   )r.   r8   r  r(  r  r(  rz  r  rx  r  r0   r:   )
r.   r8   rx  r  rt  r  r]  rw  r0   r  )ro   r:   r.   r8   rt  r  r0   r:   r.   r8   r0   r:   )r  r'  r  r'  r0   r?   ){r  r  r   r  r}  lenrM  rF   r   _dispatch_tls_local_exclude_sethasDispatchKeyPythonrQ  
contextlibnullcontextsuppress_guardsrW  inference_moderc   rb   r@   r   r   re  r$   r6   rH  r  rC   _coalesced_r?   ri   ra   rl  rG  enable_gradr   rf   r}   r~   rh   rg   r   r   r`   r{   r   r_   r   rs  r   r%   torch._dynamo.excr  r   r   rk   r  rF  r   rm   r   r   r   r  _to_functional_tensor_mirror_autograd_meta_tor   ro   r  r  r3   r  _dynamorx  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   rL  rl   r\  r   r   rh  r2   r  r   set_r   rK   	_set_conjrd   _set_negre   r   rv   rQ   r  resize_r   	_is_paramr   r   create_symbolic_nested_intnested_int_memorZ  rX  )r   r.   rt  rv  rx  rz  r}  r  r  r@   r   	batch_dimr  _storage_offsetr   base_symbolic_contextr  ro   r  old_excludemidrl   r   rg  maybe_fake_mgrr  r   mb_fake_moder  rZ   r  r4   )r  r  r  r  r]  r  r  r  r   rt  r  rx  r  r  rz  r.   r5   r  g  s  
,mT 

 

 
 	
W





 


    
s 	


        v
zMetaConverter.meta_tensorT)r]  rx  rz  r   'Optional[_MetaTensorCallback[_TensorT]]r   c                  sZ  |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|rjd us^J 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	|
_|
S )
Nr   r   Fr   describe_sourcec                     s    j jj dS )N)r  r   rx  )rR  r   r9  r4   r   rx  t_descr4   r5   r   p  s   z(MetaConverter.__call__.<locals>.<lambda>r   T) rn  r3   rF   rs   r   r   is_quantizedrn   rp   rb   rO  r  rN  	overridesis_tensor_likerR  ru   r#   r  	ExitStackenter_context	_dispatchpythonsuspend_functionalizationr!   r   r   r   r  r   r   r  )r   r.   rt  r]  rx  rz  r   rv  
exit_stackstr   r4   r%  r5   r  4  sX   

zMetaConverter.__call__r   )r0   r?   )r.   r8   r0   r+  r  )r.   r8   r.  r:   r0   rP   )r   r   r0   r  )r   r   r.  r   r0   rP   )r   r   r]  r^  r0   r   )r.   r^   r0   r:   rE   )r.   r  r   rm  r0   r:   )r.   r:   r0   r:   )r.   r8   rt  ru  rv  rw  rx  ry  rz  r{  r0   r:   )r.   r^   rt  ru  r]  r#  rx  ry  rz  r{  r   r?   r0   r:   )r   r   r  r   rS  rW  rX  rZ  r[  r\  rh  classmethodrl  rn  rs  r  r  r4   r4   r4   r5   rI    s>    







       WrI  )r.   r/   r0   r1   )r.   r>   r0   r?   )r.   r7   r0   rD   )r.   r7   r0   r7   )rN   r9   rO   r9   r0   rP   )r0   rR   )rQ   r[   r\   r>   r]   r^   rY   r?   rZ   r?   r0   rP   )r.   r/   r0   rw   )rf   rz   r0   r?   )r   r   r   r/   r0   r9   )ro   r   r0   r   )ro   r   r   r   r0   rP   )rC  r^   rD  r+  r0   rP   )rD  r^   r0   r+  )m
__future__r   r  r=  r  	threadingri  rJ  abcr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   typing_extensionsr   r   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(   torch._guardsr)   r2   r*   r+   r  r,   r-   r6   r   DimListrs   r7   r9   r:   r<   rC   rL   rM   rQ   localrU   rS   rW   rv   ry   r   rj   r   r   r   r   r  r   r   r   r   rt   r   r   r  r  r  r"  r$  r8   rF  rH  rI  torch._prims_common_prims_commonr  r4   r4   r4   r5   <module>   s    04





=









  	 
#
         