o
    hT                    @  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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/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 erd dl7m8Z8 d dl!m9Z9 d dl:m;Z; d dl<m=Z=m>Z> d dl?m@Z@mAZA dtddZBeCZDeddejEZFedZGedejEdZHedejEd d!ZIdud$d%ZJdvd'd(ZKdwd)d*ZLdxd.d/ZMeN ZOd0eO_Pedyd2d3ZQd0d0d4dzd;d<ZRd{d>d?ZSd|dBdCZTd{dDdEZUd{dFdGZVd}dKdLZWd~dOdPZXddRdSZYedTeZZ[edUeZZ\edVeZZ]e]d a^G dWdX dXZ_ed dYG dZd[ d[Z`ed dYG d\d] d]eeH Zaed dYG d^d_ d_ead` Zbed dYG dadb dbeaeH eeH ZcG dcdd ddeeeI ZdG dedf dfed0dgZeG dhdi dieeeI Zfed dYG djd deeH ZgddndoZhddpdqZiG drds dseeH Zjd dlkmlZm 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   b/home/www/facesmatcher.com/frenv_anti/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_leafK   s
   rC   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gradrB   r4   r4   r5   	safe_gradS   s   
$rJ   c                 C  s   t | }|d us
J |S N)rJ   )r.   rI   r4   r4   r5   _expect_safe_gradY   s   rL   abNonec                 C  s   | |ksJ |  d| d S )Nz != r4   )rM   rN   r4   r4   r5   	assert_eq_   s   rP   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tlsrR   )Zpriorr4   r4   r5   $disable_inference_mode_for_fake_propj   s   rU   skip_symbolic	skip_leaf Callable[[object, object], None]m1m2torch.TensorrW   rX   c                  s:   t |tjrt |n|}d	 fdd||S )
NrZ   r8   r[   r\   r0   rO   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 )NrR   F)dtypeshaperequires_gradr@   	is_sparserS   rT   is_inferenceis_conjis_negrI   rJ   rL   layout	dense_dim
sparse_dimis_coalescedis_sparse_compressedstridestorage_offsetis_view_is_viewbase_base)rZ   r[   rP   gorX   rW   r4   r5   rp      sB   
zassert_metadata_eq.<locals>.go)rZ   r8   r[   r\   r0   rO   )r3   torchTensorMetaTensorDescriberdescribe_tensor)rP   rZ   r[   rW   rX   r4   ro   r5   assert_metadata_eqt   s   


+ru   TypeGuard[torch.Tensor]c                 C  s   t | tjo| jtju S rK   )r3   rq   rr   rd   
sparse_coorB   r4   r4   r5   is_sparse_coo   s   rx   rd   torch.layoutc                 C  s   | t jt jt jt jhv S rK   )rq   
sparse_csr
sparse_csc
sparse_bsr
sparse_bsc)rd   r4   r4   r5   is_sparse_compressed_layout   s   r~   c                 C  s   t | tjo
t| jS rK   )r3   rq   rr   r~   rd   rB   r4   r4   r5   rh      s   rh   c                 C  s   t | pt| S rK   )rx   rh   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   rm   torch.UntypedStoragec                 C     | j S rK   real_storage)rm   r4   r4   r5   _get_real_storage   s   r   r   c                 C  s
   || _ d S rK   r   )rm   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 )%rs   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   rO   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 rK   as_jsonr   r4   rr   r4   r5   <lambda>      z6MetaTensorDescriber.describe_storage.<locals>.<lambda>Z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(dCi 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'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 d.|rjtj@tjAhv rjC d
d+nd d/|r!t8r!jD d
d+nd d0tE }d ur4j|dnd d1 rCtjjFGnd d2|d3|sO|rStHnd d4|r]tInd d5|rv rvjJd urvjjJdnd d6tjKjLMd7|d8|d9|d:|d;|d<|d=|d>jNrnd  r jOjPvrtQd? fd@dAdB jPR jO  S )DNr   r   Z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   )rt   rS   ).0attr)r   r.   r   r4   r5   
<dictcomp>q  s    z7MetaTensorDescriber.describe_tensor.<locals>.<dictcomp>)_tensor_symint_registryrR   Fr   storagera   r@   r_   ndimr]   r`   	is_mkldnnis_functorch_wrappedr   r   r   rk   rb   rc   is_parameterr%   	is_nested
nested_intis_functionalrd   devicer   ri   rj   dynamo_dynamic_indicesZ_dynamo_dynamic_indicesrf   re   rg   crow_indicesr   col_indicesccol_indicesrow_indicesvaluesrI   creation_meta	unwrappedlevelbdimrm   	fake_mode	view_funcattrsctxr   functorch_stackautograd_meta_fromcurrent_levelr   rt   c                     r   rK   r   r4   r   r4   r5   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   r4   )SrC   rl   r`   rd   r   r%   r   r   r   r   r   rq   Z_is_functional_tensorr~   r   untyped_storagerj   ri   rt   r   r   r   rA   Z_syncZ_from_functional_tensor_CZ$_functionalization_reapply_views_tlsr   
_functorchr   pyfunctorch#temporarily_clear_interpreter_stackhasattrr   Z$torch.nested._internal.nested_tensorr   ViewFuncfrom_tensorrS   rT   r8   r   ra   r_   dimr]   rb   rc   r3   nn	Parameternoder   r   listr   rh   rf   re   rg   rz   r|   r   r   r{   r}   r   r   r   rJ   	_autogradZ_get_creation_metar    r   rn   _subclassesfake_tensormaybe_get_fake_moder   r   r   r#   r   ) r   r.   r   r   r@   rk   r`   rd   r   Zis_traceable_wrapper_subclass_vr   r   Zis_batchedtensor_vZis_legacy_batchedtensor_vZis_gradtrackingtensor_vr   r   rj   ri   r   r   r   Zreapply_viewsZmaybe_functorch_stackr   r   Ztype_vZ	raw_attrsr   r   Zis_inference_mode_disabledrI   r4   )r   r   r.   r   r5   rt     s  






 !"#$%')*05:?DIMORUX[\]^_cdefhz#MetaTensorDescriber.describe_tensorNr   r?   r0   rO   )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   rt   r4   r4   r4   r5   rs      s    


rs   )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 rK   r4   r   r.   r   r   r   r4   r4   r5   apply  s   zViewFunc.applyr\   c                 C  s   t | rt S t| jS rK   )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 rK   )rq   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 rK   )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   rK   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  E  s   
 r  )totalc                   @  r  )_MetaTensorCallbackOptDevicer  r  kwargs!Unpack[_MetaTensorCallbackKwargs]r0   r<   c                K  r   rK   r4   )r   r  r  r4   r4   r5   r
  N  s   z%_MetaTensorCallbackOptDevice.__call__N)r  r  r  r  r0   r<   r  r4   r4   r4   r5   r  M  r  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 )Xr8   r   r   r   r   torch.dtyper]   ztorch.devicer   tuple[int, ...]r   z	list[int]r   ry   rd   Fr?   ra   r@   r_   r`   r   r   r   r   r   rk   r   NzOptional[int]r   r%   r   rb   rc   r   Optional[tuple[int, ...]]ri   r   rj   zOptional[MetaStorageDesc]r   rf   re   zOptional[bool]rg   zOptional[MetaTensorDesc]r   r   r   r   r   r   r   rm   z#Optional[dict[str, MetaTensorDesc]]r   zOptional[CreationMeta]r   rI   >
   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   Zk1r  r4   r4   r5   r     s    z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)r8   r  r   r3   rq   r   r]   rd   ZSymInttupler   r   r   r   r  dictitems)r  r  )r  )r  r5   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   )rS   namedefault)r   fieldr  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   rK   )r   r   r4   r4   r5   r^     s   zMetaTensorDesc.shaper   )r0   r  )6r   r   r   r   rq   Zstridedrd   ra   r@   r_   r`   r   r   r   r   r   rk   r   r   r%   r   rb   rc   r   ri   rj   r   rf   re   rg   r   r   r   r   r   r   r   rm   r   r   rI   r  r   r   r   r   r   r   r   r   r   r   propertyr^   r4   r4   r4   r5   r8   W  sn   
 
$dstsrcr  c                 C  s    t |tjur	d S | | d S rK   )r   rq   rr   Zcopy_)r+  r,  r4   r4   r5   
_safe_copy  s   r-  c                 C  s   t | tjur	d S |  S rK   )r   rq   rr   clone)r,  r4   r4   r5   _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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   rO   c                C  sB   t  | _t  | _d| _d| _d | _d| _|| _t	|d| _
d S )Nr   r   )weakrefWeakValueDictionarystorage_memotensor_memohitmissZdel_hookarg_cntr   rs   	describerr   r4   r4   r5   r     s   zMetaConverter.__init__c                 C  s   | j dko	| jdkS )Nr   )r5  r6  r)  r4   r4   r5   
successful"  s   zMetaConverter.successfulr.   r8   r  c                 C     | j |jd S rK   r4  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 rK   r;  )r   r.   r   r4   r4   r5   _checked_get_tensor_memo(  s   z&MetaConverter._checked_get_tensor_memor  c                 C     || j |j< d S rK   )r4  r   )r   r.   r  r4   r4   r5   set_tensor_memo-  r   zMetaConverter.set_tensor_memor   r   r   c                 C  r:  rK   )r3  r<  r   r   r4   r4   r5   get_storage_memo0  r   zMetaConverter.get_storage_memor   c                 C  r?  rK   )r3  r   )r   r   r  r4   r4   r5   set_storage_memo3  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   )rq   emptyr   Zuint8r4   r   r4   r5   r   ?  s    z,MetaConverter.meta_storage.<locals>.<lambda>)
rA  r   r   rq   no_gradr$   r   r   r.  rB  )r   r   rC  memor_sr4   rI  r5   meta_storage6  s    
 zMetaConverter.meta_storager\   c                 C  s   t t|S rK   )typingcastr:   )clsr.   r4   r4   r5   _checked_cast_tensor_tL  s   z$MetaConverter._checked_cast_tensor_tNr  r   "Optional[Union[torch.device, str]]c                 C  s   |  | S rK   )rQ  )rP  r.   r   r4   r4   r5   _identity_callableQ  s   z MetaConverter._identity_callablec                 C  s$   t jjdd}||}tt|S )Nz9Internal error: Tried to backward() through example inputr   )rq   r   Z
_functionsZDelayedErrorrN  rO  r:   )rP  r.   Zerrfnerrr4   r4   r5   _backward_errorY  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 rjd' 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|
}
nSj<rj=rdd/l5m6} |d3 dN 	fd4d5}
n.j>rjj?d6vrj@d usJ j<rJ Aj@	}"tB|}
tCjD|
 nj=r3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| qtjOtjjjN| w j}	jWsBjXsBj<sFjYrOtZW  d    S \
}j4rd
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)_||
`  jr(t|
sJ |
jd usJ ta|
` |
j`  njb|dB}t }ddClcmd}me} ||
}|d urI||}t   u | |
f||
 W d    n	1 shw   Y  jrt A t - t|
sJ |
jd usJ j9d usJ |
jftg|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  jhd urddDlmL} Ajh	|dE|
_htji|
jj tjk|
jl W d    n	1 sw   Y  jXo!jm k}tnto|
d+|dF ddGlFmp} j[d urG|j[j8dkrG|
` qd jrrNd+|
_sjtd urdt|
s[J |
jujvjtdH|
_wx|
 yS )PNr   r   )ConstantSourceZ__meta_utils_unknown_tensorr   r.   r8   r,  torch._guards.Sourcer\  ?Optional[torch.fx.experimental.symbolic_shapes.SymbolicContext]r0   ,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 rK   #_maybe_specialize_sym_int_with_hint)r   szrV  r4   r5   	<genexpr>  
    
zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  rc  rK   rd  )r   sdrg  r4   r5   rh    ri  c                   s   g | ]}| j v qS r4   r!  )r   drB   r4   r5   r    r  zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>)r\  )
ri   r   rV  r   rj   r  re  Z-_create_symbolic_sizes_strides_storage_offsetranger   )r.   r,  r\  r   Zt_sizeZt_strideZt_storage_offsetrg  rB   r5    sym_sizes_strides_storage_offset  s.   	zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetinner_t	inner_srcr\   c                   s&    | ||\}}}t j||| jddS rE  rq   empty_stridedr]   )rn  ro  r\  Zinner_sizesZinner_stridesZ_inner_storage_offset)rm  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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   rs  r  rt  r\  ra  rC  &_MetaTensorCallbackOptDevice[_TensorT]rZ  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_tensorr   r3   inner_contextsr   rq   ZfxZexperimentalZsymbolic_shapesr-   	functoolspartialr   r   ri   r   Z__tensor_unflatten__r   )r.   rs  rt  r\  rC  rZ  Zinner_tensorsr   Zmeta_tensor_descZcurrent_contextZcurrent_context_Zcurrent_sourceZinner_callbackZnew_empty_tensor)rw  rx  _empty_create_subclassr   rV  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   rs  r  rt  r  r\  ra  rC  ry  rZ  r`  r0   r:   )
torch._dynamo.sourcerw  %torch.fx.experimental.symbolic_shapesrx  r   r   r   ri   r3   r^   )r.   rs  rt  r\  rZ  sub)rC  r   rV  )rw  rx  r~  r5   empty_create_subclass  s:   	
5

z8MetaConverter.meta_tensor.<locals>.empty_create_subclassrV  8Optional[torch.fx.experimental.symbolic_shapes.ShapeEnv]rC  rY  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   rv  )
DimDynamicStatelessSymbolicContextrx  rn   )dynamic_sizesconstraint_sizesr{  Ztensor_sourceview_base_context)r  r  r  )r  rw  r  r  r  rx  rk   rm   ZDYNAMICr   r%   r   r   r3   r  )r.   rZ  rV  rC  rw  r  r  rx  r  Zt_dynamic_sizesr{  r   innerZt_symbolic_context)all_dynamic_symbolic_contextr4   r5   r  H  sB   


z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_contextrm   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 rK   )ZSTATIC)r   xr  r4   r5   rh    ri  z_MetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fn.<locals>.<genexpr>r   )Zpositive)hintrZ  )r  r  r3   allr  Zcreate_symbolZcreate_symintnode)r   Zall_static_sizesZ
sym_sourcesymbol)r  r  rV  r\  r  r5   r     s   		zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnrs  rt  	visited_tr\   rV  r  rC  ry  c                   s`   | d u rd S j | }|d }|d ur|S j | } d}||||||||S )Nr   )r8  r   r<  rt   rz  )r  rV  rC  Z
visited_idZfake_visited_tZvisited_descZ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\   rV  r  rC  ry  r0   r\   )r"   r%   rQ  Z
as_stridedr  r  r  r  r  r   r   r   rS   r   r   r   rq   _checkr   ri   rj   )rm   r.   rV  sizesstridesrj   r  r   Zfake_tr   _r   r   )r  rC  r  maybe_suppressr   rZ  rm  r\  )r  r  r  rV  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 )NrF  )r]   rd   r   )	rq   opsatenZ_sparse_coo_tensor_with_dimsrf   re   r   r]   rw   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   rF  )rd   r]   r   )rq   r  r  Z#_sparse_compressed_tensor_with_dimsre   r^   rd   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 rE  rp  r4   r  r  r.   r4   r5   r     s    
rG  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  rE  rp  r4   r  r4   r5   r         zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>rG  )"r   r   r   r   rq   r   r   Z%temporarily_restore_interpreter_stackr   rQ  r   r   r   Z_DisableFuncTorchZ_wrap_for_gradr@   r_   rC   rU  r   r   rz  r   ri   r   r   rJ  r$   rq  r]   r   real_tensorr   r-  )r.   ftZlvlr   r   Zdisable_functorchr@   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorrC  r   rV  rZ  r\  r  r5   r    s   


FF-

+
	*			z2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   )r  rn   complex_dtyper  
real_dtyper?   c                 S  s   t | ot | |kS rK   )utilsZis_complex_dtypeZcorresponding_real_dtype)r  r  r4   r4   r5   	is_c_of_r.  s
   
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFr  c                     r  rE  rp  r4   r  r4   r5   r     r  )rC  )in_kernel_invocation_managerr   rv  rI   rV   )guard_or_false)Znt_tensor_id)r.   r8   r,  r`  r\  ra  r0   rb  )rn  r8   ro  r`  r\  ra  r0   r\   )r.   r8   rs  r  rt  r  r\  ra  rZ  ru  r0   r:   )
r.   r8   rZ  r`  rV  r  rC  rY  r0   r  )rm   r:   r.   r8   rV  r  r0   r:   r.   r8   r0   r:   )r  r  r  r  r0   r?   )zr|  r}  r   r  r_  lenr4  rq   r   Z_dispatch_tls_local_exclude_sethasZDispatchKeyPythonr7  
contextlibnullcontextZsuppress_guardsr=  Zinference_modera   r`   r@   r   r   rJ  r$   r6   r/  r  rC   Z_coalesced_r?   rg   r_   rQ  r.  Zenable_gradr~   rd   r|   r}   rf   re   r   r   r^   rz   r   r]   r   rU  r   r%   Ztorch._dynamo.excr  r   r   ri   rq  r-  r   rk   r   r   r   rz  Z_to_functional_tensorZ_mirror_autograd_meta_tor   rm   r  r  r3   r  Z_dynamorZ  rw  Z&_dispatch_tls_is_dispatch_key_excludedZADInplaceOrViewZ'_dispatch_tls_set_dispatch_key_excludedZview_as_realZview_as_complexviewr"   r   r   Z_set_creation_metar   r   r   NotImplementedr   r   r3  rj   rB  r   r   rM  r2   r  r   Zset_r   rI   Z	_set_conjrb   Z_set_negrc   r   ru   rP   r  Zresize_r   	_is_paramr   r   Zcreate_symbolic_nested_intZnested_int_memor@  r>  )r   r.   rV  rX  rZ  r\  r_  rr  r  r@   r   Z	batch_dimr  Z_storage_offsetr   Zbase_symbolic_contextr  rm   r  Zold_excludemidrj   r   rL  Zmaybe_fake_mgrr  r   Zmb_fake_moderw  rX   r  r4   )r  r  r  r  rC  r  r  r  r   rV  r  rZ  r  rm  r\  r.   r5   rz  h  s  
+mT 

 

 
 	
W





 


    
q 	




        t
zMetaConverter.meta_tensorT)rC  rZ  r\  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   Zdescribe_sourcec                     s    j jj dS )N)r   r   rZ  )r8  r   r"  r4   r   rZ  Zt_descr4   r5   r   n  s   z(MetaConverter.__call__.<locals>.<lambda>r   T) rS  r3   rq   rr   r   r   Zis_quantizedrl   rn   r`   r6  r  r5  Z	overridesZis_tensor_liker8  rt   r#   r  	ExitStackenter_contextZ	_dispatchpythonZsuspend_functionalizationr!   r   r   r   rz  r   r   r  )r   r.   rV  rC  rZ  r\  r   rX  Z
exit_stackstr   r4   r  r5   r
  2  s`   


zMetaConverter.__call__r   )r0   r?   )r.   r8   r0   r  r  )r.   r8   r  r:   r0   rO   )r   r   r0   r   )r   r   r  r   r0   rO   )r   r   rC  rD  r0   r   )r.   r\   r0   r:   rK   )r.   r  r   rR  r0   r:   )r.   r:   r0   r:   )r.   r8   rV  rW  rX  rY  rZ  r[  r\  r]  r0   r:   )r.   r\   rV  rW  rC  r  rZ  r[  r\  r]  r   r?   r0   r:   )r   r   r   r   r9  r=  r>  r@  rA  rB  rM  classmethodrQ  rS  rU  rz  r
  r4   r4   r4   r5   r0    s>    







       Tr0  )r.   r/   r0   r1   )r.   r>   r0   r?   )r.   r7   r0   rD   )r.   r7   r0   r7   )rM   r9   rN   r9   r0   rO   )r0   rQ   )rP   rY   rZ   r>   r[   r\   rW   r?   rX   r?   r0   rO   )r.   r/   r0   rv   )rd   ry   r0   r?   )r   r   r   r/   r0   r9   )rm   r   r0   r   )rm   r   r   r   r0   rO   )r+  r\   r,  r  r0   rO   )r,  r\   r0   r  )n
__future__r   r  r&  r|  	threadingrN  rF   r1  abcr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Ztyping_extensionsr   r   r   r   r   rq   Ztorch._C._autogradr   Ztorch._C._functorchr   r   r   r   r   r   r   r   r   r    r!   Ztorch._dispatch.pythonr"   Ztorch._loggingr#   Ztorch.utils._mode_utilsr$   Ztorch.utils._python_dispatchr%   Ztorch.utils.weakr&   collections.abcr'   r(   Ztorch._guardsr)   r2   r*   r+   r  r,   r-   r6   r   ZDimListrr   r7   r9   r:   r<   rC   rJ   rL   rP   localrT   rR   rU   ru   rx   r~   rh   r   r   r   r   r   r   r   r   r   rs   r   r   r   r   r  r  r  r8   r-  r/  r0  Ztorch._prims_commonZ_prims_commonr  r4   r4   r4   r5   <module>   s    04





=



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