o
    h                     @   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                    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   R/var/www/html/ai/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                   @   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>9   s    z+CrossRefFakeMode.__init__.<locals>.<lambda>)r1   r/   r0   )selfr1   r/   r0   r   r   r   __init__1   s   
zCrossRefFakeMode.__init__r   c                 C   s.  |pi }d }|t jjt jjt jjfvrt| |sttjj	|j
vrttjj|j
vrttjj|j
vrtz=t 0}ttj|j||f\}}t  ||i |}W d    n1 sUw   Y  W d    n1 sdw   Y  W n	 tys   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|
d t|d D ]\}\}}t|tj}|t|tjks.J |	 d	|r|j|jks?J |	 d
tj |rZ|! }|! }||ksZJ |	 dztj"j#j$||| j%d W q t&y } zt|dkr|	 d| n	|	 d| d| }t'||d }~ww 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 mismatched tensor metadata: z' mismatched tensor metadata for output[z]: )(aten
lift_freshdefaultlift_fresh_copyset_source_Storage_storage_offsetr1   r   Tagdynamic_output_shapetagsinplace_viewdata_dependent_outputr   pytreetree_map_onlyr   from_tensorwarningscatch_warningsr   r	   lenr0   r#   r(   r-   	enumeratezip
isinstancerequires_gradr   r   storage_offset_primsutilscompare_tensor_metar/   	ExceptionRuntimeError)r4   functypesargskwargsfake_r	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_otheridxr_outfake_outr_is_tenr_offsetf_offseteerror_messager   r   r   __torch_dispatch__>   s   






z#CrossRefFakeMode.__torch_dispatch__r   )r   N)	__name__
__module____qualname__r   r   r   boolr5   rm   r   r   r   r   r.   0   s    
r.   )rE   typingr   r   r   torch.utils._pytreerN   _pytreerB   
torch._opsr   torch._subclasses.fake_tensorr   r   r   torch.utils._python_dispatchr   r	   _opsopsr7   r#   r(   r-   r.   r   r   r   r   <module>   s    
