o
    wZh/                     @   sH  d dl Z d dlmZ d dlmZ d dlm  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ZG dd deZG dd de j
ZG dd dZ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!eed"d#d d d!eed$d%d d d!iZG d&d' d'e j
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 |i |\}}d|vr| }n|d }|d= d|vr#|j|d< d|vr,|j|d< d|vr5|j|d< d|vr=d|d< tjj| |fi |}|  |S )Nsizedtypelayoutdevicerequires_gradF)	get_wrapper_propertiesr   r   r   r	   torchTensor_make_wrapper_subclass_validate_methods)clsargskwargstr   wrapper r   V/var/www/auris/lib/python3.10/site-packages/torch/testing/_internal/common_subclass.py__new__   s    



zWrapperTensor.__new__c                 O   s   t d)Nz,You need to implement get_wrapper_properties)NotImplementedError)r   r   r   r   r   r   r   &   s   z$WrapperTensor.get_wrapper_propertiesc                 C   sH   g d}|D ]}t | j|t tj|ur!td| jj d| dqd S )N)r   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                       B   e Zd ZedddZdddZeddd	Z fd
dZ  ZS )WrapperTensorWithCustomSizesFc                 C      ||ddfS )Nsizesr
   Zdispatch_sizes_strides_policyr   r   r   r
   r   r   r   r   ;      z3WrapperTensorWithCustomSizes.get_wrapper_propertiesc                 C   
   || _ d S Nr   r   r   r
   r   r   r   __init__?      
z%WrapperTensorWithCustomSizes.__init__r   Nc                    ^   t  fdd|D stS |d u ri }dd }dd }t||t||i t||p(i }|S )Nc                 3       | ]}t  |V  qd S r,   
issubclass.0r   r   r   r   	<genexpr>D       zBWrapperTensorWithCustomSizes.__torch_dispatch__.<locals>.<genexpr>c                 S      t | tr| jS | S r,   )
isinstancer%   r   er   r   r   unwrapJ      z?WrapperTensorWithCustomSizes.__torch_dispatch__.<locals>.unwrapc                 S      t | tjr
t| S | S r,   )r;   r   r   r%   r<   r   r   r   wrapM      z=WrapperTensorWithCustomSizes.__torch_dispatch__.<locals>.wrapallNotImplementedr   r   functypesr   r   r>   rA   rsr   r7   r   __torch_dispatch__B      $z/WrapperTensorWithCustomSizes.__torch_dispatch__c                       t  jd| j dS Nzt=Ztensor_contentssuper__repr__r   r   r   r   r   rQ   S      z%WrapperTensorWithCustomSizes.__repr__Fr   N	r   r    r!   r#   r   r/   rJ   rQ   __classcell__r   r   rS   r   r%   :       
r%   c                       r$   )WrapperTensorWithCustomStridesFc                 C   r&   )Nstridesr(   r   r)   r   r   r   r   X   r*   z5WrapperTensorWithCustomStrides.get_wrapper_propertiesc                 C   r+   r,   r-   r.   r   r   r   r/   \   r0   z'WrapperTensorWithCustomStrides.__init__r   Nc                    r1   )Nc                 3   r2   r,   r3   r5   r7   r   r   r8   a   r9   zDWrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.<genexpr>c                 S   r:   r,   )r;   rZ   r   r<   r   r   r   r>   g   r?   zAWrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.unwrapc                 S   r@   r,   )r;   r   r   rZ   r<   r   r   r   rA   j   rB   z?WrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.wraprC   rF   r   r7   r   rJ   _   rK   z1WrapperTensorWithCustomStrides.__torch_dispatch__c                    rL   rM   rO   rR   rS   r   r   rQ   p   rT   z'WrapperTensorWithCustomStrides.__repr__rU   rV   rW   r   r   rS   r   rZ   W   rY   rZ   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J || |  |dfS )N   r   r
   )ndimr   )r   diagr
   r   r   r   r   u   s   z&DiagTensorBelow.get_wrapper_propertiesc                 C   r+   r,   )r`   )r   r`   r
   r   r   r   r/   z   r0   zDiagTensorBelow.__init__r   Nc           	         sx   t  fdd|D stS  j|jd }|r ||i |pi S dd }dd }t||t||i t||p5i }|S )Nc                 3   r2   r,   r3   r5   r7   r   r   r8      r9   z5DiagTensorBelow.__torch_dispatch__.<locals>.<genexpr>c                 S   s   t | tr
| j S | S r,   )r;   r\   r`   r<   r   r   r   r>      rB   z2DiagTensorBelow.__torch_dispatch__.<locals>.unwrapc                 S   sX   t | tjr| jdkrt| S t | tjr*| jdkr*|  |   kr*t|  S | S )Nr]      )r;   r   r   r_   r\   Zcount_nonzeror`   r<   r   r   r   rA      s
   *z0DiagTensorBelow.__torch_dispatch__.<locals>.wrap)rD   rE   handled_opsgetr   r   )	r   rG   rH   r   r   fnr>   rA   rI   r   r7   r   rJ      s   $z"DiagTensorBelow.__torch_dispatch__c                    rL   )Nzdiag=rN   )rP   rQ   r`   rR   rS   r   r   rQ      rT   zDiagTensorBelow.__repr__rU   rV   )
r   r    r!   r#   r   r/   rb   rJ   rQ   rX   r   r   rS   r   r\   t   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J |||dfS )Nr^   )r	   )r   r   valuesindicesr
   r   r   r   r      s   z#SparseTensor.get_wrapper_propertiesc                 C   s   || _ || _d S r,   )rf   rg   )r   r   rf   rg   r
   r   r   r   r/      s   
zSparseTensor.__init__c                    s   t  jd| j d| j dS )Nzvalues=z
, indices=rN   )rP   rQ   rf   rg   rR   rS   r   r   rQ      s   zSparseTensor.__repr__c                 C   s,   t j|  | jjd}| j|| jd< |S )N)r   r]   )r   Zzerosr   rf   r   rg   unbind)r   resr   r   r   sparse_to_dense   s   zSparseTensor.sparse_to_densec                 C   s&   |   }| |d }t|  ||S )Nr]   )Znonzerorh   re   r   )r   rg   rf   r   r   r   
from_dense   s   zSparseTensor.from_denser   Nc           
      C   sd   |j  d|j }| |||}|tur|S dd }dd }t||t||i t||p+i }	|	S )N.c                 S   s   t | tr	|  S | S r,   )r;   re   rj   r<   r   r   r   r>      rT   z/SparseTensor.__torch_dispatch__.<locals>.unwrapc                 S   s   t | tjrt| S | S r,   )r;   r   r   re   rk   r<   r   r   r   rA      s   z-SparseTensor.__torch_dispatch__.<locals>.wrap)r    r   _try_call_special_implrE   r   )
r   rG   rH   r   r   	func_nameri   r>   rA   rI   r   r   r   rJ      s   $zSparseTensor.__torch_dispatch__c                    s   t  |S r,   )rP   __rmul__)r   otherrS   r   r   ro      s   zSparseTensor.__rmul__c                 C   s   || j vrtS | j | ||S r,   )_SPECIAL_IMPLSrE   )r   rG   r   r   r   r   r   rm      s   
z#SparseTensor._try_call_special_implrU   rV   )r   r    r!   r#   r   r/   rQ   rj   r"   rk   rJ   ro   rq   rm   rX   r   r   rS   r   re      s    

re   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                    sL   t  ||||}t|| r$|tjju rt|d j|_|S d|ji|_|S )Nr   rs   )	rP   __torch_function__r;   r   r   __deepcopy__r   rt   r   )r   rG   rH   r   r   resultrS   r   r   rv      s   
z#NonWrapperTensor.__torch_function__c                 C   s   t | t|S r,   )typer   empty)r   shaper   r   r   	new_empty   s   zNonWrapperTensor.new_emptyrV   )r   r    r!   r   r#   rv   r|   rX   r   r   rS   r   rr      s
    rr   c                   @   s   e Zd Zg d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/      s   
zSubclassInfo.__init__N)T)r   r    r!   	__slots__r/   r   r   r   r   r}      s    r}   c                 C   s"   | t |}|  |  |S r,   )r   randnr   r   )r   r{   subr   r   r   _create_and_access_shape  s   r   Zbase_tensor)r   Znon_wrapper_tensorc                 C      t t| S r,   )rr   r   r   r{   r   r   r   <lambda>      r   Zlogging_tensorc                 C   r   r,   )r   r   r   r   r   r   r   r     r   Zsparse_tensorc                 C   s   t t|  S r,   )re   rk   r   r   Zrelur   r   r   r   r     s    Zdiag_tensor_belowc                 C   r   r,   )r\   r   r   r   r   r   r   r     r   F)r   r   Zwrapper_with_custom_sizesc                 C   
   t t| S r,   )r   r%   r   r   r   r   r   $     
 Zwrapper_with_custom_stridesc                 C   r   r,   )r   rZ   r   r   r   r   r   )  r   c                   @   sH   e Zd Zedd Zdd Zdd Zdd Zed	d
 Z	edd Z
dS )SubclassWithTensorFactoryc                 C   sd   |j }i }| |d< | |d< |j|d< |j|d< |j|d< |j|d< tjj	| |fi |}|S )Nr[   storage_offsetr	   r   r
   r   )
r{   r   r   r	   r   r
   r   r   r   r   )r   srcr{   r   outr   r   r   r   /  s   



z!SubclassWithTensorFactory.__new__c                 C   r+   r,   )r   )r   r   r   r   r   r/   <  r0   z"SubclassWithTensorFactory.__init__c                 C   s
   | j j S r,   )r   r   rR   r   r   r   rQ   ?  r0   z"SubclassWithTensorFactory.__repr__c                 C   s
   dgd fS Nr   r   rR   r   r   r   __tensor_flatten__B  r0   z,SubclassWithTensorFactory.__tensor_flatten__c                 C   s   |d }| |S r   r   )r   Zinner_tensorsmetaZ
outer_sizeZouter_strider   r   r   r   __tensor_unflatten__E  s   z.SubclassWithTensorFactory.__tensor_unflatten__c                    sj   |d u ri }dd }t  ||}t  ||}||i |}t |\}	}
 fdd|	D }t ||
S )Nc                 S   s(   | j jtjkr| j t| j j S | j S r,   )r   r   r   Zfloat32Zonesr{   )xr   r   r   _fnO  s   (z9SubclassWithTensorFactory.__torch_dispatch__.<locals>._fnc                    s$   g | ]}t |tjr |n|qS r   )r;   r   r   )r6   or7   r   r   
<listcomp>Y  s   $ z@SubclassWithTensorFactory.__torch_dispatch__.<locals>.<listcomp>)pytreeZtree_map_onlyZtree_flattenZtree_unflatten)r   rG   rH   r   r   r   _args_kwargsZ_outZ	_out_flatZ	_out_specZout_flatr   r7   r   rJ   J  s   z,SubclassWithTensorFactory.__torch_dispatch__N)r   r    r!   r"   r   r/   rQ   r   r#   r   rJ   r   r   r   r   r   .  s    

r   )r   copyr   Ztorch.utils._pytreer   utilsZ_pytreer   Z&torch.testing._internal.logging_tensorr   r   r   r%   rZ   r\   re   rr   r}   r   r   Zsubclass_dbr   r   r   r   r   <module>   sZ   ,*;!