o
    H&i?                     @   s   d dl Z d dlZd dlZd dlmZmZmZmZmZ d dl	Z	d dl
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mZ d dlmZ erNd dlmZ eZd	d
 Zdd Zdd ZddddZG dd dZ d dl!m"Z# dS )    N)ContextManagerListOptionalTupleTYPE_CHECKING)_unwrap_functional_tensor_wrap_functional_tensorcurrent_levelpeek_interpreter_stackTransformType)Source)StorageWeakRef)is_traceable_wrapper_subclasstransform_subclass)	WeakIdRef)SymbolicContextc                 C   s   z| j W S  ty   Y dS w )NF)is_leafRuntimeErrort r   GC:\wamp64\www\opt\env\Lib\site-packages\torch/_subclasses/meta_utils.pysafe_is_leaf   s
   r   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gradr   r   r   r   	safe_grad'   s   
$r   c                 C   s   | |ksJ |  d| d S )Nz != r   )abr   r   r   	assert_eq-   s   r!   Fskip_symbolicc                   s    fdd||S )Nc                    sf   | j |j  s | j|j  | j|j  | j|j  | jd u |jd u   | j|j  |  |   |  |   |  |   t	| d ut	|d u t	| d urgt	| t	| | jr | 
 |
   |  |   |  |  d S s |  |   |  |   |  |  |  r| j|j d S d S N)dtypeshaperequires_gradr   Zgrad_fn	is_sparseis_inferenceis_conjis_negr   	dense_dim
sparse_dimis_coalescedstridestorage_offset_is_view_base)m1m2r!   gor#   r   r   r6   2   s0   zassert_metadata_eq.<locals>.gor   )r!   r3   r4   r#   r   r5   r   assert_metadata_eq1   s   
r7   c                   @   s~   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zddd ddfde	e
 de	d fddZ	ddd dddddZdS )MetaConverterc                 C   s>   i | _ t | _g | _d| _d| _d| _d| _d | _	d| _
d S )N   r   )storage_memoweakrefWeakValueDictionarytensor_memomaybe_storages_to_deletecheck_expired_frequencycheck_expired_counthitmissZdel_hookarg_cntselfr   r   r   __init__Z   s   

zMetaConverter.__init__c                 C   s   | j dko	| jdkS )Nr   )rA   rB   rD   r   r   r   
successfule   s   zMetaConverter.successfulc                 C   sh   g }g }| j D ]}| s|| q|| q|D ]	}| j|d  q|| _ t| jt| j | _d S r$   )r>   expiredappendr:   popmaxr?   len)rE   Znew_liZstor_to_deleteobjr   r   r   check_for_expired_weak_storagesh   s   

z-MetaConverter.check_for_expired_weak_storagesc                 C   s   | j t|d S r$   )r=   getr   )rE   r   r   r   r   get_tensor_memo|   s   zMetaConverter.get_tensor_memoc                    sZ   t |  |js|jrd nt| t| fdd}t || || j< d S )Nc                     sZ     } | d u r	d S | j d  r r| jd  d S d ur+| j d S d S r$   )r=   rJ   rH   r:   r>   rI   )Zself_refZself_weak_refZtensor_ref_keyZweak_str   r   del_ten   s   
z.MetaConverter.set_tensor_memo.<locals>.del_ten)	r;   refr(   	is_mkldnnr   Z_typed_storager   finalizer=   )rE   r   vrR   r   rQ   r   set_tensor_memo   s   
zMetaConverter.set_tensor_memoc                    s6   t  }|| jvr| fdd | j|< | j| S )Nc                      s   t j  t jddS Nmeta)r%   device)torchemptysizeZuint8r   sr   r   <lambda>   s    z,MetaConverter.meta_storage.<locals>.<lambda>)r   r:   untyped_storage)rE   r_   callbackswrr   r^   r   meta_storage   s   


zMetaConverter.meta_storageNc                 C      |  S r$   r   r   r   r   r   r`          zMetaConverter.<lambda>sourcesymbolic_contextr   c           "         s  ddl m d u rddlm} |dt| j tj 	tjj
jr'J | j}|  jd7  _tj}d ur;j}dtttdf ttdf tf ffdd	
|  jd7  _| j| jkrg|   d| _| d u r[t  jrt}	fd
d}
t|
sJ d|
  jrd|
_jr|	st  |
 }
|
  W d    n1 sw   Y  nLjrt}	
\	}	fdd}
t|
sJ djrd|
_jr
|	s
t  |
 }
W d    n	1 sw   Y  n  r  sJ ddlm!  ddl"m#}m$} rFj%sFj&j%sF||j'gj&(  d gj&(  d}nd }| j)j& d|d}dd }tj*tjj
j+}tj,tjj
j+d z|j-j-krwn"||j-j-rt.|}n|j-|j-rt/|}n|0j-}
fdd}trt1 ! |  ||}
W d    n	1 sw   Y  W d    n	1 sw   Y  j|
_nj&jjkrt ! |  ||}
W d    n	1 sw   Y  W d    n	1 s	w   Y  nSjsJ t1  |0|j2}W d    n	1 s+w   Y  j|_t ! |  ||}
W d    n	1 sMw   Y  W d    n	1 s]w   Y  tjj34|
tjj35 W tj,tjj
j+| ntj,tjj
j+| w t}	j%s
\	}
fddt6rKddlm!  j%r>ddlm7}m8} 9 \}}i }d }|D ]'t:|d u rt;rֈj<j=nd } fdd|< qt;|t>sJ d|v sJ t;j?d tj@sJ |u rj?d |d< n%j?d jAB d usJ jCDj?d ||jEdj?d d|d< tFG||}
ntH fdd}
n
	fd d}
t|
s^J djrj|
_|	st  |
jtjId!}
W d    n	1 sw   Y  tjjJKrtLW  d    S M }tN|}|| jOvr|
j%s|
P 	kr|
Q |kr|
M | jO|< nP| jR|d"}t }dd#l mS}mT}  | |
}!|!d ur||!}|% t1  |
U||	 W d    n	1 sw   Y  W d    n	1 s	w   Y  tVd ur+ddlm!  | j)tV d$d|
_WtjX|
Y  tjZ|
[  W d    n	1 sHw   Y  t\t]|
dd% | ^|
 | S )&Nr   )
FakeTensor)ConstantSourceZ__meta_utils_unknown_tensor   return.c                    sf   d ur"t |  r| jju r|  |  |  fS j| |dS d u s(J |  |  |  fS )N)rh   )
isinstance	fake_mode	shape_envr]   r/   r0   Z,create_symbolic_sizes_strides_storage_offset)r   src)ri   ro   rh   r   r    sym_sizes_strides_storage_offset   s   
zCMetaConverter.meta_tensor.<locals>.sym_sizes_strides_storage_offsetc                      s(   t jjj     j jt jddS )NrY   )r%   layoutrZ   )	r[   opsZatenZ_sparse_coo_tensor_with_dimsr-   r,   r&   r%   Z
sparse_coor   r   r   r   r`     s    z+MetaConverter.meta_tensor.<locals>.<lambda>z)the callback you passed in doesn't detachTc                         t j jddS rX   r[   Zempty_stridedr%   r   sizesstridesr   r   r   r`   *  s    
)
AttrSource)
DimDynamicStatelessSymbolicContext)Zdynamic_sizesZconstraint_sizesr2   )rg   rh   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_rP  s
   
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFc                    s.   |j r|| S | \}}}| |||S r$   )	is_nestedZ_view_func_unsafeZ
as_strided)baser   rw   rx   r0   )rg   rq   r   r   _view_from_base  s   
z2MetaConverter.meta_tensor.<locals>._view_from_basec                    s$    | |\}}}t j||| jddS rX   ru   )inner_tZ	inner_srcZinner_sizesZinner_stridesZinner_storage_offset)rq   r   r   empty_create  s   z/MetaConverter.meta_tensor.<locals>.empty_create)TensorPropertyTensorPropertySourcec                          S r$   r   r   ry   attrr   r   rg   r   r   r`     s    
Zragged_size)hintc                    s    fddS )Nc                      r   r$   r   r   r   r   r   r`     s    z=MetaConverter.meta_tensor.<locals>.<lambda>.<locals>.<lambda>r   r   r   )ry   rb   r   rg   r   r   r`     s    c                      rt   rX   ru   r   rv   r   r   r`     s    )Zmemory_format)rb   )in_kernel_invocation_managermaybe_get_fake_moder   r"   )_Ztorch._subclasses.fake_tensorri   Ztorch._dynamo.sourcerj   rL   r=   r[   _CZ_dispatch_tls_local_exclude_sethasZDispatchKeyPythonrC   
contextlibnullcontextZsuppress_guardsr   intr@   r?   rN   rP   Zinference_moder)   r(   r   Z_coalesced_r.   r'   Zenable_gradclonerT   r1   ry   %torch.fx.experimental.symbolic_shapesrz   r{   r~   r2   ZSTATICdimmeta_tensorZ&_dispatch_tls_is_dispatch_key_excludedZADInplaceOrViewZ'_dispatch_tls_set_dispatch_key_excludedr%   Zview_as_realZview_as_complexviewZno_gradr&   Z	_autogradZ_set_creation_metaZ_get_creation_metar   r   r   Z__tensor_flatten__getattrrm   rn   ro   dict_sizeZSymIntnodeZsingleton_intZcreate_symintnodeZcreate_symbolSIZEtypeZ__tensor_unflatten__r   Zpreserve_format
_functorchZis_functorch_wrapped_tensorNotImplementedra   r   r:   r/   r0   rd   r   r   set_r   r   Z	_set_conjr*   Z_set_negr+   r7   r!   rW   )"rE   r   ro   rb   rg   rh   rj   rC   Zmaybe_suppressr   rZ_storage_offsetrz   r{   Zbase_symbolic_contextr   r}   Zold_excluder   midr0   r   r   attrsctxZtransformed_tensors_dictZorig_shape_envr_   rc   Zr_sZmaybe_fake_mgrr   r   Zmb_fake_moder   )ry   ri   r   rb   r   r   ro   rw   rg   rx   rq   rh   r   r   r      s  










 
 
 






	

    +	
     l
zMetaConverter.meta_tensorc                 C   re   r$   r   r   r   r   r   r`   ~  rf   )rb   rg   rh   c                C   s  t |tjs
t|r|jjdkrt|j|jtj	tj
tjfv |j| o+|jd uo+|jjt||jjdv grt|r|jjdkr| rJtdt }|d u s\| tjks\J d|d u rt| t|}tjj  | j|||||d}W d    n1 sw   Y  t|}	t||	 |	S tj }
t ||
}tj!j"# }| | j|||||d}W d    n1 sw   Y  t$|t% S |  j&d7  _&t'S |  j(d7  _(| j|||||d}t|tj)j*u rd|_+|S tj,-|r|  j&d7  _&t'S |S )NZxlaZlazyzVCannot safely fakify a view because this process drops the view information right now.z@Expect st to be either None or have Functionalize transform key.)ro   rb   rg   rh   rk   T).rm   r[   ZTensorr   rZ   r   anyZis_sparse_csrrr   Z
sparse_cscZ
sparse_bsrZ
sparse_bscZis_quantizedr1   r2   r(   Z_is_functional_tensorr   r
   keyr   ZFunctionalizeZ_syncZ_from_functional_tensor	_dispatchpythonZsuspend_functionalizationr   Z_to_functional_tensorZ_mirror_autograd_meta_tor   Z$_functionalization_reapply_views_tlsr   r   ZpyfunctorchZ!temporarily_pop_interpreter_stackr   r	   rB   r   rA   nn	ParameterZ	_is_paramZ	overridesZis_tensor_like)rE   r   ro   rb   rg   rh   stZunwrap_tZfake_toutZreapply_viewsZ
pop_st_ctxr   r   r   r   __call__y  s   






zMetaConverter.__call__r$   )__name__
__module____qualname__rF   rG   rN   rP   rW   rd   r   r   r   r   r   r   r   r   r8   Y   s2    $
   Jr8   )$r   r   r;   typingr   r   r   r   r   r[   Ztorch._C._functorchr   r   r	   r
   r   Ztorch._guardsr   Z torch.multiprocessing.reductionsr   Ztorch.utils._python_dispatchr   r   Ztorch.utils.weakr   r   r   ZDimListr   r   r!   r7   r8   Ztorch._prims_commonZ_prims_commonr|   r   r   r   r   <module>   s0    (     