o
    0h/                     @   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   [/var/www/vscode/kcb/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__)self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
   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@   rC   rsr   r9   r   __torch_dispatch__B      $z/WrapperTensorWithCustomSizes.__torch_dispatch__c                       t  jd| j dS Nzt=tensor_contentssuper__repr__r   r   r   r   r   rT   S      z%WrapperTensorWithCustomSizes.__repr__Fr   N	r   r!   r"   r$   r   r1   rL   rT   __classcell__r   r   rV   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/   r0   r   r   r   r1   \   r2   z'WrapperTensorWithCustomStrides.__init__r   Nc                    r3   )Nc                 3   r4   r.   r5   r7   r9   r   r   r:   a   r;   zDWrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.<genexpr>c                 S   r<   r.   )r=   r]   r   r>   r   r   r   r@   g   rA   zAWrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.unwrapc                 S   rB   r.   )r=   r   r   r]   r>   r   r   r   rC   j   rD   z?WrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.wraprE   rH   r   r9   r   rL   _   rM   z1WrapperTensorWithCustomStrides.__torch_dispatch__c                    rN   rO   rR   rU   rV   r   r   rT   p   rW   z'WrapperTensorWithCustomStrides.__repr__rX   rY   rZ   r   r   rV   r   r]   W   r\   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J || |  |dfS )N   r   r
   )ndimr   )r   diagr
   r   r   r   r   u   s   z&DiagTensorBelow.get_wrapper_propertiesc                 C   r-   r.   )rc   )r   rc   r
   r   r   r   r1   z   r2   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   r4   r.   r5   r7   r9   r   r   r:      r;   z5DiagTensorBelow.__torch_dispatch__.<locals>.<genexpr>c                 S   s   t | tr
| j S | S r.   )r=   r_   rc   r>   r   r   r   r@      rD   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   rb   r_   count_nonzerorc   r>   r   r   r   rC      s
   *z0DiagTensorBelow.__torch_dispatch__.<locals>.wrap)rF   rG   handled_opsgetr   r   )	r   rI   rJ   r   r   fnr@   rC   rK   r   r9   r   rL      s   $z"DiagTensorBelow.__torch_dispatch__c                    rN   )Nzdiag=rP   )rS   rT   rc   rU   rV   r   r   rT      rW   zDiagTensorBelow.__repr__rX   rY   )
r   r!   r"   r$   r   r1   rf   rL   rT   r[   r   r   rV   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 )Nra   )r	   )r   r   valuesindicesr
   r   r   r   r      s   z#SparseTensor.get_wrapper_propertiesc                 C   s   || _ || _d S r.   )rj   rk   )r   r   rj   rk   r
   r   r   r   r1      s   
zSparseTensor.__init__c                    s   t  jd| j d| j dS )Nzvalues=z
, indices=rP   )rS   rT   rj   rk   rU   rV   r   r   rT      s   zSparseTensor.__repr__c                 C   s,   t j|  | jjd}| j|| jd< |S )N)r   r`   )r   zerosr   rj   r   rk   unbind)r   resr   r   r   sparse_to_dense   s   zSparseTensor.sparse_to_densec                 C   s&   |   }| |d }t|  ||S )Nr`   )nonzerorm   ri   r   )r   rk   rj   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=   ri   ro   r>   r   r   r   r@      rW   z/SparseTensor.__torch_dispatch__.<locals>.unwrapc                 S   s   t | tjrt| S | S r.   )r=   r   r   ri   rq   r>   r   r   r   rC      s   z-SparseTensor.__torch_dispatch__.<locals>.wrap)r!   r   _try_call_special_implrG   r   )
r   rI   rJ   r   r   	func_namern   r@   rC   rK   r   r   r   rL      s   $zSparseTensor.__torch_dispatch__c                    s   t  |S r.   )rS   __rmul__)r   otherrV   r   r   ru      s   zSparseTensor.__rmul__c                 C   s   || j vrtS | j | ||S r.   )_SPECIAL_IMPLSrG   )r   rI   r   r   r   r   r   rs      s   
z#SparseTensor._try_call_special_implrX   rY   )r   r!   r"   r$   r   r1   rT   ro   r#   rq   rL   ru   rw   rs   r[   r   r   rV   r   ri      s    

ri   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   _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   ry   )	rS   __torch_function__r=   r   r   __deepcopy__r   r{   r   )r   rI   rJ   r   r   resultrV   r   r   r}      s   
z#NonWrapperTensor.__torch_function__c                 C   s   t | t|S r.   )typer   empty)r   shaper   r   r   	new_empty   s   zNonWrapperTensor.new_emptyrY   )r   r!   r"   r   r$   r}   r   r[   r   r   rV   r   rx      s
    rx   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   r1      s   
zSubclassInfo.__init__N)T)r   r!   r"   	__slots__r1   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   base_tensor)r   non_wrapper_tensorc                 C      t t| S r.   )rx   r   r   r   r   r   r   <lambda>      r   logging_tensorc                 C   r   r.   )r   r   r   r   r   r   r   r     r   sparse_tensorc                 C   s   t t|  S r.   )ri   rq   r   r   relur   r   r   r   r     s    diag_tensor_belowc                 C   r   r.   )r_   r   r   r   r   r   r   r     r   F)r   r   wrapper_with_custom_sizesc                 C   
   t t| S r.   )r   r&   r   r   r   r   r   $     
 wrapper_with_custom_stridesc                 C   r   r.   )r   r]   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   r1   <  r2   z"SubclassWithTensorFactory.__init__c                 C   s
   | j j S r.   )r   r   rU   r   r   r   rT   ?  r2   z"SubclassWithTensorFactory.__repr__c                 C   s
   dgd fS Nr   r   rU   r   r   r   __tensor_flatten__B  r2   z,SubclassWithTensorFactory.__tensor_flatten__c                 C   s   |d }| |S r   r   )r   inner_tensorsmeta
outer_size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   float32onesr   )xr   r   r   _fnO  s   (z9SubclassWithTensorFactory.__torch_dispatch__.<locals>._fnc                    s$   g | ]}t |tjr |n|qS r   )r=   r   r   )r8   or9   r   r   
<listcomp>Y  s   $ z@SubclassWithTensorFactory.__torch_dispatch__.<locals>.<listcomp>)pytreetree_map_onlytree_flattentree_unflatten)r   rI   rJ   r   r   r   _args_kwargs_out	_out_flat	_out_specout_flatr   r9   r   rL   J  s   z,SubclassWithTensorFactory.__torch_dispatch__N)r   r!   r"   r#   r   r1   rT   r   r$   r   rL   r   r   r   r   r   .  s    

r   )r   copyr   torch.utils._pytreer   utils_pytreer   &torch.testing._internal.logging_tensorr   r   r   r&   r]   r_   ri   rx   r   r   r   subclass_dbr   r   r   r   r   <module>   sZ   ,*;!