U
    yh!                     @   s   d dl Z 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 ejjjZdd 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)TorchDispatchModec                    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	   N/var/www/html/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                 C   sd   | t jjks| t jjkr0|dkr0dt|kr0dS | t jjksH| t jjkr`|dkr`dt|kr`dS dS )N)      ZDevicesT)      F)atenZ#_scaled_dot_product_flash_attentiondefaultZ_flash_attention_forwardreprZ'_scaled_dot_product_efficient_attentionZ_efficient_attention_forward)funcidxer	   r	   r   is_sdpa_error2   s&    





r1   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>Q       z+CrossRefFakeMode.__init__.<locals>.<lambda>)r5   r3   r4   )selfr5   r3   r4   r	   r	   r   __init__I   s    zCrossRefFakeMode.__init__r	   c                 C   s>  |pi }d }|t jjt jjt jjfkr| |stjj	|j
krtjj|j
krtjj|j
krddlm} z^t| dH}ttjtj|jdd||f\}}	t  |||	}W 5 Q R X W 5 Q R X W n tk
r   Y nX d| d}
|||}|d k	r:t|}t|}t|t|ks@t|
 dt| d	t| | jrt|||f}t|||	f}||kst|
 d
| d	| t|||f}t|||	f}||kst|
 d| d	| t|}t|}||kst|
 d| d	| t t!t|t|D ]&\}\}}t"|tj}|t"|tjksJt|
 d|r|j#|j#kslt|
 dtj$%|r|& }|& }||kst|
 dztj'j(j)||| j*dd W nv t+k
r4 } zVt,|||rW Y Bqt|dkr|
 d| n|
 d| d| }t-||W 5 d }~X Y nX q|S )Nr   )ShapeEnv)Z	shape_envT)Zstatic_shapesz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 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)r3   Zallow_rhs_unbacked   z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: ).r+   Z
lift_freshr,   Zlift_fresh_copyset_Zsource_Storage_storage_offsetr5   r   TagZdynamic_output_shapetagsZinplace_viewZdata_dependent_outputZ%torch.fx.experimental.symbolic_shapesr;   r   pytreeZtree_map_onlyr   	functoolspartialZfrom_tensorwarningscatch_warningsr   Ztree_leaveslenAssertionErrorr4   r   r#   r&   	enumeratezip
isinstanceZrequires_gradr   r   Zstorage_offsetZ_primsutilsZcompare_tensor_metar3   	Exceptionr1   RuntimeError)r9   r.   typesargskwargsZfake_rr;   Z	fake_modeZ	fake_argsZfake_kwargscontextrZr_flatZf_flatZ
r_aliasingZ
f_aliasingZr_identity_eqZf_identity_eqZr_output_alias_each_otherZf_output_alias_each_otherr/   Zr_outZfake_outZr_is_tenZr_offsetZf_offsetr0   error_messager	   r	   r   __torch_dispatch__V   s    	

"





 



 z#CrossRefFakeMode.__torch_dispatch__)N)r	   N)	__name__
__module____qualname__r   r   r   boolr:   rS   r	   r	   r	   r   r2   H   s    r2   )rA   rC   typingr   r   r   Ztorch.utils._pytreerJ   Z_pytreer@   Z
torch._opsr   Ztorch._subclasses.fake_tensorr   r   r   Ztorch.utils._python_dispatchr   Z_opsZopsr+   r   r#   r&   r1   r2   r	   r	   r	   r   <module>   s   
