U
    9%e                     @   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                    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
   [/var/www/html/Darija-Ai-API/env/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                   @   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| d}	|||}
|d k	rt|
\}}t|\}}t|t|ks(t|	 dt| dt| | jrt|
||f}t|||f}||ksnt|	 d| d| t|
||f}t|||f}||kst|	 d| d| t|
}t|}||kst|	 d| d| ttt|
d t|d D ]\}\}}t|tj}|t|tjks6t|	 d	|r|j|jksXt|	 d
tj !|r|" }|" }||kst|	 dztj#j$j%||| j&d W n^ t'k
r } z>t|dkr|	 d| n|	 d| d| }t(||W 5 d }~X Y nX 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]: ))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'   	enumeratezip
isinstanceZrequires_gradr   r   Zstorage_offsetZ_primsutilsZcompare_tensor_metar)   	ExceptionRuntimeError)r/   functypesargskwargsZfake_rZ	fake_modeZ	fake_argsZfake_kwargscontext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_otheridxZr_outZfake_outZr_is_tenZr_offsetZf_offseteerror_messager
   r
   r   __torch_dispatch__>   s    	
  
"



 
  

 z#CrossRefFakeMode.__torch_dispatch__)N)r
   N)	__name__
__module____qualname__r   r   r   boolr0   rL   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	   Z_opsZopsr2   r    r$   r'   r(   r
   r
   r
   r   <module>   s   
