U
    Kc                     @   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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storage_cdata.0inpr
   r
   @/tmp/pip-unpacked-wheel-gikjz4vx/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   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rzNt >}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 k	rt|	\}
}t|\}}t|
t|
kstdt|
 dt|
 d| | jrt|	||f}t|||f}||ksftd| d| d| t|	||f}t|||f}||kstd| d| d| t|	}t|}||kstd| d| d| tt|	d t|d D ]\}}t|tj}|t|tjks(td| |r|j|jksJtd| tj |r|! }|! }||kstd| d| d| ztj"j#j$||| j%d W n8 t&k
r } zt'd| d| W 5 d }~X Y nX q|	S )	Nz	Mismatch z != z on zMismatch on z: r   z'Mismatched number of tensor outputs on )r*   )(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(   zip
isinstanceZrequires_gradr   r   Zstorage_offsetZ_primsutilsZcompare_tensor_metar*   	ExceptionRuntimeError)r0   functypesargskwargsZfake_rZ	fake_modeZ	fake_argsZfake_kwargs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_otherZr_outZfake_outZr_is_tenZr_offsetZf_offseter
   r
   r   __torch_dispatch__>   s    	
  
"


" 

  
*z#CrossRefFakeMode.__torch_dispatch__)N)r
   N)	__name__
__module____qualname__r   r   r   boolr1   rH   r
   r
   r
   r   r)   0   s    r)   )r8   typingr   r   r   Ztorch.utils._pytreer>   Z_pytreer7   Z
torch._opsr   Ztorch._subclasses.fake_tensorr   r   r   Ztorch.utils._python_dispatchr   r	   opsr2   r!   r%   r(   r)   r
   r
   r
   r   <module>   s   