o
    ߗiRJ                    @  sZ  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
 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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	l0m1Z1 d d
l2m3Z3 d dl4m5Z5 d dl6m7Z7 erd dl$m8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@ dlddZAeZBedde!jCZDedZEede!jCdZFede!jCddZGdmd!d"ZHdnd$d%ZIdod&d'ZJdpd+d,ZKd-d-d.dqd5d6ZLdrd8d9ZMdsd<d=ZNdrd>d?ZOdrd@dAZPdtdEdFZQdudIdJZRdvdLdMZSedNeTZUedOeTZVedPeTZWeWd aXG dQdR dRZYe
ddSG dTdU dUZZe
ddSG dVdW dWeeF Z[e
ddSG dXdY dYe[dZ Z\e
ddSG d[d\ d\e[eF eeF Z]G d]d^ d^ed-d_Z^G d`da daeeeG Z_e
ddSG dbd deeF Z`dwdfdgZadxdhdiZbG djdk dkeeF Zcd dldmeZf dS )y    )annotationsN)abstractmethod)	dataclass)AnyCallableClassVarContextManagerDictGenericListNewTypeOptionalProtocolSetTupleType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)trace_structured)no_dispatch)is_traceable_wrapper_subclass)WeakIdKeyDictionary)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)r0   r,    r6   Z/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_subclasses/meta_utils.py_is_fake_tensor?   s   
r8   _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r0   r6   r6   r7   safe_is_leafL   s
   rE   Optional[_TensorLikeT]c                 C  s>   t   t dd | jW  d    S 1 sw   Y  d S )NignorezThe .grad attribute of a Tensor)warningscatch_warningsfilterwarningsgradrD   r6   r6   r7   	safe_gradT   s   
$rL   c                 C  s   t | }|d us
J |S N)rL   )r0   rK   r6   r6   r7   _expect_safe_gradZ   s   rN   abNonec                 C  s   | |ksJ |  d| d S )Nz != r6   )rO   rP   r6   r6   r7   	assert_eq`   s   rR   Fskip_symbolic	skip_leaf Callable[[object, object], None]m1m2torch.TensorrT   rU   c                  s:   t |tjrt |n|}d	 fdd||S )
NrW   r:   rX   rY   r2   rQ   c                   s   | j |j  s | j|j  | j|j s  | j|j  | j|j  | j|   | j|   | j|   | jd ut	|d u | jd urX| 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 rM   )dtypeshaperequires_gradrB   	is_sparse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base_base)rW   rX   rR   gorU   rT   r6   r7   rm   r   s>   
zassert_metadata_eq.<locals>.go)rW   r:   rX   rY   r2   rQ   )r5   torchTensorMetaTensorDescriberdescribe_tensor)rR   rW   rX   rT   rU   r6   rl   r7   assert_metadata_eqd   s   


(rr   TypeGuard[torch.Tensor]c                 C  s   t | tjo| jtju S rM   )r5   rn   ro   ra   
sparse_coorD   r6   r6   r7   is_sparse_coo   s   ru   ra   torch.layoutc                 C  s   | t jt jt jt jhv S rM   )rn   
sparse_csr
sparse_csc
sparse_bsr
sparse_bsc)ra   r6   r6   r7   is_sparse_compressed_layout   s   r{   c                 C  s   t | tjo
t| jS rM   )r5   rn   ro   r{   ra   rD   r6   r6   r7   re      s   re   c                 C  s   t | pt| S rM   )ru   re   rD   r6   r6   r7   is_sparse_any      r|   tyType[_T]objc                 C  s&   t || sJ d|  dt| |S )Nz	expected z	 but got )r5   type)r~   r   r6   r6   r7   _checked_cast   s   "r   rj   torch.UntypedStoragec                 C     | j S rM   real_storage)rj   r6   r6   r7   _get_real_storage   s   r   r   c                 C  s
   || _ d S rM   r   )rj   r   r6   r6   r7   _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 )%rp   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   rA   r2   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   r6   r6   r7   __init__   s   

zMetaTensorDescriber.__init__r0   rY   r   c                 C  0   || j vr| j| j |< t| jd | _| j | S Nr   )r   r   r   r   r0   r6   r6   r7   get_tensor_id      

z!MetaTensorDescriber.get_tensor_idsr   r   c                 C  r   r   )r   r   r   r   r   r6   r6   r7   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 rM   as_jsonr   r6   rr   r6   r7   <lambda>       z6MetaTensorDescriber.describe_storage.<locals>.<lambda>metadata_fn)r   r   r   r   r   r   r&   add)r   r   r   r6   r   r7   r      s   z$MetaTensorDescriber.describe_storageTrecurser   r   r:   c              	     sn  t } }j}j}j}t}	t}
j}t}t	}t
}|p+|}t}d }d}|sRt|sR|r?|	rR|sR|
sR|sRj d} }d }|sbt|sb|r^|	rb }d }d }d }|sl|rv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&dBi d	'd
|d( d|dj)d* dj+d|d|d|
d|d|d|d|d, d- dt.tj/j0d|	d|d|v rS| j12 nd d|d|djd 3 d!|d"|d#t4t5d$t6 d%js~t7r8 nd d&jst7r9 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j@hv rjA d)d*nd d-|rjtj?tj@hv rjB d)d*nd d.|rt7rjC d)d*nd d/tD }d ur-j|dnd d0 r<tjjEFnd d1|d2|sH|rLtGnd d3|rVtHnd d4|ro rojId urojjIdnd d5tjJjKLd6|d7|d8|d9|d:|d;|d<|d=jMrnd  r jNjOvrtPd> fd?d@dA jOQ jN  S )CNr   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   )rq   getattr).0attr)r   r0   r   r6   r7   
<dictcomp>_  s    z7MetaTensorDescriber.describe_tensor.<locals>.<dictcomp>)_tensor_symint_registryr   storager^   rB   r\   ndimrZ   r]   	is_mkldnnis_functorch_wrappedr   r"   r!   rh   r_   r`   is_parameterr(   	is_nested
nested_intis_functionalra   devicer   rf   rg   dynamo_dynamic_indices_dynamo_dynamic_indicesrc   rb   rd   crow_indicesFr   col_indicesccol_indicesrow_indicesvaluesrK   creation_meta	unwrappedlevelbdimrj   	fake_mode	view_funcattrsctxr   functorch_stackautograd_meta_fromcurrent_levelr   rq   c                     r   rM   r   r6   r   r6   r7   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   r6   )RrE   ri   r]   ra   r   r(   r    r   r   r"   r!   rn   _is_functional_tensorr{   r   untyped_storagerg   rf   rq   r   r   r   rC   _sync_from_functional_tensor_C$_functionalization_reapply_views_tlsr   
_functorchr   pyfunctorch#temporarily_clear_interpreter_stackhasattrr   $torch.nested._internal.nested_tensorr   ViewFuncfrom_tensorr:   r   r^   r\   dimrZ   r_   r`   r5   nn	Parameternoder   r   listr   r   re   rc   rb   rd   rw   ry   r   r   rx   rz   r   r   r   rL   	_autograd_get_creation_metar$   r#   rk   _subclassesfake_tensormaybe_get_fake_moder   r   r   r&   r   ) r   r0   r   r   rB   rh   r]   ra   r   is_traceable_wrapper_subclass_vr   r   is_batchedtensor_vis_legacy_batchedtensor_vis_gradtrackingtensor_vis_functorch_batched_or_gradr   r   rg   rf   r   r   r   reapply_viewsmaybe_functorch_stackr   r   type_v	raw_attrsr   r   rK   r6   )r   r   r0   r   r7   rq     s  







 !"#$%')*05:?DIMORUX[\]^_cdefhz#MetaTensorDescriber.describe_tensorNr   rA   r2   rQ   )r0   rY   r2   r   )r   r   r2   r   )r   r   r   rA   r2   r   )r0   rY   r   rA   r   rA   r2   r:   )	__name__
__module____qualname____doc__r   r   r   r   rq   r6   r6   r6   r7   rp      s    


rp   )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   r2   Dict[str, object]c                 C  s*   | j |t| jtr| jdS t| jdS )N)r   r  r   )r   r5   r   r   repr)r   r  r6   r6   r7   r     s   zMetaStorageDesc.as_jsonNr  r   r2   r  )r   r   r   __annotations__r   r6   r6   r6   r7   r     s
   
 r   c                   @  s.   e Zd Ze		ddd
dZedddZdS )r   Nr0   r<   new_basesymint_visitor_fnOptional[Callable[[int], int]]tensor_visitor_fn,Optional[Callable[[torch.Tensor], _TensorT]]r2   c                 C     d S rM   r6   r   r0   r  r  r	  r6   r6   r7   apply  s   zViewFunc.applyrY   c                 C  s   t | rt S t| jS rM   )r8   _FakeTensorViewFunc_CustomViewFunc_view_func_unsaferD   r6   r6   r7   r     s   
zViewFunc.from_tensorNN)
r0   r<   r  r<   r  r  r	  r
  r2   r<   )r0   rY   r2   r   )r   r   r   r   r  staticmethodr   r6   r6   r6   r7   r     s    	r   c                   @  s    e Zd Ze		ddddZdS )r  Nr0   rY   r  r  r  r	  .Optional[Callable[[torch.Tensor], FakeTensor]]r2   r,   c                 C  s   t jjj||||S rM   )rn   r   r   r,   r  r  r6   r6   r7   r    s   
z_FakeTensorViewFunc.applyr  )
r0   rY   r  rY   r  r  r	  r  r2   r,   )r   r   r   r   r  r6   r6   r6   r7   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]funcNr0   rY   r  r  r  r	  r
  r2   r<   c                 C  s   |  |||S rM   )r  r  r6   r6   r7   r    s   	z_CustomViewFunc.applyr  )
r0   rY   r  rY   r  r  r	  r
  r2   r<   )r   r   r   r  r   r  r6   r6   r6   r7   r    s   
 	r  c                   @  s   e Zd ZU ded< dS )_MetaTensorCallbackKwargszUnion[torch.device, str]r   N)r   r   r   r  r6   r6   r6   r7   r  &  s   
 r  )totalc                   @  s   e Zd Zd
ddZd	S )_MetaTensorCallbackargCallable[[], torch.Tensor]kwargs!Unpack[_MetaTensorCallbackKwargs]r2   r>   c                K  r  rM   r6   )r   r  r  r6   r6   r7   __call__+  s   z_MetaTensorCallback.__call__N)r  r  r  r  r2   r>   )r   r   r   r  r6   r6   r6   r7   r  *  s    r  c                   @  sx  e Zd ZU 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d.ed/< dZd.ed0< dZ d.ed1< dZ!d.ed2< dZ"d.ed3< dZ#d.ed4< dZ$ded5< dZ%d.ed6< dZ&d7ed8< dZ'd9ed:< dZ(d.ed;< h d<Z)d=ed>< dZ*d?ed@< dZ+dAedB< dZ,dCedD< dZ-dEedF< dZ.dedG< dZ/dedH< dZ0dIedJ< dZ1dKedL< dZ2dKedM< dVdRdSZ3e4dWdTdUZ5dS )Xr:   r   r   r   r   torch.dtyperZ   ztorch.devicer   Tuple[int, ...]r   z	List[int]r   rv   ra   FrA   r^   rB   r\   r]   r   r   r   r"   r!   rh   r   NzOptional[int]r   r(   r   r_   r`   r   Optional[Tuple[int, ...]]rf   r   rg   zOptional[MetaStorageDesc]r   rc   rb   zOptional[bool]rd   zOptional[MetaTensorDesc]r   r   r   r   r   r   r   rj   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   r2   r  c                   s:   d fdd  fdd	t D }|d
|i |S )Nkstrvr1   r2   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 r6   r6   )r   v1)jsonr"  r6   r7   
<listcomp>      z8MetaTensorDesc.as_json.<locals>.json.<locals>.<listcomp>r   c                 S  s   i | ]\}}||j qS r6   )r   )r   k1r%  r6   r6   r7   r     s    z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)r:   r   r  r5   rn   r   rZ   ra   SymInttupler   r   r   r   r#  dictitems)r"  r$  )r&  )r"  r7   r&    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   )r   namedefault)r   fieldr&  r   r6   r7   r     s    

z*MetaTensorDesc.as_json.<locals>.<dictcomp>r  )r"  r#  r$  r1   r2   r1   )dataclassesfieldsupdate)r   r  r   r6   r2  r7   r     s   zMetaTensorDesc.as_jsonc                 C  r   rM   )r   r   r6   r6   r7   r[     s   zMetaTensorDesc.shaper  )r2   r  )6r   r   r   r  rn   stridedra   r^   rB   r\   r]   r   r   r   r"   r!   rh   r   r   r(   r   r_   r`   r   rf   rg   r   rc   rb   rd   r   r   r   r   r   r   r   rj   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   propertyr[   r6   r6   r6   r7   r:   4  sn   
 
$dstsrcr!  c                 C  s    t |tjur	d S | | d S rM   )r   rn   ro   copy_)r9  r:  r6   r6   r7   
_safe_copy  s   r<  c                 C  s   t | tjur	d S |  S rM   )r   rn   ro   clone)r:  r6   r6   r7   _safe_clone  s   r>  c                   @  s   e Zd Zddd<ddZ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
edDd#d$Ze	%dEdFd)d*ZedGd+d,ZdHd4d5Z	%dEd%d%d%d6d7dId:d;Zd%S )JMetaConverterFr   r   rA   r2   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   rp   	describerr   r6   r6   r7   r     s   zMetaConverter.__init__c                 C  s   | j dko	| jdkS )Nr   )rD  rE  r6  r6   r6   r7   
successful  s   zMetaConverter.successfulr0   r:   r!  c                 C     | j |jd S rM   rC  getr   r   r6   r6   r7   get_tensor_memo  r}   zMetaConverter.get_tensor_memor<   c                 C  s    | j |jd }|d usJ |S rM   rK  )r   r0   r   r6   r6   r7   _checked_get_tensor_memo  s   z&MetaConverter._checked_get_tensor_memor$  c                 C     || j |j< d S rM   )rC  r   )r   r0   r$  r6   r6   r7   set_tensor_memo
  r}   zMetaConverter.set_tensor_memor   r   r   c                 C  rJ  rM   )rB  rL  r   r   r6   r6   r7   get_storage_memo  r}   zMetaConverter.get_storage_memor   c                 C  rO  rM   )rB  r   )r   r   r$  r6   r6   r7   set_storage_memo  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rZ   r   )rn   emptyr   uint8r6   r   r6   r7   r     s    z,MetaConverter.meta_storage.<locals>.<lambda>)
rQ  r   r   rn   no_gradr'   r   r   r=  rR  )r   r   rS  memor_sr6   rZ  r7   meta_storage  s    
 zMetaConverter.meta_storagerY   c                 C  s   t t|S rM   )typingcastr<   )clsr0   r6   r6   r7   _checked_cast_tensor_t)  s   z$MetaConverter._checked_cast_tensor_tNr  r   "Optional[Union[torch.device, str]]c                 C  s   |  | S rM   )rb  )ra  r0   r   r6   r6   r7   _identity_callable.  s   z MetaConverter._identity_callablec                 C  s$   t jjdd}||}tt|S )Nz9Internal error: Tried to backward() through example inputr   )rn   r   
_functionsDelayedErrorr_  r`  r<   )ra  r0   errfnerrr6   r6   r7   _backward_error6  s   zMetaConverter._backward_error	shape_envOptional[ShapeEnv]_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} jd7  _tj	d ur=	jfdH	fddfdIfdd}fdJ	fdddKfd"d#	fdLfd%d&}	d u rQd' 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 rTj)d us.J j*d us6J j+d us>J j,j) j* }j+j-|d |d,  nd-j&tj.tj'hv rmj/d ushJ j/j0nj1d usuJ 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rqt P t < j8d us%J j9d us-J t|s4J tj:j8j9j0jd2|_jd usJJ t;|jj W d    n	1 s\w   Y  W d    n	1 slw   Y  t|szJ d*j!rd+|_!j!r|
s2|}n?j<rj=rdd/l5m6} |d3 dM 	fd4d5}nj>rjj?d6vrj@d usJ j<rJ Aj@	}"tB|}tCjD| nj=r"jEd usJ d }	rd urdd7lFmG} tH|sJ jId urjI}AjE	tjJjKLd8|}dNd=d>}tjMtjjjN}tjOtjjjNd? z|j0j0krFn+||j0j0rW"tP|}n|j0|j0rh"tQ|}n	"|Rj0}jrt  |	|}W d    n	1 sw   Y  j!|_!nejEj!j!krt$  |	|}W d    n	1 sw   Y  nBj!sJ t  "|R|j-}W d    n	1 sw   Y  j!|_!t$  |	|}W d    n	1 sw   Y  jSd usJ tjjTU|jS W tjOtjjjN| ntjOtjjjN| w j}
jVs1jWs1j<s5jXr>tYW  d    S \
}j4rS
d@}nc
fdAd)}jrt H t 4 j8d usrJ j9d uszJ 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|}jZ}|d usJ |j[j\vr|j3s|9 kr|] |kr^||_  jrt|sJ |jd usJ t`|_ |j_  nja|dB}t }ddClbmc}md} ||}|d ur8||}t   u | |e||
 W d    n	1 sWw   Y  jrt A t - t|spJ |jd usxJ j9d usJ |jetf|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  jgd urddDlmL} Ajg	|dE|_gtjh|ji tjj|jk W d    n	1 sw   Y  jWojl k}tmtn|d+|dF jZd ur.jZj8dkr.|_ od jpr5d+|_qjrd urKt|sBJ |jsjtjrdG|_uv| wS )ONr   r   )ConstantSource__meta_utils_unknown_tensorr   r0   r:   r:  torch._guards.Sourcero  ?Optional[torch.fx.experimental.symbolic_shapes.SymbolicContext]r2   ,Tuple[Tuple[int, ...], Tuple[int, ...], int]c                   s    j d usJ d urR 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 ||dS  j j  jfS )Nc                 3      | ]}  |V  qd S rM   #_maybe_specialize_sym_int_with_hint)r   szrj  r6   r7   	<genexpr>  
    
zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  rw  rM   rx  )r   sdr{  r6   r7   r|    r}  c                   s   g | ]}| j v qS r6   r.  )r   drD   r6   r7   r'    r(  zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>)ro  )
rf   r   rj  r   rg   r+  ry  -_create_symbolic_sizes_strides_storage_offsetranger   )r0   r:  ro  r   t_sizet_stridet_storage_offsetr{  rD   r7    sym_sizes_strides_storage_offset|  s.   	zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetinner_t	inner_srcrY   c                   s&    | ||\}}}t j||| jddS rU  rn   empty_stridedrZ   )r  r  ro  inner_sizesinner_stridesinner_storage_offset)r  r6   r7   empty_create  s   
z/MetaConverter.meta_tensor.<locals>.empty_create
outer_sizer  outer_striderm  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)SubclassSymbolicContextr0   r:   r  r  r  ro  ru  rS  rl  rm  rt  r2   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 )Nrq  )r   meta_tensorr-  r5   inner_contextsr   rn   fxexperimentalsymbolic_shapesr/   	functoolspartialr   r   rf   r   __tensor_unflatten__r   )r0   r  r  ro  rS  rm  inner_tensorsr   meta_tensor_desccurrent_contextcurrent_context_current_sourceinner_callbacknew_empty_tensor)r  r  _empty_create_subclassr   rj  r6   r7   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 )r0   r:   r  r  r  r  ro  ru  rS  rl  rm  rt  r2   r<   )
torch._dynamo.sourcer  %torch.fx.experimental.symbolic_shapesr  r   r   r   rf   r5   r[   )r0   r  r  ro  rm  sub)rS  r   rj  )r  r  r  r7   empty_create_subclass  s:   	
5

z8MetaConverter.meta_tensor.<locals>.empty_create_subclassrj  8Optional[torch.fx.experimental.symbolic_shapes.ShapeEnv]rS  rl  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  rk   )dynamic_sizesconstraint_sizesr  tensor_sourceview_base_context)r  r  r  )r  r  r  r  r  r  rh   rj   DYNAMICr   r(   r   r-  r5   r#  )r0   rm  rj  rS  r  r  r  r  r  t_dynamic_sizesr  r   innert_symbolic_context)all_dynamic_symbolic_contextr6   r7   r  $  sB   


z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_contextrj   c                   sb  
|	\}}}|j s,t | s,  | |||W  d    S 1 s'w   Y  ddlm  ddlmm} d fdd}i |j rt|jd usPJ |j	d usWJ |||d	}|
 \}	}
|	D ]}t|||j| j< qffd fdd}|jd usJ |j|| ||}t|| | t|| | t|| | |S )Nr   )EphemeralSource)r  sym_eqr   r   r2   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 rM   )STATIC)r   xr  r6   r7   r|    s    

z_MetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fn.<locals>.<genexpr>r  )positive)hintrm  )r  r  r5   allr  create_symbolcreate_symintnode)r   all_static_sizes
sym_sourcesymbol)r  r  rj  ro  r  r7   r    s   	zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnr  r  	visited_trY   rj  r  rS  rl  c                   s`   | d u rd S j | }|d }|d ur|S j | } d}||||||||S )Nr	  )rH  r   rL  rq   r  )r  rj  rS  
visited_idfake_visited_tvisited_desctemp_source)r  r  real_to_fake_mappingr   r6   r7   r	    s"   
zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.tensor_visitor_fn)r   r   r2   r   )r  rY   rj  r  rS  rl  r2   rY   )r(   rb  
as_stridedr  r  r  r  r  r   r   r   r   r   r   r  rn   _checkr   rf   rg   )rj   r0   rj  sizesstridesrg   r  r  fake_tr   _r   r	  )r  rS  r  maybe_suppressr   rm  r  ro  )r  r  r  rj  r7   view_from_bases  sD   
 +z1MetaConverter.meta_tensor.<locals>.view_from_basec                     s$   t jjj j j j jt jddS )NrV  )rZ   ra   r   )	rn   opsaten_sparse_coo_tensor_with_dimsrc   rb   r   rZ   rt   r6   rD   r6   r7   r     s    z+MetaConverter.meta_tensor.<locals>.<lambda>z)the callback you passed in doesn't detachT   r6   c                
     s&   t jjjdjj jjddS )Nr   rV  )ra   rZ   r   )rn   r  r  #_sparse_compressed_tensor_with_dimsrb   r[   ra   rZ   r6   )	blocksizeindex_dtyper0   r6   r7   r   9  s    )unimplementedz;strided nested tensors are not supported by meta conversionc                        t j jddS rU  r  r6   r  r  r0   r6   r7   r   b  s    
rW  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  rU  r  r6   r  r6   r7   r         zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>rW  )"r   r   r   r   rn   r   r   %temporarily_restore_interpreter_stackr   rb  r   r!   r   _DisableFuncTorch_wrap_for_gradrB   r\   rE   ri  r   r   r  r   rf   r   r   r[  r'   r  rZ   r   real_tensorr   r<  )r0   ftlvlr   r   disable_functorchrB   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorrS  r   rj  rm  ro  r  r7   r    s   


FF-

+
	*			z2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   )r  rk   complex_dtyper  
real_dtyperA   c                 S  s   t | ot | |kS rM   )utilsis_complex_dtypecorresponding_real_dtype)r  r  r6   r6   r7   	is_c_of_r  s
   
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFr  c                     r  rU  r  r6   r  r6   r7   r   w  r  )rS  )in_kernel_invocation_managerr   r  rK   rS   )nt_tensor_id)r0   r:   r:  rt  ro  ru  r2   rv  )r  r:   r  rt  ro  ru  r2   rY   )r0   r:   r  r  r  r  ro  ru  rm  r  r2   r<   )
r0   r:   rm  rt  rj  r  rS  rl  r2   r  )rj   r<   r0   r:   rj  r  r2   r<   r0   r:   r2   r<   )r  r  r  r  r2   rA   )xr  r  r   r  rr  lenrC  rn   r   _dispatch_tls_local_exclude_sethasDispatchKeyPythonrG  
contextlibnullcontextsuppress_guardsrM  inference_moder^   r]   rB   r   r   r[  r'   r8   r>  r  rE   _coalesced_rA   rd   r\   rb  r=  enable_gradr{   ra   ry   rz   rc   rb   r   r   r[   rw   r   rZ   r   ri  r   r(   torch._dynamo.excr  r   r   rf   r  r<  r   rh   r   r   r   r  _to_functional_tensor_mirror_autograd_meta_tor   rj   r  r  r5   r  _dynamorm  r  &_dispatch_tls_is_dispatch_key_excludedADInplaceOrView'_dispatch_tls_set_dispatch_key_excludedview_as_realview_as_complexviewr   r   _set_creation_metar   r!   r"   NotImplementedr   r   rB  rg   rR  r   r   r^  r4   r  r   set_r   rK   	_set_conjr_   _set_negr`   r   rr   rR   resize_r   	_is_paramr   r   create_symbolic_nested_intnested_int_memorP  rN  )r   r0   rj  rS  rm  ro  rr  rG  r  r  rB   r   	batch_dimr  _storage_offsetr   base_symbolic_contextr  rj   r  old_excludemidrg   r   r]  maybe_fake_mgrr  r   mb_fake_moder  rU   r6   )r  r  r  r  rS  r  r  r  r   rj  r  rm  r  r  ro  r0   r7   r  E  sx  
+mT 	

 

 
 	
W









    
q 	


        r
zMetaConverter.meta_tensorT)rS  rm  ro  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   rm  )rH  r   r/  r6   r   rm  t_descr6   r7   r   @  s   z(MetaConverter.__call__.<locals>.<lambda>r   T) rd  r5   rn   ro   r   r   is_quantizedri   rk   r]   rE  r  rD  	overridesis_tensor_likerH  rq   r&   r  	ExitStackenter_context	_dispatchpythonsuspend_functionalizationr%   r   r   r   r  r   r   r
  )r   r0   rj  rS  rm  ro  r   	callback_
exit_stackstr   r6   r  r7   r    sX   

zMetaConverter.__call__r   )r2   rA   )r0   r:   r2   r!  r  )r0   r:   r$  r<   r2   rQ   )r   r   r2   r   )r   r   r$  r   r2   rQ   )r   r   rS  rT  r2   r   )r0   rY   r2   r<   rM   )r0   r  r   rc  r2   r<   )r0   r<   r2   r<   )r0   r:   rj  rk  rS  rl  rm  rn  ro  rp  r2   r<   )r0   rY   rj  rk  rS  r  rm  rn  ro  rp  r   rA   r2   r<   )r   r   r   r   rI  rM  rN  rP  rQ  rR  r^  classmethodrb  rd  ri  r  r  r6   r6   r6   r7   r?    s>    







       Ir?  )r0   r1   r2   r3   )r0   r@   r2   rA   )r0   r9   r2   rF   )r0   r9   r2   r9   )rO   r;   rP   r;   r2   rQ   )rR   rV   rW   r@   rX   rY   rT   rA   rU   rA   r2   rQ   )r0   r1   r2   rs   )ra   rv   r2   rA   )r~   r   r   r1   r2   r;   )rj   r   r2   r   )rj   r   r   r   r2   rQ   )r9  rY   r:  r!  r2   rQ   )r:  rY   r2   r!  )g
__future__r   r  r3  r  r_  rH   r@  abcr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   r   r   rn   torch._C._autogradr   torch._C._functorchr   r   r   r   r   r    r!   r"   r#   r$   r%   torch._loggingr&   torch.utils._mode_utilsr'   torch.utils._python_dispatchr(   torch.utils.weakr)   r*   torch._guardsr+   r4   r,   r-   r  r.   r/   r8   DimListro   r9   r;   r<   r>   rE   rL   rN   rR   rr   ru   r{   re   r|   r   r   r   r   r   r   r   r   rp   r   r   r  r  r  r  r:   r<  r>  r?  torch._prims_common_prims_commonr  r6   r6   r6   r7   <module>   s    H4




	
:









  
 
"
         