o
    H&i                     @   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                    4   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.0inpr
   r
   GC:\wamp64\www\opt\env\Lib\site-packages\torch/_subclasses/fake_utils.py	<setcomp>   s    
z'outputs_alias_inputs.<locals>.<setcomp>c                 3   s*    | ]}t j|o| j v V  qd S Nr   r   outZinput_storagesr
   r   	<genexpr>   s
    
z'outputs_alias_inputs.<locals>.<genexpr>r   r   TensoranyoutputsZinputsr
   r   r   outputs_alias_inputs   s   

r    c                    r	   )Nc                 S   s   h | ]}t |qS r
   idr   r
   r
   r   r       s    z%outputs_are_inputs.<locals>.<setcomp>c                 3   s    | ]	}t | v 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 ]}tj|sq	| j}||v 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u s| t jju r|dv rdt|v rdS | t jju s$| t jju r0|dv r0dt|v r0d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_error0   s   r2   c                   @   sB   e Zd Z	d
ddddeeegef df fddZddd	ZdS )CrossRefFakeModeNT)check_stridescheck_aliasingignore_op_fnc                C   s&   |d ur|ndd | _ || _|| _d S )Nc                 S   s   dS )NFr
   )fnr
   r
   r   <lambda>O   s    z+CrossRefFakeMode.__init__.<locals>.<lambda>)r6   r4   r5   )selfr6   r4   r5   r
   r
   r   __init__G   s   
zCrossRefFakeMode.__init__r
   c                 C   s`  |pi }d }|t jjt jjt jjfvr| |stjj	|j
vrtjj|j
vrtjj|j
vrddlm} zEt| d5}ttjtj|jdd||f\}}	t  ||i |	}W d    n1 scw   Y  W d    n1 srw   Y  W n	 ty   Y nw d| d}
||i |}|d urt|}t|}t|t|ksJ |
 dt| d	t| | jrt|||f}t|||	f}||ksJ |
 d
| d	| t|||f}t|||	f}||ksJ |
 d| d	| t|}t|}||ksJ |
 d| d	| tt t|t|D ]\}\}}t!|tj}|t!|tjks8J |
 d|r|j"|j"ksIJ |
 dtj#$|rd|% }|% }||ksdJ |
 dztj&j'j(||| j)dd W q t*y } z+t+|||rW Y d }~qt|dkr|
 d| n	|
 d| d| }t,||d }~ww 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)r4   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_offsetr6   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lenr5   r    r$   r'   	enumeratezip
isinstanceZrequires_gradr   r   Zstorage_offsetZ_primsutilsZcompare_tensor_metar4   	Exceptionr2   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_otherr0   Zr_outZfake_outZr_is_tenZr_offsetZf_offsetr1   error_messager
   r
   r   __torch_dispatch__T   s   








z#CrossRefFakeMode.__torch_dispatch__r   )r
   N)	__name__
__module____qualname__r   r   r   boolr:   rR   r
   r
   r
   r   r3   F   s    
r3   )rA   rC   typingr   r   r   Ztorch.utils._pytreerI   Z_pytreer@   Z
torch._opsr   Ztorch._subclasses.fake_tensorr   r   r   Ztorch.utils._python_dispatchr   Z_opsopsr,   r    r$   r'   r2   r3   r
   r
   r
   r   <module>   s    
