U
    Mh                     @   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e j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   Y/var/www/html/venv/lib/python3.8/site-packages/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                       sF   e Zd ZedddZdddZi 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   9   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>E   s     z5DiagTensorBelow.__torch_dispatch__.<locals>.<genexpr>c                 S   s   t | tr| j S | S r(   )
isinstancer"   r'   er   r   r   unwrapQ   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   wrapT   s
    *z0DiagTensorBelow.__torch_dispatch__.<locals>.wrap)allNotImplementedhandled_opsgetr   r   )	r   functypesr   r   fnr1   r3   rsr   r,   r   __torch_dispatch__C   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<   r?   __classcell__r   r   rA   r   r"   8   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   c   s    z#SparseTensor.get_wrapper_propertiesc                 C   s   || _ || _d S r(   )rD   rE   )r   r   rD   rE   r
   r   r   r   r)   h   s    zSparseTensor.__init__c                    s   t  jd| j d| j dS )Nzvalues=z
, indices=r=   )r>   r?   rD   rE   r@   rA   r   r   r?   l   s    zSparseTensor.__repr__c                 C   s,   t j|  | jjd}| j|| jd< |S )N)r   r#   )r   Zzerosr   rD   r   rE   unbind)r   resr   r   r   sparse_to_denseo   s    zSparseTensor.sparse_to_densec                 C   s&   |   }| |d }t|  ||S )Nr#   )ZnonzerorF   rC   r   )r   rE   rD   r   r   r   
from_denset   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.   rC   rH   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   rC   rI   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_namerG   r1   r3   r;   r   r   r   r<   z   s     zSparseTensor.__torch_dispatch__c                    s   t  |S r(   )r>   __rmul__)r   otherrA   r   r   rM      s    zSparseTensor.__rmul__c                 C   s   || j krtS | j | ||S r(   )_SPECIAL_IMPLSr5   )r   r8   r   r   r   r   r   rK      s    
z#SparseTensor._try_call_special_impl)F)F)r   N)r   r   r   r!   r   r)   r?   rH   r    rI   r<   rM   rO   rK   rB   r   r   rA   r   rC   b   s   

rC   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   rQ   )	r>   __torch_function__r.   r   r   __deepcopy__r   rR   r   )r   r8   r9   r   r   resultrA   r   r   rT      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!   rT   rZ   rB   r   r   rA   r   rP      s   rP   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_tensor)r]   Znon_wrapper_tensorc                 C   s   t t| S r(   )rP   r   randnrY   r   r   r   <lambda>       rb   Zlogging_tensorc                 C   s   t t| S r(   )r   r   r`   ra   r   r   r   rb      rc   Zsparse_tensorc                 C   s   t t|  S r(   )rC   rI   r   r`   Zrelura   r   r   r   rb      rc   Zdiag_tensor_belowc                 C   s   t t| S r(   )r"   r   r`   ra   r   r   r   rb      rc   F)r]   r^   )r   copyr   Ztorch.utils._pytreer   Z&torch.testing._internal.logging_tensorr   r   r   r"   rC   rP   r[   r`   Zsubclass_dbr   r   r   r   <module>   sF   ,*;      