a
    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 dddddZBeCZDeddejEZFedZGedejEdZHedejEdd ZId!d"dd#d$ZJdd%dd&d'ZKdddd(d)ZLddd*d+d,d-ZMeN ZOd.eO_Ped/d0d1d2ZQd.d.d3d4d!d5d"d"d*d6d7d8ZRdd9dd:d;ZSd<d"d=d>d?ZTdd9dd@dAZUdd9ddBdCZVdDdddEdFdGZWdHdHdIdJdKZXdHdHd*dLdMdNZYedOeZZ[edPeZZ\edQeZZ]e]d a^G dRdS dSZ_eddTG dUdV dVZ`eddTG dWdX dXeeH ZaeddTG dYdZ dZead[ ZbeddTG d\d] d]eaeH eeH ZcG d^d_ d_eeeI ZdG d`da daed.dbZeG dcdd ddeeeI ZfeddTG ded deeH Zgd5dfd*dgdhdiZhd5dfdjdkdlZiG dmdn dneeH Zjd dlkmlZm dS )o    )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objectzTypeIs[FakeTensor]treturnc                 C  s   ddl m} t| |S )Nr   )r*   )torch._subclasses.fake_tensorr*   
isinstance)r0   r*    r4   J/var/www/auris/lib/python3.9/site-packages/torch/_subclasses/meta_utils.py_is_fake_tensor>   s    r6   _TensorLikeTMetaTensorDesc_T_TensorT)bound_TensorT_covT)r;   	covariantz#Union[MetaTensorDesc, torch.Tensor]boolc                 C  s"   z| j W S  ty   Y dS 0 d S )NF)is_leafRuntimeErrorr0   r4   r4   r5   safe_is_leafK   s    rB   zOptional[_TensorLikeT]c                 C  s>   t  " t dd | jW  d    S 1 s00    Y  d S )NignorezThe .grad attribute of a Tensor)warningscatch_warningsfilterwarningsgradrA   r4   r4   r5   	safe_gradS   s    
rH   c                 C  s   t | }|d usJ |S N)rH   )r0   rG   r4   r4   r5   _expect_safe_gradY   s    rJ   None)abr1   c                 C  s   | |ksJ |  d| d S )Nz != r4   )rL   rM   r4   r4   r5   	assert_eq_   s    rN   FzGenerator[None, None, None]r1   c                  c  s0   t tdd} dt_zd V  W | t_n| t_0 d S )Ndisable_inference_modeFT)getattrtlsrP   )Zpriorr4   r4   r5   $disable_inference_mode_for_fake_propj   s
    rS   skip_symbolic	skip_leafz Callable[[object, object], None]torch.Tensor)rN   m1m2rU   rV   r1   c                  sB   t |tjrt |n|}dddd fdd||S )Nr8   rW   rK   )rX   rY   r1   c                   s   | j |j  s  | j|j  | j|j s@ | j|j  | j|j ttddsl | j|  n | jd  | j|   | j	|	   | j
d ut|d u | j
d urʈ| j
t| | jr | j|j  | j|   | j|   | j|  nt| rL | j|j  | j|   | j|  nlsr | j|   | j|   | j|  | jr| jd usJ |jd usJ | j|j d S )NrP   F)dtypeshaperequires_gradr?   	is_sparserQ   rR   is_inferenceis_conjis_negrG   rH   rJ   layout	dense_dim
sparse_dimis_coalescedis_sparse_compressedstridestorage_offsetis_view_is_viewbase_base)rX   rY   rN   gorV   rU   r4   r5   rm      s@    

zassert_metadata_eq.<locals>.go)r3   torchTensorMetaTensorDescriberdescribe_tensor)rN   rX   rY   rU   rV   r4   rl   r5   assert_metadata_eqt   s    

+rr   zTypeGuard[torch.Tensor]c                 C  s   t | tjo| jtju S rI   )r3   rn   ro   ra   
sparse_coorA   r4   r4   r5   is_sparse_coo   s    rt   torch.layout)ra   r1   c                 C  s   | t jt jt jt jhv S rI   )rn   
sparse_csr
sparse_csc
sparse_bsr
sparse_bsc)ra   r4   r4   r5   is_sparse_compressed_layout   s    rz   c                 C  s   t | tjot| jS rI   )r3   rn   ro   rz   ra   rA   r4   r4   r5   re      s    re   c                 C  s   t | pt| S rI   )rt   re   rA   r4   r4   r5   is_sparse_any   s    r{   ztype[_T])tyobjr1   c                 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   torch.UntypedStorage)rj   r1   c                 C  s   | j S rI   real_storage)rj   r4   r4   r5   _get_real_storage   s    r   )rj   r   r1   c                 C  s
   || _ d S rI   r   )rj   r   r4   r4   r5   _set_real_storage   s    r   MetaStorageIdMetaTensorId_DescriberIdc                   @  sz   e Zd ZdZdddddddZd	d
dddZdddddZddddddddZdddd	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>   rK   r   r1   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__rW   r   r/   c                 C  s0   || j vr&| j| j |< t| jd | _| j | S Nr   )r   r   r   r   r0   r4   r4   r5   get_tensor_id   s    
z!MetaTensorDescriber.get_tensor_idr   r   sr1   c                 C  s0   || j vr&| j| j |< t| jd | _| j | S r   )r   r   r   r   r   r4   r4   r5   get_storage_id   s    
z"MetaTensorDescriber.get_storage_idtraceMetaStorageDesc)r   r   r1   c                  sZ   t || jr|nd d |rV jjvrVtd fddd j j  S )N)r   sizedatadescribe_storagec                     s     jS rI   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   r8   )r0   r   r   r1   c              4     s  t } }j}j}j}t}	t}
j}t}t	}t
}t}d }d}|st|s|rv|	r|s|
s|sj d} }d }|st|s|r|	r }d }d }d }|s|rjtd}nz|r^jjdvr^ r
td|
s4t jtd}}n*tj }jt|d}tjj }d }|
rtjj }W d    n1 s0    Y  d }d }d }|	rt dsJ ! \}}fdd|D }t}ddl"m#} t$%}t&t'd	d
}t()||rd
n* |j+, j-|||
||||. / t0tj1j2|	||v rr| j34 nd ||j5 ||t6t&dt7 jst8r9 nd jst8r̈: nd jrވ; nd |rjtj<tj=hv rj> d
dnd |r>jtj<tj=hv r>j? d
dnd |rnjtj@tjAhv rnjB d
dnd |rjtj@tjAhv rjC d
dnd |rt8rĈjD d
dnd tE }d urj|dnd  r tjjFGnd ||s|rtHnd |r(tInd |rV rVjJd urVjjJdnd tjKjLM|||||||jNr~nd d2 r jOjPvrtQd fddd jPR jO  S )Nr   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   )rq   rQ   ).0attr)r   r0   r   r4   r5   
<dictcomp>q  s   z7MetaTensorDescriber.describe_tensor.<locals>.<dictcomp>)_tensor_symint_registryrP   FZ_dynamo_dynamic_indicesr   )2r   storager^   r?   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_indicesrc   rb   rd   crow_indicescol_indicesccol_indicesrow_indicesvaluesrG   creation_meta	unwrappedlevelbdimrj   	fake_mode	view_funcattrsctxr~   functorch_stackautograd_meta_fromcurrent_levelr   rq   c                     s     jS rI   r   r4   r   r4   r5   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   )SrB   ri   r]   ra   r   r%   r   r   r   r   r   rn   Z_is_functional_tensorrz   r   untyped_storagerg   rf   rq   r   r   r~   r@   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_tensorrQ   rR   r8   r   r^   r\   ZdimrZ   r_   r`   r3   nn	Parameternoder   r   listr   re   rc   rb   rd   rv   rx   r   r   rw   ry   r   r   r   rH   	_autogradZ_get_creation_metar    r   rk   _subclassesfake_tensormaybe_get_fake_moder   r   r   r#   r   ) r   r0   r   r   r?   rh   r]   ra   r   Zis_traceable_wrapper_subclass_vr   r   Zis_batchedtensor_vZis_legacy_batchedtensor_vZis_gradtrackingtensor_vr   r   rg   rf   r   r   r   Zreapply_viewsZmaybe_functorch_stackr   r   Ztype_vZ	raw_attrsr   r   Zis_inference_mode_disabledrG   r4   )r   r   r0   r   r5   rq     sV   





 
hz#MetaTensorDescriber.describe_tensorN)	__name__
__module____qualname____doc__r   r   r   r   rq   r4   r4   r4   r5   rp      s   
rp   )frozenc                   @  s6   e Zd ZU ded< ded< ded< ddd	d
dZdS )r   r   r   intr   Optional[torch.UntypedStorage]r   r   dict[str, object]describer_idr1   c                 C  s&   | j |t| jtr| jn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   r   __annotations__r   r4   r4   r4   r5   r     s   
r   c                   @  s<   e Zd ZedddddddddZedd d	d
dZdS )r   Nr:   Optional[Callable[[int], int]],Optional[Callable[[torch.Tensor], _TensorT]]r0   new_basesymint_visitor_fntensor_visitor_fnr1   c                 C  s   d S rI   r4   r   r0   r   r   r   r4   r4   r5   apply  s    zViewFunc.applyrW   r/   c                 C  s   t | rt S t| jS d S rI   )r6   _FakeTensorViewFunc_CustomViewFunc_view_func_unsaferA   r4   r4   r5   r     s    zViewFunc.from_tensor)NN)r   r   r   r   r   staticmethodr   r4   r4   r4   r5   r     s     	r   c                   @  s(   e Zd Zed	ddddddddZdS )
r   NrW   r   z.Optional[Callable[[torch.Tensor], FakeTensor]]r*   r   c                 C  s   t jjj||||S rI   )rn   r   r   r*   r   r   r4   r4   r5   r     s    
z_FakeTensorViewFunc.apply)NN)r   r   r   r   r   r4   r4   r4   r5   r     s     r   r*   c                   @  s2   e Zd ZU ded< edddddddd	d
ZdS )r   zpCallable[[torch.Tensor, Optional[Callable[[int], int]], Optional[Callable[[torch.Tensor], _TensorT]]], _TensorT]funcNrW   r   r   r:   r   c                 C  s   |  |||S rI   )r   r   r4   r4   r5   r   -  s    	z_CustomViewFunc.apply)NN)r   r   r   r   r   r   r4   r4   r4   r5   r   "  s
   
	  r   c                   @  s   e Zd ZddddddZdS )_MetaTensorCallbackCallable[[], torch.Tensor]Union[torch.device, str]r<   )argr   r1   c               C  s   d S rI   r4   )r   r   r   r4   r4   r5   __call__?  s    z_MetaTensorCallback.__call__Nr   r   r   r   r4   r4   r4   r5   r   >  s   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                   @  s   e Zd ZddddddZdS )_MetaTensorCallbackOptDevicer   z!Unpack[_MetaTensorCallbackKwargs]r<   )r   kwargsr1   c                K  s   d S rI   r4   )r   r   r  r4   r4   r5   r   N  s    z%_MetaTensorCallbackOptDevice.__call__Nr   r4   r4   r4   r5   r  M  s   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< 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< dNdOdPdQdRZ3e4d	dSdTdUZ5dS )Vr8   r   r   r   r   torch.dtyperZ   ztorch.devicer   tuple[int, ...]r   z	list[int]r   ru   ra   Fr>   r^   r?   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   rG   >
   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   r   c                   sB   dddd fdd  fddt D }|d|i |S )	Nstrr.   )kvr1   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rPt|S t|t	t
frr fdd|D S t|tt fr|jS t|trt|S  dkrt|trdd | D S |S )N)r   r   c                   s   g | ]} |qS r4   r4   )r   v1)jsonr	  r4   r5   
<listcomp>  r   z8MetaTensorDesc.as_json.<locals>.json.<locals>.<listcomp>r   c                 S  s   i | ]\}}||j qS r4   )r   )r   Zk1r  r4   r4   r5   r     r   z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)r8   r  r   r3   rn   r   rZ   ra   ZSymInttupler   r   r   r   r  dictitems)r	  r
  )r  )r	  r5   r    s"    

z$MetaTensorDesc.as_json.<locals>.jsonc                   sL   i | ]D}t |j|ju s|jd kr0t |jr|j |jt |jqS r   )rQ   namedefault)r   fieldr  r   r4   r5   r     s
   
z*MetaTensorDesc.as_json.<locals>.<dictcomp>r   )dataclassesfieldsupdate)r   r   r   r4   r  r5   r     s    zMetaTensorDesc.as_jsonrO   c                 C  s   | j S rI   )r   r   r4   r4   r5   r[     s    zMetaTensorDesc.shape)6r   r   r   r   rn   Zstridedra   r^   r?   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   rG   r  r   r~   r   r   r   r   r   r   r   r   propertyr[   r4   r4   r4   r5   r8   W  sl   
$r  )dstsrcr1   c                 C  s    t |tjurd S | | d S rI   )r~   rn   ro   Zcopy_)r  r  r4   r4   r5   
_safe_copy  s    r  )r  r1   c                 C  s   t | tjurd S |  S rI   )r~   rn   ro   clone)r  r4   r4   r5   _safe_clone  s    r  c                
   @  s  e Zd ZdddddddZddd	d
ZdddddZdddddZddddddZdddddZddddddZ	dddd d!d"Z
ed#ddd$d%Zed;d'd(dd)d*d+Zedddd,d-Zdd.d/d0d1dd2d3d4Zd<d&d&d&d5d6d#d.d7d0d1ddd8d9d:Zd&S )=MetaConverterFr   r>   rK   r   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   rp   	describerr   r4   r4   r5   r     s    zMetaConverter.__init__rO   c                 C  s   | j dko| jdkS )Nr   )r%  r&  r  r4   r4   r5   
successful"  s    zMetaConverter.successfulr8   r  r/   c                 C  s   | j |jd S rI   r$  getr   r   r4   r4   r5   get_tensor_memo%  s    zMetaConverter.get_tensor_memor:   c                 C  s    | j |jd }|d usJ |S rI   r*  )r   r0   r   r4   r4   r5   _checked_get_tensor_memo(  s    z&MetaConverter._checked_get_tensor_memo)r0   r
  r1   c                 C  s   || j |j< d S rI   )r$  r   )r   r0   r
  r4   r4   r5   set_tensor_memo-  s    zMetaConverter.set_tensor_memor   r   r   c                 C  s   | j |jd S rI   )r#  r+  r   r   r4   r4   r5   get_storage_memo0  s    zMetaConverter.get_storage_memor   )r   r
  r1   c                 C  s   || j |j< d S rI   )r#  r   )r   r   r
  r4   r4   r5   set_storage_memo3  s    zMetaConverter.set_storage_memoz0Callable[[Callable[[], torch.Tensor]], _TensorT])r   callbackr1   c              	     s   |    }d u r| fdd }| jrt T t .  jd usLJ t| j  W d    n1 sp0    Y  W d    n1 s0    Y  | 	 | |S |S d S )Nc                     s   t j jt jddS NmetarZ   r   )rn   emptyr   Zuint8r4   r   r4   r5   r   ?  r   z,MetaConverter.meta_storage.<locals>.<lambda>)
r/  r   r   rn   no_gradr$   r   r   r  r0  )r   r   r1  memor_sr4   r6  r5   meta_storage6  s    
LzMetaConverter.meta_storagerW   c                 C  s   t t|S rI   )typingcastr:   )clsr0   r4   r4   r5   _checked_cast_tensor_tL  s    z$MetaConverter._checked_cast_tensor_tNr   z"Optional[Union[torch.device, str]])r0   r   r1   c                 C  s   |  | S rI   )r>  )r=  r0   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   )rn   r   Z
_functionsZDelayedErrorr;  r<  r:   )r=  r0   Zerrfnerrr4   r4   r5   _backward_errorY  s    zMetaConverter._backward_errorzOptional[ShapeEnv]_MetaTensorCallback[_TensorT]zOptional[Source]zOptional[SymbolicContext])r0   	shape_env	callback_sourcesymbolic_contextr1   c                   s:  t j|jdd u r8ddlm} |dtj tj	 
tjjjrRJ  jd7  _tj	d urt	jfdddd	d
	fddfdddddfdd}fddddddd	fddddddddfdd	fdddddfdd}d u r0d  tjD jrfj}	fd!d"}
jr܈jd uspJ t R t * t|
sJ tj|
_W d    n1 s0    Y  W d    n1 s0    Y  t|
sJ d#|
tj  j!rd$|
_!j!r|	s"|
# }
t$   |
tj  W d    n1 sX0    Y  	nt%j&rj}	j&tj'tj(hv rj)d usJ j*d usJ j+d usJ j,j) j* }j+j-|d |d%  nd&j&tj.tj'hv rj/d usJ j/j0nj1d us*J j1j0fd'd"}
jrʈjd us^J t R t * t|
s~J tj|
_W d    n1 s0    Y  W d    n1 s0    Y  t|
sJ d#j!rd$|
_!j!r|	s2|
}
nj3r.j4s.dd(l5m6} |d) nj7r^j}	\
}
fd*d"}
jr"t  t x j8d usJ j9d usJ t|
sJ tj:j8j9j0jd+|
_jd usJ t;|
jj W d    n1 s0    Y  W d    n1 s0    Y  t|
s4J d#j!rBd$|
_!j!r|	s2|
}
nj<rj=rdd(l5m6} |d, ddd- 	fd.d/}
nlj>rjj?d0vrj@d usJ j<rJ Aj@	}"tB|}
tCjD|
 nj=rjEd us.J d }	rpd urpdd1lFmG} tH|s^J jId urpjI}AjE	tjJjKLd2|}d3d3d4d5d6d7}tjMtjjjN}tjOtjjjNd8 z|j0j0krnV||j0j0r"tP|}n4|j0|j0r "tQ|}n"|Rj0}jrxt  ||}
W d    n1 sd0    Y  j!|
_!njEj!j!krt$  ||}
W d    n1 s0    Y  nj!sJ t J tS " "|R|j-}W d    n1 s0    Y  W d    n1 s$0    Y  j!|_!t$  ||}
W d    n1 s`0    Y  jTd uszJ tjjUV|
jT W tjOtjjjN| ntjOtjjjN| 0 n\j}	jWs܈jXs܈j<sjYrtZW  d    S \
}j4	r 
d9}
nƈ
fd:d"}
j	rt  t h j8d u	s^J j9d u	snJ t|
	s|J tj:j8j9j0jd+|
_t;|
jj W d    n1 	s0    Y  W d    n1 	s0    Y  t|
	sJ d#j!
rj!|
_!|	
s2|
}
j[}|d u
s,J |j\j]v
r|
j3
s^|
9 k
r|
^ |k
r_||
`  jrt|

sJ |
jd u
sJ ta|
` |
j`  nnjb|d;}t }dd<lcmd}me} ||
}|d u
r||}t    |  |
f||
 W d    n1 s,0    Y  jrt  t Z t|
s^J |
jd usnJ j9d us~J |
jftg|j^j8j9 W d    n1 s0    Y  W d    n1 s0    Y  W d    n1 s0    Y  W d    n1 s0    Y  jhd urNdd=lmL} Ajh	|d>|
_htji|
jj tjk|
jl W d    n1 s0    Y  jXojm k}tnto|
d$|d? dd@lFmp} j[d ur|j[j8dkr|
` qd jrrd$|
_sjtd ur$t|
sJ |
jujvjtdA|
_wx|
 yS )BNr   r   )ConstantSourceZ__meta_utils_unknown_tensorr   r8   torch._guards.Source?Optional[torch.fx.experimental.symbolic_shapes.SymbolicContext]z,tuple[tuple[int, ...], tuple[int, ...], int])r0   r  rF  r1   c                   s    j d usJ d ur 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 n j j  jfS d S )Nc                 3  s   | ]}  |V  qd S rI   #_maybe_specialize_sym_int_with_hint)r   szrC  r4   r5   	<genexpr>  s   zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  s   | ]}  |V  qd S rI   rK  )r   sdrN  r4   r5   rO    s   c                   s   g | ]}| j v qS r4   r  )r   drA   r4   r5   r    r   zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>)rF  )
rf   r   rC  r   rg   r  rL  Z-_create_symbolic_sizes_strides_storage_offsetranger   )r0   r  rF  r   Zt_sizeZt_strideZt_storage_offsetrN  rA   r5    sym_sizes_strides_storage_offset  s.    	zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetrW   )inner_t	inner_srcrF  r1   c                   s&    | ||\}}}t j||| jddS r2  rn   empty_stridedrZ   )rT  rU  rF  Zinner_sizesZinner_stridesZ_inner_storage_offset)rS  r4   r5   empty_create  s    
z/MetaConverter.meta_tensor.<locals>.empty_creater  zOptional[torch._guards.Source]r:   )r0   
outer_sizeouter_striderF  rE  r1   c                   s  ddl m  ddlm | jd us&J | jd us4J |d ur@|n| j}|d urR|n| j}|d u snt|snJ ddddddd	d
 fdd|d usJ | ||||}|j	|ksJ d| j d| d|j	 | |ksJ d| j d| d|  |S )Nr   
AttrSource)SubclassSymbolicContextr8   r  rJ  &_MetaTensorCallbackOptDevice[_TensorT]rI  r:   )r0   rY  rZ  rF  r1  rE  r1   c                   s   | j d u r| |||S i }| j  D ]~\}}d }	|d urpt|sLJ |j|  }
d urpttjjj	j
|
}	 ||}tj||jd}||j|j|	||}|||< q*| jd usJ | j|| j||S )NrG  )r   meta_tensorr  r3   inner_contextsr   rn   ZfxZexperimentalZsymbolic_shapesr-   	functoolspartialr   r   rf   r~   Z__tensor_unflatten__r   )r0   rY  rZ  rF  r1  rE  Zinner_tensorsr   Zmeta_tensor_descZcurrent_contextZcurrent_context_Zcurrent_sourceZinner_callbackZnew_empty_tensor)r\  r]  _empty_create_subclassr   rC  r4   r5   rc    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 )
torch._dynamo.sourcer\  %torch.fx.experimental.symbolic_shapesr]  r   r~   r   rf   r3   r[   )r0   rY  rZ  rF  rE  sub)r1  r   rC  )r\  r]  rc  r5   empty_create_subclass  s:    	
&5

z8MetaConverter.meta_tensor.<locals>.empty_create_subclass8Optional[torch.fx.experimental.symbolic_shapes.ShapeEnv]rB  z5torch.fx.experimental.symbolic_shapes.SymbolicContext)r0   rE  rC  r1  r1   c                   s   ddl m} ddlm}m}m} d }| jrN| jd us8J  | j||d||}|jg| j	 }	| j
r| jd uspJ i }
| j D ].\}}t|tsJ  |||||||
|< q~||	d g| j	 |
||d}n||	d g| j	 |d}|S )Nr   r[  )
DimDynamicStatelessSymbolicContextr]  rk   )dynamic_sizesconstraint_sizesr`  Ztensor_sourceview_base_context)rk  rl  rm  )rd  r\  re  ri  rj  r]  rh   rj   ZDYNAMICr   r%   r   r  r3   r  )r0   rE  rC  r1  r\  ri  rj  r]  rm  Zt_dynamic_sizesr`  r   innerZt_symbolic_context)all_dynamic_symbolic_contextr4   r5   ro  H  s@    


z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_context)rj   r0   rC  r1   c              	     s  t   
|	\}}}|jspt| sp 2 | |||W  d    W  d    S 1 sf0    Y  ddlm  ddlmm} ddd fdd}i |jr|j	d usJ |j
d usJ |||d}| \}	}
|	D ]}t|||j	| j< qfd	d
dd	d fdd}|jd us<J |j|| ||}t|| | t|| | t|| | |W  d    S 1 s0    Y  d S )Nr   )EphemeralSource)rj  sym_eqr   r   c                   sn   ddl m  d uo4to4t fddjD }|sBd u rF| S d}j| |d d}j|| |dS )Nr   ri  c                 3  s   | ]}| j u V  qd S rI   )ZSTATIC)r   xrr  r4   r5   rO    s   z_MetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fn.<locals>.<genexpr>r   )Zpositive)hintrE  )re  ri  r3   allrk  Zcreate_symbolZcreate_symintnode)r   Zall_static_sizesZ
sym_sourcesymbol)rp  rj  rC  rF  rr  r5   r     s    		zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnrY  rZ  rW   rh  r^  )	visited_trC  r1  r1   c                   s`   | d u rd S j | }|d }|d ur0|S j | } d}||||||||S )Nr   )r(  r   r+  rq   r_  )rx  rC  r1  Z
visited_idZfake_visited_tZvisited_descZtemp_source)rp  ro  real_to_fake_mappingr   r4   r5   r     s"    
zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.tensor_visitor_fn)r"   r%   r>  Z
as_stridedrd  rp  re  rj  rq  r   r~   r   rQ   r   r   r   rn   _checkr   rf   rg   )rj   r0   rC  sizesstridesrg   rq  r   Zfake_tr   _r   r   )ro  r1  rg  maybe_suppressr   rE  rS  rF  )rp  rj  ry  rC  r5   view_from_base  sH    

0 +z1MetaConverter.meta_tensor.<locals>.view_from_basec                     s$   t jjj j j j jt jddS )Nr3  )rZ   ra   r   )	rn   opsatenZ_sparse_coo_tensor_with_dimsrc   rb   r   rZ   rs   r4   rA   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   r3  )ra   rZ   r   )rn   r  r  Z#_sparse_compressed_tensor_with_dimsrb   r[   ra   rZ   r4   )	blocksizeindex_dtyper0   r4   r5   r   c  s   )unimplementedz;strided nested tensors are not supported by meta conversionc                     s   t j jddS r2  rV  r4   r{  r|  r0   r4   r5   r     s   
r4  z;view functorch tensors are not supported by meta conversionr/   c              	     s  j rjd usJ jd us"J jd us0J j}j}j}tjjj" 	t
|||}W d    n1 s~0    Y  njrjd usJ jd usJ tjj}|  j}W d    n1 s0    Y  j}|kr|}nHtjjj& 	tjj||}W d    n1 s:0    Y  j}jrdt|rdd|_njr|s|}njrЈjd usJ jd usJ j	}	t|j}nĈjd usJ j j fdd}jrt r t J tjjjjjd|_j d usFJ t!|jj  W d    n1 sj0    Y  W d    n1 s0    Y  |S )NTc                     s   t j jddS r2  rV  r4   r  r4   r5   r     s
   zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>r4  )"r   r   r   r   rn   r   r   Z%temporarily_restore_interpreter_stackr   r>  r   r   r   Z_DisableFuncTorchZ_wrap_for_gradr?   r\   rB   rA  r   r   r_  r   rf   r   r   r7  r$   rW  rZ   r   real_tensorr   r  )r0   ftZlvlr   r   Zdisable_functorchr?   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorr1  r   rC  rE  rF  r  r5   r    s~    

&($
	Nz2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   )rj  rk   r  r>   )complex_dtype
real_dtyper1   c                 S  s   t | ot | |kS rI   )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_rFrw  c                     s   t j jddS r2  rV  r4   r  r4   r5   r     s
   )r1  )in_kernel_invocation_managerr   r[  rG   rT   )guard_or_false)Znt_tensor_id)zra  rb  r   rd  rH  lenr$  rn   r   Z_dispatch_tls_local_exclude_setZhasZDispatchKeyPythonr'  
contextlibnullcontextZsuppress_guardsr,  Zinference_moder^   r]   r?   r   r   r7  r$   r6   r  r  rB   Z_coalesced_r>   rd   r\   r>  r  Zenable_gradrz   ra   rx   ry   rc   rb   r   r   r[   rv   r   rZ   r   rA  r   r%   Ztorch._dynamo.excr  r   r   rf   rW  r  r   rh   r   r~   r   r_  Z_to_functional_tensorZ_mirror_autograd_meta_tor   rj   re  rj  r3   rm  Z_dynamorE  r\  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   r#  rg   r0  r   r   r:  r2   r  r   set_r   rG   Z	_set_conjr_   Z_set_negr`   r   rr   rN   r  Zresize_r   	_is_paramr   r   Zcreate_symbolic_nested_intZnested_int_memor.  r-  )r   r0   rC  rD  rE  rF  rH  rX  r  r?   r   Z	batch_dimr  Z_storage_offsetr   Zbase_symbolic_contextrj  rj   r  Zold_excludeZmidrg   r   r9  Zmaybe_fake_mgrr  r   Zmb_fake_moder\  rV   r  r4   )r  r  ro  r  r1  rg  r  r~  r   rC  r{  rE  r|  rS  rF  r0   r5   r_  h  s.   
+"mT( 

L
4
LN W

*

,

D
*



N




00zMetaConverter.meta_tensorT)r1  rE  rF  r   z'Optional[_MetaTensorCallback[_TensorT]])r0   rC  r1  rE  rF  r   r1   c                  s`  |d u r j }n|}t|tjrn|jjdksL|jsL| r^|jd ur^|jj	r^  j
d7  _
tS   jd7  _n"tj|r  j
d7  _
tS |S d u rd} jj||d|rԈd usJ td fddd t V}|tjj  t }	|	d ur|tjj   |||}
W d    n1 s:0    Y  t|tjju r\d	|
_|
S )
Nr   r   Fr   Zdescribe_sourcec                     s    j jj dS )N)r   r   rE  )r(  r   r  r4   r   rE  Zt_descr4   r5   r   n  s    z(MetaConverter.__call__.<locals>.<lambda>r   T) r?  r3   rn   ro   r   r~   Zis_quantizedri   rk   r]   r&  r  r%  Z	overridesZis_tensor_liker(  rq   r#   r  	ExitStackenter_context	_dispatchpythonZsuspend_functionalizationr!   r   r   r   r_  r   r   r  )r   r0   rC  r1  rE  rF  r   rD  Z
exit_stackstr   r4   r  r5   r   2  s^    



$zMetaConverter.__call__)N)N)r   r   r   r   r)  r,  r-  r.  r/  r0  r:  classmethodr>  r?  rA  r_  r   r4   r4   r4   r5   r     s<           T r   )n
__future__r   r  r  ra  	threadingr;  rD   r!  abcr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Ztyping_extensionsr   r   r   r   r   rn   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+   re  r,   r-   r6   r   ZDimListro   r7   r9   r:   r<   rB   rH   rJ   rN   localrR   rP   rS   rr   rt   rz   re   r{   r   r   r   r   r   r   r   r   rp   r   r   r   r   r   r   r  r8   r  r  r   Ztorch._prims_commonZ_prims_commonr  r4   r4   r4   r5   <module>   s   04=



  
 "         