U
    yh"                    @  s  U d dl m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	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Zd dlmZ d dlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z% d d	l&m'Z' d d
l(m)Z) d dl*m+Z+ er,d dlm,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 eZ4dd Z5dd Z6dd Z7ddddddddZ8dd Z9dd  Z:d!d" Z;d#d$ Z<e=Z>d%e?d&< e=Z@d%e?d'< d aAG d(d) d)ZBed*d+G d,d- d-ZCed*d+G d.d/ d/ZDd0d1 ZEd2d3 ZFG d4d5 d5ZGd dlHmIZJ dS )6    )annotationsN)	dataclass)AnyCallableClassVarContextManagerDictListOptionalTupleTypeTYPE_CHECKINGUnion)	TypeAlias)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)FakeTensorMode)ShapeEnvSymbolicContextc                 C  s$   z| j W S  tk
r   Y dS X d S )NF)is_leafRuntimeErrort r)   N/var/www/html/venv/lib/python3.8/site-packages/torch/_subclasses/meta_utils.pysafe_is_leaf<   s    r+   c              
   C  s2   t    t dd | jW  5 Q R  S Q R X d S )NignorezThe .grad attribute of a Tensor)warningscatch_warningsfilterwarningsgradr'   r)   r)   r*   	safe_gradD   s    
r1   c                 C  s   | |kst |  d| d S )Nz != )AssertionError)abr)   r)   r*   	assert_eqJ   s    r5   Fskip_symbolic	skip_leafz#Union[MetaTensorDesc, torch.Tensor]torch.Tensorm1m2c                  s4   t |tjrt |} fdd||S )Nc                   s8   | j |j  s  | j|j  | j|j s@ | j|j  | j|j  | j|   | j|   | j|   | jd k	t	|d k	 | jd k	r| jt	| | jr | j
|
   | j|   | j|  nLs | j|   | j|   | j|  | jr4| j|j d S N)dtypeshaperequires_gradr%   	is_sparseis_inferenceis_conjis_negr0   r1   	dense_dim
sparse_dimis_coalescedstridestorage_offsetis_view_is_viewbase_baser:   r5   gor8   r7   r)   r*   rO   Y   s.    
zassert_metadata_eq.<locals>.go)
isinstancetorchTensorMetaTensorDescriberdescribe_tensor)r5   r;   r<   r7   r8   r)   rN   r*   assert_metadata_eqN   s    rU   c                 C  s   t | tjo| jtjkS r=   )rP   rQ   rR   layout
sparse_coor'   r)   r)   r*   is_sparse_coo{   s    rX   c                 C  s   | t jt jt jt jhkS r=   )rQ   
sparse_csr
sparse_csc
sparse_bsr
sparse_bsc)rV   r)   r)   r*   is_sparse_compressed_layout   s    r]   c                 C  s   t | tjot| jS r=   )rP   rQ   rR   r]   rV   r'   r)   r)   r*   is_sparse_compressed   s    r^   c                 C  s   t | pt| S r=   )rX   r^   r'   r)   r)   r*   is_sparse_any   s    r_   r   MetaStorageIdMetaTensorIdc                   @  sj   e Zd ZdZddddZdddd	Zd
dddZddd
ddddZddd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_datac                C  sD   t | _t d7 a d| _d| _t | _t | _|| _t | _	t | _
d S )N   r   )DESCRIBER_NEXT_IDidnext_tensor_idnext_storage_idr   lookup_tensorlookup_storagerc   settraced_tensorstraced_storagesselfrc   r)   r)   r*   __init__   s    zMetaTensorDescriber.__init__r9   r'   c                 C  s.   || j kr$| j| j |< |  jd7  _| j | S Nrd   )ri   rg   ro   r(   r)   r)   r*   get_tensor_id   s    
z!MetaTensorDescriber.get_tensor_idztorch.UntypedStoragesc                 C  s.   || j kr$| j| j |< |  jd7  _| j | S rq   )rj   rh   ro   ru   r)   r)   r*   get_storage_id   s    
z"MetaTensorDescriber.get_storage_idtracebool)ru   ry   c                  sZ   t || jr|nd d |rV jjkrVtd fddd j j  S )N)rf   sizedatadescribe_storagec                     s     jS r=   as_jsonrf   r)   rro   r)   r*   <lambda>       z6MetaTensorDescriber.describe_storage.<locals>.<lambda>Zmetadata_fn)MetaStorageDescrw   r{   rc   rf   rm   r   add)ro   ru   ry   r)   r   r*   r}      s    z$MetaTensorDescriber.describe_storageTrecursery   )r(   r   ry   c             3     sp  t } }j}j}j}t}	t}
j}t}t	}t
}|pV|}t}d }d}|st|s|r~|	r|s|
s|sj d} }d }|st|s|r|	rĈ }d }d }d }|s|rjtd}nz|rfjjdkrf rtd|
s<t jtd}}n*tj }jt|d}tjj }d }|
rtjj }W 5 Q R X d }d }d }|	rt dst!" \}}fdd|D }t}t#$|% |j&' j(|||
||||) * t+tj,j-|	|||j. ||t/t0dt1 jsTt2r\3 nd jspt2rx4 nd jr5 nd |rjtj6tj7hkrj8 d	d
nd |rjtj6tj7hkrj9 d	d
nd |rjtj:tj;hkrj< d	d
nd |rJjtj:tj;hkrJj= d	d
nd |rpt2rpj> d	d
nd t?d k	rjt?dnd  rtjj@And ||s|rtBnd |rtCnd |r rjDd k	rjjDdnd tjEjFGjH||||||jIr,nd d1 rl jJjKkrltLd fddd jKM jJ  S )Nr   rx   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 )rx   )rT   getattr).0attr)ro   r(   ry   r)   r*   
<dictcomp>(  s    z7MetaTensorDescriber.describe_tensor.<locals>.<dictcomp>Z_dynamo_dynamic_indicesFr   )1rf   storagerB   r%   r@   ndimr>   rA   	is_mkldnnis_functorch_wrappedr   r   r   rJ   rC   rD   is_parameterr   	is_nestedis_functionalrV   devicer{   rH   rI   dynamo_dynamic_indicesrF   rE   rG   crow_indicescol_indicesccol_indicesrow_indicesvaluesr0   creation_meta	unwrappedlevelbdimrL   	fake_mode	view_funcattrsctxtypefunctorch_stackautograd_meta_fromcurrent_levelr|   rT   c                     s     jS r=   r~   r)   r   r)   r*   r     r   z5MetaTensorDescriber.describe_tensor.<locals>.<lambda>r   )Nr+   rK   rA   rV   r   r   r   r   r   r   r   rQ   Z_is_functional_tensorr]   r}   untyped_storagerI   rH   rT   r   r   r   r&   Z_syncZ_from_functional_tensor_CZ$_functionalization_reapply_views_tlsr   
_functorchr   pyfunctorch#temporarily_clear_interpreter_stackhasattrr2   r   MetaTensorDescrs   rB   r@   dimr>   rC   rD   rP   nn	Parameterr{   listr   rk   r^   rF   rE   rG   rY   r[   r   r   rZ   r\   r   r   r   r1   	_autogradZ_get_creation_metar   r   rM   Z_subclassesZfake_tensormaybe_get_fake_modeZ_view_func_unsaferc   rf   rl   r   r   )ro   r(   r   ry   r%   rJ   rA   rV   r   Zis_traceable_wrapper_subclass_vr   r   Zis_batchedtensor_vZis_legacy_batchedtensor_vZis_gradtrackingtensor_vZis_functorch_batched_or_gradr   r   rI   rH   r   r   r   Zreapply_viewsZmaybe_functorch_stackr   r   Ztype_vZ	raw_attrsr)   )r   ro   r(   ry   r*   rT      s|   


 
 
        
[z#MetaTensorDescriber.describe_tensorN)	__name__
__module____qualname____doc__rp   rs   rw   r}   rT   r)   r)   r)   r*   rS      s   
 rS   T)frozenc                   @  s.   e Zd ZU ded< ded< ded< dd Zd	S )
r   r`   rf   intr{   zOptional[torch.UntypedStorage]r|   c                 C  s&   | j |t| jtr| jnt| jdS )N)rf   describer_idr{   )rf   rP   r{   r   repr)ro   r   r)   r)   r*   r     s    zMetaStorageDesc.as_jsonN)r   r   r   __annotations__r   r)   r)   r)   r*   r     s   
r   c                	   @  sv  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%d6ed7< d!Z&d8ed9< d!Z'd-ed:< d;d<d=d>d?d@dAdBdCg	Z(dDedE< d!Z)dFed;< d!Z*dGed<< d!Z+dHed=< d!Z,dIed>< d!Z-d(ed?< d!Z.d(ed@< d!Z/dJedA< d!Z0dKedB< d!Z1dKedC< dLdM Z2e3dNdO Z4d!S )Pr   ra   rf   r   r   ztorch.dtyper>   ztorch.devicer   zTuple[int, ...]r{   z	List[int]r   ztorch.layoutrV   Frz   rB   r%   r@   rA   r   r   r   r   r   rJ   r   r   r   rC   rD   r   NzOptional[Tuple[int, ...]]rH   r   rI   zOptional[MetaStorageDesc]r   zOptional[int]rF   rE   zOptional[bool]rG   zOptional[MetaTensorDesc]r   r   r   r   r   r   r   rL   z#Optional[Dict[str, MetaTensorDesc]]r   zOptional[CreationMeta]r   r0   r   r   r   r   r   r   r   r   r|   zClassVar[List[str]]_UNSERIALIZABLEzOptional[object]zOptional[Type]zOptional[FakeTensorMode]znOptional[Callable[[torch.Tensor, Callable[[int], int], Callable[[torch.Tensor], torch.Tensor]], torch.Tensor]]zOptional[List[CInterpreter]]zOptional[torch.Tensor]c                   s8    fdd  fddt D }|d|i |S )Nc                   s    dkrd S  t tjkr"t|S t|tjtjtjfr@t|S t|tj	rTt|S t|t
tfrv 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 r)   r)   )r   v1)jsonkr)   r*   
<listcomp>!  s     z8MetaTensorDesc.as_json.<locals>.json.<locals>.<listcomp>r   c                 S  s   i | ]\}}||j qS r)   )rf   )r   Zk1r   r)   r)   r*   r   '  s      z8MetaTensorDesc.as_json.<locals>.json.<locals>.<dictcomp>)rk   r   r   r   rP   rQ   r   r>   rV   ZSymInttupler   r   rf   r   strdictitems)r   v)r   )r   r*   r     s"    
z$MetaTensorDesc.as_json.<locals>.jsonc                   sL   i | ]D}t |j|jks|jd kr0t |jr|j |jt |jqS r   )r   namedefault)r   fieldr   ro   r)   r*   r   *  s   
 z*MetaTensorDesc.as_json.<locals>.<dictcomp>r   )dataclassesfieldsupdate)ro   r   r   r)   r   r*   r     s    zMetaTensorDesc.as_jsonc                 C  s   | j S r=   )r{   ro   r)   r)   r*   r?   8  s    zMetaTensorDesc.shape)5r   r   r   r   rQ   ZstridedrV   rB   r%   r@   rA   r   r   r   r   r   rJ   r   r   r   rC   rD   r   rH   rI   r   rF   rE   rG   r   r   r   r   r   r   r   rL   r   r   r0   r   r   r   r   r   r   r   r   r   r|   r   propertyr?   r)   r)   r)   r*   r     s~   


$r   c                 C  s    t |tjk	rd S | | d S r=   )r   rQ   rR   Zcopy_)dstsrcr)   r)   r*   
_safe_copyI  s    r   c                 C  s   t | tjk	rd S |  S r=   )r   rQ   rR   clone)r   r)   r)   r*   _safe_cloneO  s    r   c                   @  s   e Zd ZddddddZdd Zdd	d
dZdd	ddZddddZddddZddddZ	ddd ddfdddddddZ
d$dd ddd d!d"d#ZdS )%MetaConverterFrb   rz   c                C  sB   t  | _t  | _d| _d| _d | _d| _|| _t	|d| _
d S )Nr   rb   )weakrefWeakValueDictionarystorage_memotensor_memohitmissZdel_hookarg_cntrc   rS   	describerrn   r)   r)   r*   rp   ]  s    

zMetaConverter.__init__c                 C  s   | j dko| jdkS )Nr   )r   r   r   r)   r)   r*   
successfuln  s    zMetaConverter.successfulr   r'   c                 C  s   | j |jd S r=   )r   getrf   rr   r)   r)   r*   get_tensor_memoq  s    zMetaConverter.get_tensor_memoc                 C  s   || j |j< d S r=   )r   rf   )ro   r(   r   r)   r)   r*   set_tensor_memot  s    zMetaConverter.set_tensor_memor   rt   c                 C  s   | j |jd S r=   )r   r   rf   rv   r)   r)   r*   get_storage_memow  s    zMetaConverter.get_storage_memoc                 C  s   || j |j< d S r=   )r   rf   )ro   ru   r   r)   r)   r*   set_storage_memoz  s    zMetaConverter.set_storage_memoc              
     s   |   d krx| fdd }| jrht 2 t    jd k	sHt j |_	W 5 Q R X W 5 Q R X | 
 | |S |   S d S )Nc                     s   t j jt jddS Nmetar>   r   )rQ   emptyr{   Zuint8r)   rt   r)   r*   r     r   z,MetaConverter.meta_storage.<locals>.<lambda>)r   r   rc   rQ   no_gradr   r|   r2   r   real_storager   )ro   ru   callbackr_sr)   rt   r*   meta_storage}  s    
 zMetaConverter.meta_storageNc                 C  s   |  S r=   r)   r'   r)   r)   r*   r     r   zMetaConverter.<lambda>zOptional[ShapeEnv]zOptional[Source]zOptional[SymbolicContext])r(   	shape_envsourcesymbolic_contextc                   sR
  d kr(ddl m} |dt	j tj tjjj	rBt
	j}	 jd7  _tj
d k	rj
jfddd
fdd	fdd
fddfdd	fddddfdd
fddd	fdd}	d k
rHd tj jrވj}	fdd}
	jrxjd k	sFt
t $ t  tj|
_W 5 Q R X W 5 Q R X t|
st
d|
j jrd|
_j	r|		s|
 }
t  |
j W 5 Q R X nt j!rNj}	j!tj"tj#hkr`j$d k	st
j%d k	s$t
j&d k	s4t
j'j$ j% }j&j(|d |d  ndj!tj)tj"hkrj*d k	st
j*j+nj,d k	st
j,j+fdd}
	jrjd k	st
t $ t  tj|
_W 5 Q R X W 5 Q R X t|
st
djr(d|
_j	r|		stjj-.dd|
}
n4j/rvj0svddl1m2} |d  nj3rvj}	\}fd!d}
	jr0t r t ` j4d k	st
j5d k	st
tj6j4j5j+j7d"|
_jd k	st
t8|
jj W 5 Q R X W 5 Q R X t|
sBt
djrPd|
_j	r|		stjj-.dd|
}
nj9rĈj:rddl1m2} |d# dd 	
fd$d%}
nj;r(j7j<d&kr(j=d k	st
j9rt
	j>j=
d'}t?|}
t@jA|
 nZj:rjBd k	s@t
d }
rd k	rdd(lCmD} tE|spt
jFd k	rjF}	j>jB
tjGjHId)|d*}d+d, }tjJtjjjK}tjLtjjjKd- z,|j+j+krnD||j+j+rtM|}n(|j+|j+rtN|}n|Oj+}jrZt  ||}
W 5 Q R X j|
_njBjjkrt  ||}
W 5 Q R X nRjst
t  |O|j(}W 5 Q R X j|_t  ||}
W 5 Q R X jPd k	st
tjjQR|
jP W 5 tjLtjjjK| X nfj}	jSs:jTs:j9sBjUrRtVW  5 Q R  S \}j0r|d.}
nfd/d}
	jrt b t P j4d k	st
j5d k	st
tj6j4j5j+j7d"|
_t8|
jj W 5 Q R X W 5 Q R X t|
st
djrDj|
_|	sDtjj-.dd|
}
jW}|d k	sXt
|jX	jYkr|
j/s|
5 kr|
Z |kr	[||
\  	j	r|
j\ |
\ _]nΈ	j^|d0}t }dd1l_m`}ma} ||
}|d k	r||}t   n | |
b|| W 5 Q R X 	j	rnt 2 t   |
jb|j]jZj4j5 W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X jcd k		rdd2l mI} 	j>jc
|d3d*|
_ctjd|
je tjf|
jg W 5 Q R X jT	ojh k}titj|
d|d4 jWd k	
r.jWj4dk
r.|
\ kd jl
r<d|
_m	n|
 	S )5Nr   )ConstantSourceZ__meta_utils_unknown_tensorrd   r   z,Tuple[Tuple[int, ...], Tuple[int, ...], int])r(   returnc                   s    j d k	std k	r j}|d k	r>|jk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 r=   #_maybe_specialize_sym_int_with_hint)r   szr   r)   r*   	<genexpr>  s   zVMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<genexpr>c                 3  s   | ]}  |V  qd S r=   r   )r   sdr   r)   r*   r     s   c                   s   g | ]}| j kqS r)   r   )r   dr'   r)   r*   r     s     zWMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset.<locals>.<listcomp>r   )rH   r2   r   r   r{   rI   r   r   Z-_create_symbolic_sizes_strides_storage_offsetranger   )r(   r   r   r   Zt_sizeZt_strideZt_storage_offsetr   r'   r*    sym_sizes_strides_storage_offset  s.    	zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offset)inner_tc                   s&    | ||\}}}t j||| jddS r   rQ   empty_stridedr>   )r   Z	inner_srcr   Zinner_sizesZinner_stridesZinner_storage_offset)r   r)   r*   empty_create  s    
z/MetaConverter.meta_tensor.<locals>.empty_creater'   c           	        s
  ddl m  ddlm} | jd k	s&t| jd k	s4td ksJt|sJt|d k	rV|n| j}|d k	rh|n| j	} fddfdd| j
 D }| j|| j||}|j|kstd| j d	| d
|j |	 |kstd| j d| d
|	  |S )Nr   
AttrSource)SubclassSymbolicContextc              
     s    fdd}j r~t P t > tjjjjjd|_	j
d k	s\tt|j	j
 W 5 Q R X W 5 Q R X |S )Nc                     s&    d krd nj  dS )Nr   )inner_contextsr)   )r  r   r  r   r   r   r)   r*   r   !  s   z]MetaConverter.meta_tensor.<locals>.empty_create_subclass.<locals>.transform.<locals>.<lambda>r   )rc   rQ   r   r   r  r{   rH   r>   r   real_tensorr|   r2   r   )r   r   r   )r  r   r  ro   r   r   )r   r   r*   	transform  s    "zKMetaConverter.meta_tensor.<locals>.empty_create_subclass.<locals>.transformc                   s   i | ]\}}| ||qS r)   r)   )r   r   r   )r	  r)   r*   r   7  s     zLMetaConverter.meta_tensor.<locals>.empty_create_subclass.<locals>.<dictcomp>z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   r2   r   rP   r{   rH   r   Z__tensor_unflatten__r   r?   )	r(   
outer_sizeouter_strider   r   r   r  Ztransformed_tensors_dictsub)r  ro   )r  r   r   r   r	  r*   empty_create_subclass  s6    
 
   z8MetaConverter.meta_tensor.<locals>.empty_create_subclassc                   s   ddl m} ddlm}m}m} d }| jrN| jd k	s8t | j||d||}|j	g| j
 }	| jr| jd k	spti }
| j D ].\}}t|tst |||||||
|< q~||	d g| j
 |
||d}n||	d g| j
 |d}|S )Nr   r  )
DimDynamicStatelessSymbolicContextr  rM   )dynamic_sizesconstraint_sizesr  Ztensor_sourceview_base_context)r  r  r  )r
  r  r  r  r  r  rJ   rL   r2   ZDYNAMICr   r   r   r   rP   r   )r(   r   r   r   r  r  r  r  r  Zt_dynamic_sizesr  r   innerZt_symbolic_context)all_dynamic_symbolic_contextr)   r*   r  Q  sH          


z?MetaConverter.meta_tensor.<locals>.all_dynamic_symbolic_contextr9   )rL   r(   c              
     sP  	||\}}}|j sFt | sF  | |||W  5 Q R  S Q R X ddlm  ddlmm}  
fdd}i |j r|jd k	st|j	d k	st|||d}	|	
 \}
}|
D ]}t|	||j| j< qfdd fd	d
}|jd k	st|| ||}	t||	 | t||	 | t||	 | |	S )Nr   )EphemeralSource)r  sym_eqc                   sj   ddl m  d k	o4to4t fddjD }|sBd krF| S d}| |}j|| |dS )Nr   r  c                 3  s   | ]}| j kV  qd S r=   )ZSTATIC)r   xr  r)   r*   r     s    z_MetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fn.<locals>.<genexpr>symint_visitor_fn)hintr   )r  r  rP   allr  Zcreate_symbolZcreate_symintnode)ru   Zall_static_sizesZ
sym_sourcesymbol)r  r  r   r   r  r*   r    s    	zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.symint_visitor_fnr  r  r9   )	visited_tc              
     sb   | d krd S j | }|d }|d k	r0|S j | } d}j||||||||dS )Ntensor_visitor_fnr   r   )r   rs   r   rT   meta_tensor)r   r   r   Z
visited_idZfake_visited_tZvisited_descZtemp_source)r  r  real_to_fake_mappingro   r)   r*   r!    s(       zLMetaConverter.meta_tensor.<locals>.view_from_base.<locals>.tensor_visitor_fn)r   Z
as_stridedr
  r  r  r  r  r   r2   r   r   r   rf   r   rQ   _checkr{   rH   rI   )rL   r(   r   r   sizesstridesrI   r  r  Zfake_tr   _r   r!  )r  r   r  maybe_suppressro   r   r   )r  r  r$  r   r*   view_from_base  sD     
   )z1MetaConverter.meta_tensor.<locals>.view_from_basec                     s$   t jjj j j j jt jddS )Nr   )r>   rV   r   )	rQ   opsatenZ_sparse_coo_tensor_with_dimsrF   rE   r{   r>   rW   r)   r'   r)   r*   r   #  s   z+MetaConverter.meta_tensor.<locals>.<lambda>z)the callback you passed in doesn't detachT   r)   c                
     s&   t jjjdjj jjddS )Nr   r   )rV   r>   r   )rQ   r,  r-  Z#_sparse_compressed_tensor_with_dimsrE   r?   rV   r>   r)   )	blocksizeindex_dtyper(   r)   r*   r   U  s   9Internal error: Tried to backward() through example input)unimplementedz;strided nested tensors are not supported by meta conversionc                     s   t j jddS r   r  r)   r&  r'  r(   r)   r*   r   ~  s
      r   z;view functorch tensors are not supported by meta conversionc              
     s&  j rrjd k	stjd k	s"tjd k	s0tj}j}j}tjjj	 t
|||}W 5 Q R X njr>jd k	stjd k	sttjj}|  j}W 5 Q R X j}|kr|}n,tjjj	 tjj||}W 5 Q R X j}jrt|rd|_n"jr"|s"tjjdd|}njrjd k	sVtjd k	sftjj	d}t|j}njd k	stj j fdd}jr"t R t @ tjjjjjd|_ j!d k	s tt"|j j! W 5 Q R X W 5 Q R X |S )NTr1  rd   r   r   r   r   c                     s   t j jddS r   r  r)   r3  r)   r*   r     s
   zDMetaConverter.meta_tensor.<locals>._to_fake_tensor.<locals>.<lambda>r   )#r   r   r2   r   r   rQ   r   r   Z%temporarily_restore_interpreter_stackr   r   r   r   Z_DisableFuncTorchZ_wrap_for_gradr%   r@   r+   
_functionsDelayedErrorr   r   r#  r   rH   r{   rc   r   r   r  r>   r   r  r|   r   )r(   ftZlvlr   r   Zdisable_functorchr%   )GRAD_TENSOR_SENTINEL_VALUE_to_fake_tensorr   ro   r   r   r   r3  r*   r9    s|    
"z2MetaConverter.meta_tensor.<locals>._to_fake_tensorr   r4  )r  rM   r"  c                 S  s   t | ot | |kS r=   )utilsZis_complex_dtypeZcorresponding_real_dtype)Zcomplex_dtypeZ
real_dtyper)   r)   r*   	is_c_of_r  s
    
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFr  c                     s   t j jddS r   r  r)   r3  r)   r*   r     s
   )r   )in_kernel_invocation_managerr   r  r0   r6   )or
  r   lenr   rQ   r   Z_dispatch_tls_local_exclude_sethasZDispatchKeyPythonr2   r   
contextlibnullcontextZsuppress_guardsr   Zinference_moderB   rA   r%   rc   r|   r   r   r   r  r+   Z_coalesced_rG   r@   r   Zenable_gradr]   rV   r[   r\   rF   rE   r   r   r?   rY   r   r>   r   r5  r6  r   r   Ztorch._dynamo.excr2  r   r{   rH   r  r   r   r   rJ   r   r   r   r#  Z_to_functional_tensorZ_mirror_autograd_meta_tor   rL   r  r  rP   r  Z_dynamor   r  Z&_dispatch_tls_is_dispatch_key_excludedZADInplaceOrViewZ'_dispatch_tls_set_dispatch_key_excludedZview_as_realZview_as_complexviewr   r   Z_set_creation_metar   r   r   NotImplementedr   rf   r   rI   r   r   r   r   torch._subclasses.fake_tensorr<  r   set_r0   Z	_set_conjrC   Z_set_negrD   r   rU   r5   Zresize_r   	_is_paramr   )ro   r(   r   r   r   r   r   r   r*  r%   r   Z	batch_dimr2  Z_storage_offsetr   Zbase_symbolic_contextr  rL   r;  Zold_excludemidrI   ru   r   Zmaybe_fake_mgrr<  r   Zmb_fake_moder  r8   r)   )r8  r9  r  r/  r   r  r  r0  r)  ro   r   r&  r   r'  r   r   r(   r*   r#    s*   
#SI "

 

  
   "T
 





 

     "




,zMetaConverter.meta_tensorc                 C  s   |  S r=   r)   r'   r)   r)   r*   r     r   T)r   r   r   ry   c          
   	     s2  t |tjst|rb|jjdks@|js@| rR|jd k	rR|jj	rR  j
d7  _
tS   jd7  _n"tj|r  j
d7  _
tS |S d krd} jj||d|rtd fddd t L}|tjj  t }|d k	r|tjj   j|||d	}	W 5 Q R X t|tjjkr.d
|	_|	S )Nr   rd   Frx   Zdescribe_sourcec                     s    j jj dS )N)r   rf   r   )r   rf   r   r)   ro   r   Zt_descr)   r*   r   C  s    z(MetaConverter.__call__.<locals>.<lambda>r   r4  T) rP   rQ   rR   r   r   r   Zis_quantizedrK   rM   rA   r   rC  r   Z	overridesZis_tensor_liker   rT   r   r@  	ExitStackenter_contextZ	_dispatchpythonZsuspend_functionalizationr   r   r   r   r#  r   r   rF  )
ro   r(   r   r   r   r   ry   Z
exit_stackstr   r)   rH  r*   __call__  sV    


zMetaConverter.__call__)N)r   r   r   rp   r   r   r   r   r   r   r#  rM  r)   r)   r)   r*   r   \  s4           r   )K
__future__r   r@  r   r-   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   typing_extensionsr   rQ   Ztorch._C._autogradr   Ztorch._C._functorchr   r   r   r   r   r   r   r   r   r   r   Ztorch._loggingr   Ztorch.utils._mode_utilsr   Ztorch.utils._python_dispatchr   Ztorch.utils.weakr   r    Ztorch._guardsr!   rD  r"   r  r#   r$   ZDimListr+   r1   r5   rU   rX   r]   r^   r_   r   r`   r   ra   re   rS   r   r   r   r   r   Ztorch._prims_commonZ_prims_commonr:  r)   r)   r)   r*   <module>   sj    44	-	 } %        