U
    9%eq                     @   s   d dl Z d dlZd dlZd dl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mZ d dlmZ d dlmZmZ d 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)_unwrap_functional_tensor_wrap_functional_tensorcurrent_levelpeek_interpreter_stackTransformType)Source)DimConstraint
DimDynamic)StorageWeakRef)is_traceable_wrapper_subclasstransform_subclass)	WeakIdRefc                 C   s$   z| j W S  tk
r   Y dS X d S )NF)is_leafRuntimeErrort r   [/var/www/html/Darija-Ai-API/env/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_grad#   s    
r   c                 C   s   | |kst |  d| d S )Nz != )AssertionError)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 k|jd k  | j|j  |  |   |  |   |  |   t	| d k	t	|d k	 t	| d k	rΈt	| t	| | jr | 
 |
   |  |   |  |  nTs8 |  |   |  |   |  |  |  rb| j|j 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   .   s.    
zassert_metadata_eq.<locals>.gor   )r!   r3   r4   r#   r   r5   r   assert_metadata_eq-   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dfe	e
 e	ee  e	ee  dddZdd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__V   s    
zMetaConverter.__init__c                 C   s   | j dko| jdkS )Nr   )rA   rB   rD   r   r   r   
successfula   s    zMetaConverter.successfulc                 C   sh   g }g }| j D ]"}| s&|| q|| q|D ]}| j|d  q6|| _ 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_storagesd   s    
 z-MetaConverter.check_for_expired_weak_storagesc                 C   s   | j t|d S r$   )r=   getr   )rE   r   r   r   r   get_tensor_memox   s    zMetaConverter.get_tensor_memoc                    sZ   t |  |js|jrd nt| t| fdd}t || || j< d S )Nc                     sT     } | d krd S | j d  r< r<| jd  nd k	rP| j 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k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>       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   |  S r$   r   r   r   r   r   r`      ra   zMetaConverter.<lambda>sourcedynamic_dimsconstraint_dimsc                    s  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}
|  jd7  _| j| jkr|   d| _| d krt  jrNt}|fdd}t|st
d	|  jrd
|_jr:|s:t  | }|  W 5 Q R X njrt}|
\}|fdd}t|st
d	jrd
|_jr:|s:t  | }W 5 Q R X nl r st
ddl m} rtj gj!"  }nd }| j#j!||d|d}dd }tj$tjjj%}tj&tjjj%d zv|j'j'krnnD||j'j'rt(|}n(|j'|j'rt)|}n|*j'}|
\}trt+ & |	  |,|}W 5 Q R X W 5 Q R X j|_nj!jjkrNt & |	  |,|}W 5 Q R X W 5 Q R X nhjsZt
t+  |*|j-}W 5 Q R X j|_t & |	  |,|}W 5 Q R X W 5 Q R X tjj./|tjj.0 W 5 tj&tjjj%| X nLt}|
\}|fdd}t|s*t
d	jrbj|_|sbt  |jtj1d}W 5 Q R X tjj23rt4W  5 Q R  S 5 }t6|}|| j7kr|8 kr|9 |kr|5 | j7|< np| j:||d}t }ddl;m<}m=} t>||r||j?}|* t+  |@|| W 5 Q R X W 5 Q R X tAd k	rvddl m} | j#tA||d d|_BtjC|D  tjE|F  W 5 Q R X tGtH|d
d | I| | S )Nr   )ConstantSourceZ__meta_utils_unknown_tensor   c                    sH   d k	rj |  dS d ks&t d ks2t|  |  |  fS )N)rh   ri   )Z,create_symbolic_sizes_strides_storage_offsetr   r]   r/   r0   r   )ri   rh   	shape_envrg   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[   Z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                      s   t j jddS rX   r[   Zempty_stridedr%   r   sizesstridesr   r   r   r`     s
      )
AttrSourcer2   )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_r;  s
    
z,MetaConverter.meta_tensor.<locals>.is_c_of_rFc                      s   t j jddS rX   ro   r   rp   r   r   r`     s
      )Zmemory_format)rc   )
FakeTensorin_kernel_invocation_managerr   rf   r"   )JZtorch._dynamo.sourcerj   rL   r=   r[   _CZ_dispatch_tls_local_exclude_sethasZDispatchKeyPythonr   rC   
contextlibnullcontextZsuppress_guardsr@   r?   rN   rP   Zinference_moder)   r(   r   Z_coalesced_r.   r'   Zenable_gradclonerT   r1   rs   r   ZSTATICr2   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_gradZ
as_stridedr&   Z	_autogradZ_set_creation_metaZ_get_creation_metaZpreserve_format
_functorchZis_functorch_wrapped_tensorNotImplementedrb   r   r:   r/   r0   re   torch._subclasses.fake_tensorrv   rw   
isinstanceZ	fake_modeset_r   r   Z	_set_conjr*   Z_set_negr+   r7   r!   rW   )rE   r   rl   rc   rg   rh   ri   rj   rC   Zmaybe_suppressrm   r   rZ_storage_offsetrs   Zbase_dynamic_dimsbaseru   Zold_excluder0   midr_   rd   Zr_sZmaybe_fake_mgrrv   rw   r   )ri   rh   rl   rq   rg   rr   r   r   r      s$   	






 
"
$
"  



	
$zMetaConverter.meta_tensorc                 C   s   |  S r$   r   r   r   r   r   r`     ra   F)rc   ignore_subclassrg   rh   ri   c             	      sn  ddl m} t|tjksFt|tjjksF|r:t|tjsFt||r|jjdkrt	|j
|jtjtjtjfk|j|j| o|jd k	o|jjt||jjdkgrt|r|jjdkr| rtdt }	|	d ks|	 tjkstd|	d krPt| t|}
tjj  j |
 ||d}W 5 Q R X tj!|dd	S tj"# }t$||}
tj%j&' }| j |
 ||d}W 5 Q R X t(|t) S  j*d
7  _*t+S  j,d
7  _,t-. }|rtj"/ }| j | ||d}W 5 Q R X t|tjjkrd|_0|S nLtj12|rft3|rRt4| fdd}|S  j*d
7  _*t+S n|S d S )Nr   )rv   Z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.)rl   rc   rg   rh   ri   T)Zmirror_autograd_metark   c                    s   j |  dS )N)rl   rc   rg   )r   r   rc   rE   rl   rg   r   r   r`   b  s
      z(MetaConverter.__call__.<locals>.<lambda>)5r   rv   typer[   ZTensornn	Parameterr   rZ   anyZis_sparse_csrrn   Z
sparse_cscZ
sparse_bsrZ
sparse_bscZis_quantizedZ	is_nestedr1   r2   r(   Z_is_functional_tensorr   r   keyr	   ZFunctionalizer   Z_syncZ_from_functional_tensor	_dispatchpythonZsuspend_functionalizationr   Z_to_functional_tensorrx   Z$_functionalization_reapply_views_tlsr   r   ZpyfunctorchZ!temporarily_pop_interpreter_stackr   r   rB   r   rA   r{   r|   ZDisableTorchFunctionSubclassZ	_is_paramZ	overridesZis_tensor_liker   r   )rE   r   rl   rc   r   rg   rh   ri   rv   stZunwrap_tZfake_tZreapply_viewsZ
pop_st_ctxctxr   outr   r   r   __call__  s    




 




zMetaConverter.__call__)N)__name__
__module____qualname__rF   rG   rN   rP   rW   re   r   r
   DimListr   r   r   r   r   r   r   r   r8   U   s4   $

  B r8   )#r{   r   r;   typingr   r   r   r[   Ztorch._C._functorchr   r   r   r   r	   Ztorch._guardsr
   Z%torch.fx.experimental.symbolic_shapesr   r   Z torch.multiprocessing.reductionsr   Ztorch.utils._python_dispatchr   r   Ztorch.utils.weakr   r   r   r   r!   r7   r8   Ztorch._prims_commonZ_prims_commonrt   r   r   r   r   <module>   s*   (    #