o
    "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
   Z/home/ubuntu/SoloSpeech/.venv/lib/python3.10/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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                    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   	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    storagesr   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)      DevicesT)      F)aten#_scaled_dot_product_flash_attentiondefault_flash_attention_forwardrepr'_scaled_dot_product_efficient_attention_efficient_attention_forward)funcidxer
   r
   r   is_sdpa_error2   s   r<   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>Q   s    z+CrossRefFakeMode.__init__.<locals>.<lambda>)r@   r>   r?   )selfr@   r>   r?   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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)	shape_envT)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)r>   allow_rhs_unbacked   z mismatched tensor metadata: z' mismatched tensor metadata for output[z]: )-r2   
lift_freshr4   lift_fresh_copyset_source_Storage_storage_offsetr@   r   Tagdynamic_output_shapetagsinplace_viewdata_dependent_output%torch.fx.experimental.symbolic_shapesrE   r   pytreetree_map_onlyr   	functoolspartialfrom_tensorwarningscatch_warningsr   tree_leaveslenr?   r"   r'   r,   	enumeratezip
isinstancerequires_gradr   r   storage_offset_primsutilscompare_tensor_metar>   	Exceptionr<   RuntimeError)rC   r9   typesargskwargsfake_rrE   	fake_mode	fake_argsfake_kwargscontextrr_flatf_flat
r_aliasing
f_aliasingr_identity_eqf_identity_eqr_output_alias_each_otherf_output_alias_each_otherr:   r_outfake_outr_is_tenr_offsetf_offsetr;   error_messager
   r
   r   __torch_dispatch__V   s   








z#CrossRefFakeMode.__torch_dispatch__r   )r
   N)	__name__
__module____qualname__r   r   r   boolrD   r~   r
   r
   r
   r   r=   H   s    
r=   )rV   rY   typingr   r   r   torch.utils._pytreerc   _pytreerT   
torch._opsr   torch._subclasses.fake_tensorr   r   r   torch.utils._python_dispatchr   _opsopsr2   r"   r'   r,   r<   r=   r
   r
   r
   r   <module>   s   
