U
    ©Ê¹jžq  ã                   @   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/bwave/python/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_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�rÀt ˆ ¡ ¡��Ú ˆj�rNtˆƒ}|‡fdd„ƒ}t|ƒsöt
d	ƒ‚| ˆ ¡ ¡ ˆj�rd
|_ˆj�r:|�s:t ¡ � | ¡ }| ˆ ¡ ¡ W 5 Q R X �nìˆj�rÎtˆƒ}|
ˆƒ\‰‰}|‡‡‡fdd„ƒ}t|ƒ�s’t
d	ƒ‚ˆj�r d
|_ˆj�r:|�s:t ¡ � | ¡ }W 5 Q R X �nlˆ ¡ �rîˆ ¡ �sæt
‚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'ƒ�rŠt (|¡}n(|ˆj'|j'ƒ�r¦t )|¡}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j2 3ˆ¡�r‚t4W  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�r´t	|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ƒ�r´t |¡�r¢|jjdk�r¢| ¡ rÒtdƒ‚tƒ }	|	d ksö|	 ¡ tjksöt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- .¡ }|�rÚtj" /¡ }|� ˆj |ˆˆ ˆ||d�}W 5 Q R X t|ƒtjjk�rd|_0|S nLtj1 2|¡�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_tensorZ	_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*   (    #