U
    ©Ê¹j  ã                   @   s    d dl Z d dlmZmZ d dlZd dlm  mZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZ ejjjZdd„ Zd	d
„ Zdd„ ZG dd„ deƒZdS )é    N)ÚCallableÚUnion)Ú
OpOverload)ÚFakeTensorModeÚtree_flatten_onlyÚUnsupportedFakeTensorException)ÚTorchDispatchMode)Útree_flattenc                    s4   dd„ t tj|ƒD ƒ‰ t‡ fdd„t tj| ƒD ƒƒS )Nc                 S   s"   h | ]}t j |¡r| ¡ j’qS © ©ÚtorchÚ_CÚ_has_storageÚ_typed_storageÚ_cdata©Ú.0Zinpr
   r
   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_subclasses/fake_utils.pyÚ	<setcomp>   s   þz'outputs_alias_inputs.<locals>.<setcomp>c                 3   s(   | ] }t j |¡o| ¡ jˆ kV  qd S ©Nr   ©r   Úout©Zinput_storagesr
   r   Ú	<genexpr>   s   ÿz'outputs_alias_inputs.<locals>.<genexpr>©r   r   ÚTensorÚany©ÚoutputsÚinputsr
   r   r   Úoutputs_alias_inputs   s    
þ
þr    c                    s4   dd„ t tj|ƒD ƒ‰ t‡ fdd„t tj| ƒD ƒƒS )Nc                 S   s   h | ]}t |ƒ’qS r
   ©Úidr   r
   r
   r   r       s     z%outputs_are_inputs.<locals>.<setcomp>c                 3   s   | ]}t |ƒˆ kV  qd S r   r!   r   ©Z	input_idsr
   r   r   !   s     z%outputs_are_inputs.<locals>.<genexpr>r   r   r
   r#   r   Úoutputs_are_inputs   s    r$   c                 C   sL   t ƒ }ttj| ƒD ]4}tj |¡s$q| ¡ j}||kr< dS | |¡ qdS )NTF)	Úsetr   r   r   r   r   r   r   Úadd)r   Zstoragesr   Zstorr
   r
   r   Úoutput_alias_each_other$   s    
r'   c                   @   s@   e Zd Zd
dddœeeegef df dœdd„Zddd	„ZdS )ÚCrossRefFakeModeNT)Úcheck_stridesÚcheck_aliasing)Úignore_op_fnc                C   s&   |d k	r|ndd„ | _ || _|| _d S )Nc                 S   s   dS )NFr
   )Úfnr
   r
   r   Ú<lambda>9   ó    z+CrossRefFakeMode.__init__.<locals>.<lambda>)r+   r)   r*   )Úselfr+   r)   r*   r
   r
   r   Ú__init__1   s    ÿzCrossRefFakeMode.__init__r
   c                 C   sp  |pi }d }|t jjt jjt jjfkr¾|  |¡s¾tjj	|j
kr¾tjj|j
kr¾tjj|j
kr¾zNtƒ �>}t tj|j||f¡\}}t ¡ � |||Ž}W 5 Q R X W 5 Q R X W n tk
r¼   Y nX d|› d�}	|||Ž}
|d k	�rlt|
ƒ\}}t|ƒ\}}t|ƒt|ƒk�s(t|	› dt|ƒ› dt|ƒ› �ƒ‚| j�rÞt|
||fƒ}t|||fƒ}||k�snt|	› d|› d|› �ƒ‚t|
||fƒ}t|||fƒ}||k�s¬t|	› d|› d|› �ƒ‚t|
ƒ}t|ƒ}||k�sÞt|	› d|› d|› �ƒ‚ttt|
ƒd t|ƒd ƒƒD �]l\}\}}t|tjƒ}|t|tjƒk�s6t|	› d	�ƒ‚|�rü|j|jk�sXt|	› d
�ƒ‚tj  !|¡�rŽ| "¡ }| "¡ }||k�sŽt|	› d�ƒ‚ztj#j$j%||| j&d� W n¾ t'k
�rf } zž|t j(jk�rì|dk�rìdt)|ƒk�rìW Y ¢r�qü|t j*jk�r|dk�rdt)|ƒk�rW Y ¢B�qüt|ƒdk�r8|	› d|› �n|	› d|› d|› �}t+|ƒ|‚W 5 d }~X Y nX �qü|
S )NzWhen comparing the output of z* on FakeTensor and concrete Tensors, foundz mismatch in number of returns z != z( mismatch in outputs_alias_inputs check z& mismatch in outputs_are_inputs check z, mismatch in outputs_alias_each_other check r   z$ mismatched number of tensor outputsz· mismatched requires_grad-ness of outputs. This usually means that you have added autograd support for your operator at a dispatch key other than Autograd, which will lead to problemsz mismatched storage offset)r)   )é   é   ZDevices)é   é   é   z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: ),ÚatenZ
lift_freshÚdefaultZlift_fresh_copyÚset_Zsource_Storage_storage_offsetr+   r   ÚTagZdynamic_output_shapeÚtagsZinplace_viewZdata_dependent_outputr   ÚpytreeZtree_map_onlyr   Zfrom_tensorÚwarningsÚcatch_warningsr   r	   ÚlenÚAssertionErrorr*   r    r$   r'   Ú	enumerateÚzipÚ
isinstanceZrequires_gradr   r   Zstorage_offsetZ_primsÚutilsZcompare_tensor_metar)   Ú	ExceptionZ#_scaled_dot_product_flash_attentionÚreprZ'_scaled_dot_product_efficient_attentionÚRuntimeError)r/   ÚfuncÚtypesÚargsÚkwargsZfake_rZ	fake_modeZ	fake_argsZfake_kwargsÚcontextÚrZr_flatÚ_Zf_flatZ
r_aliasingZ
f_aliasingZr_identity_eqZf_identity_eqZr_output_alias_each_otherZf_output_alias_each_otherÚidxZr_outZfake_outZr_is_tenZr_offsetZf_offsetÚeÚerror_messager
   r
   r   Ú__torch_dispatch__>   sÒ    ýÿÿùø	÷
ö  ÿ
"
ÿ

ÿ
þÿþÿþÿÿ ÿ
þÿÿþ  ÿ

ÿþ
ý

ÿþ
ý

ÿý z#CrossRefFakeMode.__torch_dispatch__)N)r
   N)	Ú__name__Ú
__module__Ú__qualname__r   r   r   Úboolr0   rQ   r
   r
   r
   r   r(   0   s    þûþr(   )r<   Útypingr   r   r   Ztorch.utils._pytreerC   Z_pytreer;   Z
torch._opsr   Ztorch._subclasses.fake_tensorr   r   r   Ztorch.utils._python_dispatchr   r	   Z_opsZopsr6   r    r$   r'   r(   r
   r
   r
   r   Ú<module>   s   
