U
    Kc                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZ d dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dl m!Z! d dl"m#Z#m$Z$m%Z% ej&j'Z(edZ)e
Z*ej+j,Z,dZ-eG dd de.Z/eG dd de.Z0eG dd de.Z1e,j2j3e,j4j3e,j4j5e,j6j3e,j7j3e,j8j9e,j8j:e,j;j3e,j;j5e,j<j3e,j<j5fZ=e,j>fZ?dd Z@e,jAj3e,jAj5e,jBj3e,jBj5e,jCj3e,jCj5e,jDj3e,jDj5e,jEj3e,jEj5e,jFj3e,jFj5e,jFjGe,jFjHe,jIj3e,jIj5e,jJj3e,jJj5e,jKj3e,jKj5e,jLj3e,jLj5e,jMj3e,jMj5e,jNj3e,jNj5fZOePdedddZQePddd ZRee) e#dddZSG dd  d eTZUg aVeeegeWf ef d!d"d#ZXeXd$d% d&d' ZYeXd(d% d)d* ZZeXe,j[j3d+d, Z[eXe,j\j3d-d. Z\eXe,j]j3d/d0 Z^eXd1d% d2d3 Z_eXd4d% d5d6 Z`d7d8 Zad9d: ZbeXe,jcjdd;d< ZeeXe,jfj3d=d> ZfeXe,jgj3d?d@ ZgeXdAd% dBdC Zhe jidDdE ZjG dFdG dGejdZkG dHdI dIe!ZldJdK ZmG dLdM dMeZndS )N    N)	dataclass)partial)AnyCallableDictListOptionalTypeTypeVarUnion)
OpOverload)MetaConverterWeakTensorRefKey)normalize_function)StorageWeakRef)TorchFunctionMode)no_dispatch)TorchDispatchMode)PyTreetree_flattentree_mapT   c                   @   s   e Zd ZU eed< dS )UnsupportedFakeTensorExceptionreasonN)__name__
__module____qualname__str__annotations__ r    r    A/tmp/pip-unpacked-wheel-gikjz4vx/torch/_subclasses/fake_tensor.pyr      s   
r   c                   @   s   e Zd ZU eed< dS )DynamicOutputShapeExceptionfuncNr   r   r   r   r   r    r    r    r!   r"   $   s   
r"   c                   @   s   e Zd ZU eed< dS )DataDependentOutputExceptionr#   Nr$   r    r    r    r!   r%   )   s   
r%   c                 C   s,   t jj }| |p*tdd |  D S )Nc                 s   s   | ]}t |V  qd S N)contains_tensor_types.0er    r    r!   	<genexpr>B   s    z(contains_tensor_types.<locals>.<genexpr>)torch_C
TensorTypegetZisSubtypeOfanyZcontainedTypes)typeZtensor_typer    r    r!   r'   @   s    r'   r#   c                 C   sR   t | tst| j}tdd |jD r,dS t|jdkoP|jd jt	j
j kS )Nc                 s   s   | ]}t |jV  qd S r&   )r'   r1   )r)   argr    r    r!   r+   i   s     z)_is_tensor_constructor.<locals>.<genexpr>Fr   r   )
isinstancer   AssertionError_schemar0   	argumentslenZreturnsr1   r,   r-   r.   r/   )r#   Zschemar    r    r!   _is_tensor_constructore   s    $r9   c                 C   s   t j| jS r&   )r,   r-   Z_SchemaInfor6   r2   r    r    r!   get_schema_infoq   s    r:   )typytreec                    s   t |\}} fdd|D S )Nc                    s   g | ]}t | r|qS r    )r4   )r)   elemr;   r    r!   
<listcomp>x   s     
 z%tree_flatten_only.<locals>.<listcomp>)r   )r;   r<   Z	flat_vals_r    r>   r!   tree_flatten_onlyv   s    rA   c                   @   s   e Zd ZU ejed< eed< eee	e
 f ed< dd Zdd Zdd	 Zd
d Zdd ZdddZdd ZddddddZdS )FakeTensorConvertertensor_memometa_converterconstant_storage_mappingc                 C   s   t  | _t | _i | _d S r&   )weakrefWeakValueDictionaryrC   r   rD   rE   selfr    r    r!   __init__   s    
zFakeTensorConverter.__init__c                 C   sT   t |tr|jd k	stt|j }|| jkr:g | j|< | j| t	| d S r&   )
r4   
FakeTensorconstantr5   r   storagerE   appendrF   ref)rI   Zfake_tensorweak_str    r    r!   add_constant_storage_mapping   s
    

z0FakeTensorConverter.add_constant_storage_mappingc                 C   s`   t |trtt| }|| jkr(d S | j| D ] }| }|d k	r2|  d |_q2| j|= d S r&   )r4   rK   r5   r   rM   rE   _fix_weakrefrL   )rI   tensorrP   Zweak_tensor_reftenr    r    r!   invalidate_constant_aliases   s    
z/FakeTensorConverter.invalidate_constant_aliasesc                 C   s,   t || jkr(| jt | }|  |S d S r&   )r   rC   rR   )rI   toutr    r    r!   	_get_memo   s
    zFakeTensorConverter._get_memoc                    s:   t |t|   fdd}t|| || j< d S )Nc                     s$     } | d krd S | j d  d S r&   )rC   pop)Zself_refZself_weak_refthr    r!   del_ten   s    z4FakeTensorConverter.set_tensor_memo.<locals>.del_ten)r   rF   rO   finalizerC   )rI   rV   vr\   r    rZ   r!   set_tensor_memo   s
    
z#FakeTensorConverter.set_tensor_memoFNc           
   	   C   s  |  |}|d k	r|S |j}|jr*tdt Z | j||d}|jjdkrTtdt||||rd|nd d}||j	 |r| 
| W 5 Q R X t|tjjkr|rttjj||j	d}t  tdd |jd k	}	W 5 Q R X |	r| ||j|_| || |S )	Nzquantized nyi in meta tensors	shape_envmetazmeta converter nyirL   )requires_gradignorezThe .grad attribute of a Tensor)rX   deviceZis_quantizedr   r   rD   r1   rK   Zrequires_grad_rd   rQ   r,   nn	Parameterr5   warningscatch_warningsfilterwarningsZgradfrom_real_tensorr_   )
rI   	fake_moderV   make_constantra   
maybe_memoZexisting_deviceZmeta_trW   Zgrad_not_noner    r    r!   rl      s:    


z$FakeTensorConverter.from_real_tensorc                 C   s2   |  |}|d k	r|S t|||}| || |S r&   )rX   rK   r_   )rI   rm   rV   rf   ro   rW   r    r    r!   from_meta_and_device   s    
z(FakeTensorConverter.from_meta_and_device)rn   ra   c                C   sH   |d kr| j ||||dS |dks&t|jjdks6t| |||S d S )Nr`   Frb   )rl   r5   rf   r1   rp   )rI   rm   rV   rf   rn   ra   r    r    r!   __call__   s       zFakeTensorConverter.__call__)FN)N)r   r   r   rF   rG   r   r   r   r   r   TensorWeakRefrJ   rQ   rU   rX   r_   rl   rp   rq   r    r    r    r!   rB      s   



   rB   run_impl_checkc                    s    fdd}|S )Nc                    s4   t  tr"t fdd| f nt | f | S )Nc                    s   |  kS r&   r    r2   rs   r    r!   <lambda>	      z:register_op_impl.<locals>.impl_decorator.<locals>.<lambda>)r4   r   op_implementationsrN   )op_implrs   r    r!   impl_decorator  s    
z(register_op_impl.<locals>.impl_decoratorr    )rt   ry   r    rs   r!   register_op_impl  s    	rz   c                 C   s   t | p| tkS r&   )r9   _like_tensor_constructorsr2   r    r    r!   ru     rv   ru   c           	      O   s   |t kstt|||dd\}}|tkr@|d j}|df}ntd}d}|dd }|d k	rf|n|}td|d< |||}t| ||S )NTargskwargsnormalize_to_only_use_kwargsinputcpur    rf   rb   )_non_kwarg_device_constructorsr5   r   r{   rf   rY   r,   rK   )	rm   r#   r}   r~   r@   
new_kwargsZdefault_device
out_devicerr    r    r!   constructors  s"       



r   c                 C   s   | t jjt jjfkS r&   )atentoprim_Devicerf   r2   r    r    r!   ru   )  rv   c           	      O   sT   t |||dd\}}|d }|r$|n|d j}td|d< |||}| | ||S )NT)r   rf   r   rb   )r   rf   r,   fake_tensor_converter)	rm   r#   r}   r~   r@   r   input_devicer   r   r    r    r!   non_kwarg_to)  s       

r   c                 O   s
   |||S r&   r    rm   r#   r}   r~   r    r    r!   
resize_as_7  s    r   c                 O   s   t | |f||S r&   )r   r   r    r    r!   (_sparse_coo_tensor_with_dims_and_tensors<  s    r   c           	      O   s   t |||dd\}}|dd }|r(|n|d j}t T t| @ |dd}t| tj|f||W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S )NTr|   rf   r   rb   )	r   rY   rf   r   in_kernel_invocation_managerr   rK   r   _to_copy)	rm   r#   r}   r~   r@   r   r   r   r   r    r    r!   to_copyD  s       
r   c                 C   s   t jj| jko| tjjkS r&   )r,   TagZdynamic_output_shapetagsr   indexTensorr2   r    r    r!   ru   S  s   c                 O   s   t |d S r&   )r"   r   r    r    r!   	dyn_shapeR  s    r   c                 C   s   t jj| jkS r&   )r,   r   Zdata_dependent_outputr   r2   r    r    r!   ru   [  rv   c                 O   s   | j rt|tS r&   )throw_on_data_dependent_opsr%   NotImplementedr   r    r    r!   data_depZ  s    r   c                 C   s0   |D ]&}|d k	r|j tjtjfkrt| qd S r&   )Zdtyper,   boolZuint8r"   )r#   rI   indicesr   r    r    r!   check_no_bool_index_tensorse  s    r   c              	   C   sH   t |||dd\}}|d j}t|  |||}W 5 Q R X t| ||S NTr|   r   )r   rf   r   rK   )rm   r#   r}   r~   r@   r   r   rW   r    r    r!   )run_and_return_new_tensor_of_input_devicek  s       


r   c                 O   s   t |f|| t| |||S r&   )r   r   r   r    r    r!   index_tensorz  s    r   c                 O   s   t | |||S r&   )r   r   r    r    r!   	index_put  s    r   c              	   O   s:   t |  |||}W 5 Q R X t|||dd\}}|d S r   )r   r   )rm   r#   r}   r~   rW   r@   r   r    r    r!   
index_put_  s    
   
r   c                 C   s   | t kS r&   )_device_not_kwarg_ops)fnr    r    r!   ru     rv   c                 O   s   |t kstd| d S )NzNYI: )r   r5   r   r    r    r!   nyi  s    r   c                 c   sJ   t j }| j}d| _|s$t j  z
d V  W 5 || _|sDt j  X d S )NT)r,   r-   Z_meta_in_tls_dispatch_includein_kernel_invocationZ!_add_meta_to_tls_dispatch_includeZ&_remove_meta_from_tls_dispatch_include)rm   Zmeta_in_tlsprevr    r    r!   r     s    


r   c                       s   e Zd ZU ejed< ded< eej ed< edddZ	de
ejef eej dd	d
Zedd Z fddZedddZedd ZejjZ  ZS )rK   fake_deviceFakeTensorModerm   rL   Nc                 C   s   t jj| ||jd|dS )NT)Zdispatch_deviceZdevice_for_backend_keys)r,   r   Z_make_subclassrd   )clsrm   r=   rf   rL   r    r    r!   __new__  s    zFakeTensor.__new__)rf   rL   c                 C   s   |j jdkst|j jt|tj r(|nt |}|jsF|jdksFt|jdkrp|jd krpt dtj  }|| _	|| _
|| _d S )Nrb   cudazcuda:)rf   r1   r5   r4   r,   
allow_metar   r   Zcurrent_devicer   rm   rL   )rI   rm   r=   rf   rL   r    r    r!   rJ     s    zFakeTensor.__init__c                 C   s
   | | S r&   )from_tensor)rV   rm   r    r    r!   r     s    zFakeTensor.from_tensorc              	      s4   t | j t  }W 5 Q R X d| d| j dS )NzFakeTensor(, ))r   rm   super__repr__r   )rI   Z	self_repr	__class__r    r!   r     s    zFakeTensor.__repr__r    c              
   C   s   |t jjjjkrNt|dkr*t|d ts.t|d j	j
rDt dS |d jS tdd |D rdtS d }tt|d t|d D ]0}t|tr|d kr|j	}q||j	kstdq|d k	st| |||W  5 Q R  S Q R X d S )Nr   r   rb   c                 s   s$   | ]}t |t o|tjk	V  qd S r&   )
issubclassrK   r,   r   )r)   rV   r    r    r!   r+      s     z0FakeTensor.__torch_dispatch__.<locals>.<genexpr>zMixing modes NYI)r,   opsprimrf   defaultr8   r4   rK   r5   rm   r   r   r0   r   	itertoolschainr   )r   r#   typesr}   r~   rm   r3   r    r    r!   __torch_dispatch__  s     

 
zFakeTensor.__torch_dispatch__c                    s   d  d dd  fdd}t || t || tj dd dd rl d krltd	  d k	std
  S )Nc                 S   s   | j jdko|  dkS )Nr   r   )rf   r1   ZdimrV   r    r    r!   cpu_zero_dim  s    z4FakeTensor._find_common_device.<locals>.cpu_zero_dimc                    s   t | tsd S  d kr(| j | d S | }| j krFrB|d S |rNd S r`| j |d S td d  d| j d S )Nz,Unhandled FakeTensor Device Propagation for z, found two different devices r   )r4   rK   rf   RuntimeError)rV   Zt_is_cpu_zero_dimcommon_devicer   r#   Zis_cpu_zero_dimr    r!   merge_devices  s(    

z5FakeTensor._find_common_device.<locals>.merge_devicesz::.r   r   z!Could not find common device for )r   r,   r-   Z _should_allow_numbers_as_tensorsnamesplitrf   r5   )r#   r}   r~   r   r    r   r!   _find_common_device  s    "


zFakeTensor._find_common_device)N)N)r    N)r   r   r   r,   rf   r   r   r   staticmethodr   r   r   rJ   r   r   classmethodr   r   r-   Z_disabled_torch_function_impl__torch_function____classcell__r    r    r   r!   rK     s$   

 

>rK   c                   @   sz   e Zd ZddddddZddd	Zd
d Zdd Zdd Zdd Ze	dd Z
e	dd Zdd Zdd ZdddZdS )r   TF)allow_fallback_kernelsr   r   c                C   s$   || _ t | _|| _|| _d| _d S )NF)r   rB   r   r   r   r   )rI   r   r   r   r    r    r!   rJ   [  s
    zFakeTensorMode.__init__r    Nc                    s  |r|ni }|t jjjjkrZt|dkr6t|d ts:t|d j	j
rPt dS |d jS tt||f}tt j||f}tdd |D pt|dk}j |jkr|||}|rt    | ddW  5 Q R  S Q R X t  tt j||f}	|	rtW  5 Q R  S |jkrt|dkrVt|dkrVt|d t jksht| d|  |d W  5 Q R  S |	rtd	| d
| d| dW 5 Q R X tdd |D }
t jj|jkrt jj|jkr|
rt|dkr|st  t tdd ||f\}}|||}t!t jfdd|}
|
rpt t j fdd|W  5 Q R  S tt j|D ]} "| q|W 5 Q R X #|||| |r|j$krddl%m&} ddl'm(} t . |t)j*jkrt+j,-d W 5 Q R  d S W 5 Q R X x ||kr:|| ||}|W  5 Q R  S ||kr^|| ||W  5 Q R  S |j.||}|tk	r|W  5 Q R  S W 5 Q R X d|j/j0krt|dkrt1|drڈ |j2||W  5 Q R  S Q R X |r|j$krt3| dt  t4D ]D\}}||r||f||}|tkr|  W  5 Q R  S qz"t5 |||}W 5 Q R X W nP t6k
r } z0j7s|t8|||| W Y W  5 Q R  S d }~X Y nX 9||||W  5 Q R  S Q R X d S )Nr   r   rb   c                 S   s   g | ]
}|j qS r    )Z_has_symbolic_sizes_strides)r)   ir    r    r!   r?     s     z5FakeTensorMode.__torch_dispatch__.<locals>.<listcomp>Trn    zInvoking operators with non-Fake Tensor inputs in FakeTensorMode is not yet supported. Please convert all Tensors to FakeTensors first. Found in z(*z, **r   c                 s   s   | ]}|j d k	V  qd S r&   rc   r(   r    r    r!   r+     s     z4FakeTensorMode.__torch_dispatch__.<locals>.<genexpr>c                 S   s   | j S r&   rc   r   r    r    r!   ru     rv   z3FakeTensorMode.__torch_dispatch__.<locals>.<lambda>c                    s
     | S r&   )may_turn_constr   rH   r    r!   ru     rv   c                    s    | ddS )NTr   r    r   	converterrI   r    r!   ru     rv   )decomposition_table)
meta_tableztTrying to call aten.size on a tensor with symbolic shapes. It's likely that this is from calling tensor.shape in C++zprims::prim_meta_implz5 - couldn't find symbolic meta function/decomposition):r,   r   r   rf   r   r8   r4   rK   r5   rm   r   r   rA   Z
SymIntNoder0   r   lift_fnsr   r   cloner   check_for_subclassr   r1   check_for_non_fake	Exceptionallr   Znondeterministic_seededr   inplace_viewr<   Ztree_map_onlyZtree_all_onlyrU   invalidate_written_to_constants0functions_with_cpp_meta_impl_that_support_symintZtorch._decompr   Ztorch._meta_registrationsr   r   sizesysstderrwriteZ	decomposer6   r   hasattrr   r   rw   r   NotImplementedErrorr   run_fallback_kernel+wrap_meta_outputs_with_default_device_logic)rI   r#   r   r}   r~   flat_arg_fake_tensorsZflat_symintsZhas_symbolic_sizesrW   flat_arg_tensorsZall_constantZ
const_argsZconst_kwargsrT   r   r   r   rt   rx   Zop_impl_outZnot_implemented_errorr    r   r!   r   u  s    





$


  
 
 







    &   z!FakeTensorMode.__torch_dispatch__c                 C   s   t dd |D S )Nc                 s   s8   | ]0}t |t o.t|tjk	o.t|tjjk	V  qd S r&   )r4   rK   r1   r,   r   rg   rh   r)   xr    r    r!   r+   3  s
   z4FakeTensorMode.check_for_subclass.<locals>.<genexpr>r0   rI   r   r    r    r!   r   2  s    z!FakeTensorMode.check_for_subclassc                 C   s   t dd |D S )Nc                 s   s&   | ]}t |tjot |t V  qd S r&   )r4   r,   r   rK   r   r    r    r!   r+   ;  s   z4FakeTensorMode.check_for_non_fake.<locals>.<genexpr>r   r   r    r    r!   r   :  s    z!FakeTensorMode.check_for_non_fakec                 C   s>   |  |||}|dd r0tt||d d|S tt||S )Nrf   rf   )gen_wrap_fnr/   r   r   )rI   r   r#   r}   r~   wrapr    r    r!   r   @  s    z:FakeTensorMode.wrap_meta_outputs_with_default_device_logicc                    s&   j d d fdd	}|S )Nc                    sD   t | tjr<t | ts<d kr,t | |p8S | S d S r&   )r4   r,   r   rK   r   )r*   rf   r}   r   r   r#   r~   rI   r    r!   r   O  s
    z(FakeTensorMode.gen_wrap_fn.<locals>.wrap)Nr   )rI   r#   r}   r~   r   r    r   r!   r   I  s    	zFakeTensorMode.gen_wrap_fnc                 C   s   t jjt jjt jjt jjgS r&   )r   Zempty_stridedr   Z
as_stridedzerosdetachrH   r    r    r!   r   Z  s
    z?FakeTensorMode.functions_with_cpp_meta_impl_that_support_symintc                 C   s   t jjt jjfS r&   )r   Z
lift_freshr   Zlift_fresh_copyrH   r    r    r!   r   c  s    zFakeTensorMode.lift_fnsc                 C   s    |  tko|j ot|t S r&   )ZnumelCONSTANT_NUMEL_LIMIT	is_sparser4   rK   )rI   rV   r    r    r!   r   g  s
    
zFakeTensorMode.may_turn_constc                 C   s   t dd |D }|rt| rt|}t|||dd\}}| D ]N\}	}
|	dks`||	rd|	nd}	t|
trF||	rF|
jd k	rF| j	
|
j qFd S )Nc                 s   s   | ]}|j d k	V  qd S r&   rc   r(   r    r    r!   r+   q  s     zAFakeTensorMode.invalidate_written_to_constants.<locals>.<genexpr>Tr|   r   rI   )r0   r:   Z
is_mutabler   itemsZhas_argumentr4   rK   rL   r   rU   )rI   r#   r   r}   r~   Zany_constantZschema_infor@   r   kr^   r    r    r!   r   n  s$       
z.FakeTensorMode.invalidate_written_to_constantsc                 C   s   | j | ||dS )Nr`   r   )rI   rS   ra   r    r    r!   r     s    zFakeTensorMode.from_tensor)r    N)N)r   r   r   rJ   r   r   r   r   r   propertyr   r   r   r   r   r    r    r    r!   r   Z  s"   
 >	

r   c              	      s   t jj|jkr|t  i fdd}t||}t||}|||}t }t }t||fd D ]&}	t|	t j	rd|	j
sd||	 j qdt|d D ]4}	t|	krt|	t j	r|	j
s|	 j|kr|qW 5 Q R X  fdd}
t|
|S )Nc                    sB   t | tr>tj| | jd}| jr.||   |  t|< |S | S )Nr   )	r4   rK   r,   
zeros_liker   r   Z_coalesced_Zis_coalescedid)r*   rW   )	inp_implsr    r!   to_real_tensor  s    
z+run_fallback_kernel.<locals>.to_real_tensorr   c                    s:   t | tjr2t| kr$t|  S   | S n| S d S r&   )r4   r,   r   r   r   )r*   rm   r   r    r!   map_out  s
    z$run_fallback_kernel.<locals>.map_out)r,   r   r   r   r   r   setr   r4   r   r   addrM   Z_cdatar   )rm   r#   r}   r~   Zorig_not_implemented_exceptionr   r   Ztensor_implsZstoragesr*   r   r    r   r!   r     s2    	



	r   c                   @   s   e Zd Zdd ZdddZdS )FakeCopyModec                 C   s
   || _ d S r&   )rm   )rI   rm   r    r    r!   rJ     s    zFakeCopyMode.__init__r    Nc              
   C   s   |r|ni }|t jjjkr2|| j|d f|S |t jjkrt|dkrVt|dksZt	|\}}t
||krz|t
| S | j|}||t
|< |S t j  |||W  5 Q R  S Q R X d S )Nr      )r,   r-   Z_TensorBaser   rm   r   r   __deepcopy__r8   r5   r   ZDisableTorchFunction)rI   r#   r   r}   r~   rS   memorW   r    r    r!   r     s    zFakeCopyMode.__torch_function__)r    N)r   r   r   rJ   r   r    r    r    r!   r    s   r  )o
contextlib	functoolsr   r   ri   rF   Zdataclassesr   r   typingr   r   r   r   r   r	   r
   r   r,   Z
torch._opsr   Ztorch._subclasses.meta_utilsr   r   Ztorch.fx.operator_schemasr   Z torch.multiprocessing.reductionsr   Ztorch.overridesr   Ztorch.utils._mode_utilsr   Ztorch.utils._python_dispatchr   Ztorch.utils._pytreer   r   r   utilsZ_pytreer<   r   rr   r   r   r   r   r   r"   r%   Z_resize_output_r   Z_nested_tensor_from_tensor_listrW   Z
pin_memory	is_pinnedr   rf   r   Z_pin_memoryZ_resize_outputr   Z_list_to_tensorr   r'   Z
empty_likeZ	full_likeZ	ones_likeZ	rand_likeZ
randn_likeZrandint_likeZ	low_dtypeZlow_dtype_outr   Z	new_emptyZnew_empty_stridedZnew_fullZ	new_zerosZnew_onesr{   	lru_cacher9   r:   rA   objectrB   rw   r   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   contextmanagerr   rK   r   r   r  r    r    r    r!   <module>   s   (
	  



















 )  -: