U
    <c\                     @   s   d dl Z d dlmZ d dlmZ d dlmZ G dd de jZG dd deZ	G d	d
 d
eZ
G dd de jZG dd dZe jeddd deeddd deeddd de
eddd de	eddd ddiZdS )    N)deepcopy)tree_map)LoggingTensorc                   @   s,   e Zd Zedd Zedd Zdd ZdS )WrapperTensorc                 O   s   | j ||\}}d|kr"| }n|d }|d= d|krB|j|d< d|krT|j|d< d|krf|j|d< d|krvd|d< tjj| |f|}|  |S )Nsizedtypelayoutdevicerequires_gradF)	get_wrapper_propertiesr   r   r   r	   torchTensorZ_make_wrapper_subclass_validate_methods)clsargskwargstr   wrapper r   K/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/common_subclass.py__new__   s     



zWrapperTensor.__new__c                 O   s   t dd S )Nz,You need to implement get_wrapper_properties)NotImplementedError)r   r   r   r   r   r   r   "   s    z$WrapperTensor.get_wrapper_propertiesc                 C   sP   ddddddg}|D ]6}t | j|t tj|k	rtd| jj d| d	qd S )
Nr   Zstrider   r   r	   r
   z	Subclass z is overwriting the property zN but this is not allowed as such change would not be reflected to c++ callers.)getattr	__class__r   r   RuntimeError__name__)selfZforbidden_overrideselr   r   r   r   )   s    zWrapperTensor._validate_methodsN)r   
__module____qualname__staticmethodr   classmethodr   r   r   r   r   r   r   
   s
   

r   c                       sN   e Zd ZedddZdddZi Zejj	Z
eddd	Z fd
dZ  ZS )DiagTensorBelowFc                 C   s(   |j dkst|| |  |dfS )N   r   r
   )ndimAssertionErrorr   )r   diagr
   r   r   r   r   7   s    z&DiagTensorBelow.get_wrapper_propertiesc                 C   s
   || _ d S N)r'   )r   r'   r
   r   r   r   __init__<   s    zDiagTensorBelow.__init__r   Nc           	         st   t  fdd|D stS  j|jd }|r<|||p8i S dd }dd }t||t||t||pdi }|S d S )Nc                 3   s   | ]}t  |V  qd S r(   )
issubclass).0r   r   r   r   	<genexpr>F   s     z5DiagTensorBelow.__torch_dispatch__.<locals>.<genexpr>c                 S   s   t | tr| j S | S r(   )
isinstancer"   r'   er   r   r   unwrapR   s    z2DiagTensorBelow.__torch_dispatch__.<locals>.unwrapc                 S   sX   t | tjr| jdkrt| S t | tjrT| jdkrT|  |   krTt|  S | S )Nr#      )r.   r   r   r%   r"   Zcount_nonzeror'   r/   r   r   r   wrapU   s
    *z0DiagTensorBelow.__torch_dispatch__.<locals>.wrap)allNotImplementedhandled_opsgetr   r   )	r   functypesr   r   fnr1   r3   rsr   r,   r   __torch_dispatch__D   s     z"DiagTensorBelow.__torch_dispatch__c                    s   t  jd| j dS )Nzdiag=Ztensor_contents)super__repr__r'   r   r   r   r   r?   _   s    zDiagTensorBelow.__repr__)F)F)r   N)r   r   r   r!   r   r)   r6   r   Z_CZ_disabled_torch_function_impl__torch_function__r<   r?   __classcell__r   r   rA   r   r"   6   s   
r"   c                       sr   e Zd ZedddZdddZ fddZdd	 Zed
d Z	edddZ
 fddZi Zedd Z  ZS )SparseTensorFc                 C   s   |j |j kst|||dfS )Nr$   )r	   r&   )r   r   valuesindicesr
   r   r   r   r   d   s    z#SparseTensor.get_wrapper_propertiesc                 C   s   || _ || _d S r(   )rE   rF   )r   r   rE   rF   r
   r   r   r   r)   i   s    zSparseTensor.__init__c                    s   t  jd| j d| j dS )Nzvalues=z
, indices=r=   )r>   r?   rE   rF   r@   rA   r   r   r?   m   s    zSparseTensor.__repr__c                 C   s,   t j|  | jjd}| j|| jd< |S )N)r   r#   )r   zerosr   rE   r   rF   unbind)r   resr   r   r   sparse_to_densep   s    zSparseTensor.sparse_to_densec                 C   s&   |   }| |d }t|  ||S )Nr#   )ZnonzerorH   rD   r   )r   rF   rE   r   r   r   
from_denseu   s    zSparseTensor.from_denser   Nc           
      C   s`   |j  d|j }| |||}|tk	r,|S dd }dd }t||t||t||pTi }	|	S )N.c                 S   s   t | tr|  S | S r(   )r.   rD   rJ   r/   r   r   r   r1      s    z/SparseTensor.__torch_dispatch__.<locals>.unwrapc                 S   s   t | tjrt| S | S r(   )r.   r   r   rD   rK   r/   r   r   r   r3      s    z-SparseTensor.__torch_dispatch__.<locals>.wrap)r   r   _try_call_special_implr5   r   )
r   r8   r9   r   r   	func_namerI   r1   r3   r;   r   r   r   r<   {   s     zSparseTensor.__torch_dispatch__c                    s   t  |S r(   )r>   __rmul__)r   otherrA   r   r   rO      s    zSparseTensor.__rmul__c                 C   s   || j krtS | j | ||S r(   )_SPECIAL_IMPLSr5   )r   r8   r   r   r   r   r   rM      s    
z#SparseTensor._try_call_special_impl)F)F)r   N)r   r   r   r!   r   r)   r?   rJ   r    rK   r<   rO   rQ   rM   rC   r   r   rA   r   rD   c   s   

rD   c                       s2   e Zd Zdd Zed	 fdd	Zdd Z  ZS )
NonWrapperTensorc                 C   s   t j| |}dd i|_|S )Nlast_func_called)r   r   Z_make_subclassextra_state)r   datar   r   r   r   r      s
     zNonWrapperTensor.__new__r   Nc                    sJ   t  ||||}t|| rF|tjjkr:t|d j|_nd|ji|_|S )Nr   rS   )	r>   rB   r.   r   r   __deepcopy__r   rT   r   )r   r8   r9   r   r   resultrA   r   r   rB      s    
 z#NonWrapperTensor.__torch_function__c                 C   s   t | t|S r(   )typer   empty)r   shaper   r   r   	new_empty   s    zNonWrapperTensor.new_empty)r   N)r   r   r   r   r!   rB   r[   rC   r   r   rA   r   rR      s   rR   c                   @   s    e Zd ZdddgZdddZdS )	SubclassInfoname	create_fnclosed_under_opsTc                 C   s   || _ || _|| _d S r(   )r]   r^   r_   )r   r]   r^   r_   r   r   r   r)      s    zSubclassInfo.__init__N)T)r   r   r   	__slots__r)   r   r   r   r   r\      s   
r\   Zbase_tensorc                 C   s
   t | S r(   )r   randnrZ   r   r   r   <lambda>       rc   )r^   Znon_wrapper_tensorc                 C   s   t t| S r(   )rR   r   ra   rb   r   r   r   rc      rd   Zlogging_tensorc                 C   s   t t| S r(   )r   r   ra   rb   r   r   r   rc      rd   Zsparse_tensorc                 C   s   t t|  S r(   )rD   rK   r   ra   Zrelurb   r   r   r   rc      rd   Zdiag_tensor_belowc                 C   s   t t| S r(   )r"   r   ra   rb   r   r   r   rc      rd   F)r^   r_   )r   copyr   Ztorch.utils._pytreer   Z&torch.testing._internal.logging_tensorr   r   r   r"   rD   rR   r\   Zsubclass_dbr   r   r   r   <module>   sF   ,-;      