a
    h	                     @   sd   d dl mZmZ d dlZd dlm  mZ d dlm	Z	 d dl
mZ d dlmZ G dd dejZdS )    )AnyOptionalN)is_fake)	TwoTensor)return_and_correct_aliasingc                   @   sb   e Zd ZedddZdddZdd Zdd	 Zed
d Ze	dd Z
deee dddZdS )WrapperSubclassNc                 C   sz   |d u r|  }|d u r | }i }||d< | |d< |j|d< |j|d< |j|d< |j|d< tjj	| |fi |}|S )Nstridesstorage_offsetdevicelayoutrequires_graddtype)
sizeZstrider	   r
   r   r   r   torchTensorZ_make_wrapper_subclass)clsa
outer_sizeouter_stridekwargsout r   P/var/www/auris/lib/python3.9/site-packages/torch/testing/_internal/subclasses.py__new__   s    



zWrapperSubclass.__new__c                 C   s
   || _ d S Nr   )selfr   r   r   r   r   r   __init__   s    zWrapperSubclass.__init__c                 C   s   dt | j dS )NzWrapperSubclass())reprr   r   r   r   r   __repr__!   s    zWrapperSubclass.__repr__c                 C   s
   dgd fS Nr   r   r    r   r   r   __tensor_flatten__$   s    z"WrapperSubclass.__tensor_flatten__c                 C   s@   |d u sJ | d }t |r4|d us(J |d us4J t|||S r"   )r   r   )Zinner_tensorsmetar   r   r   r   r   r   __tensor_unflatten__'   s    z$WrapperSubclass.__tensor_unflatten__c                 C   s   |d u ri }t tdd |}t tdd |}||i |}t |\}}	dd |D }
t |
|	}ddlm} ||u r~|S t||||S d S )Nc                 S   s   | j S r   r   xr   r   r   <lambda>4       z4WrapperSubclass.__torch_dispatch__.<locals>.<lambda>c                 S   s   | j S r   r   r&   r   r   r   r(   6   r)   c                 S   s$   g | ]}t |tjrt|n|qS r   )
isinstancer   r   r   ).0Zo_ar   r   r   
<listcomp>:   s   z6WrapperSubclass.__torch_dispatch__.<locals>.<listcomp>r   )cond_op)pytreeZtree_map_onlyr   Ztree_flattenZtree_unflattenZtorch._higher_order_ops.condr-   r   )r   functypesargsr   Zargs_aZkwargs_aZout_aZ
out_a_flatspecZout_flatr   r-   r   r   r   __torch_dispatch__0   s    z"WrapperSubclass.__torch_dispatch__)expected_metadataexpected_typec                 C   s2   |t | jkr| jS |tu r.t| j| j S d S r   )typer   r   clone)r   r4   r5   r   r   r   #__coerce_same_metadata_as_tangent__F   s
    z3WrapperSubclass.__coerce_same_metadata_as_tangent__)NN)NN)N)__name__
__module____qualname__staticmethodr   r   r!   r#   r%   classmethodr3   r   r   r6   r8   r   r   r   r   r      s   


 r   )typingr   r   r   Ztorch.utils._pytreeutilsZ_pytreer.   Ztorch._subclasses.fake_tensorr   Z"torch.testing._internal.two_tensorr   Ztorch.utils._python_dispatchr   r   r   r   r   r   r   <module>   s   