
    Vh/                        d dl Z d dlmZ d dlmZ d dlmc mZ d dlm	Z	  G d de j                        Z G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de j                        Z G d d      Zd Ze j                   ede j&                        e edd       e	 edd       e edd       e edd d      e ed d! d      e ed"d# d      iZ G d$ d%e j                        Zy)&    N)deepcopy)tree_map)LoggingTensorc                   2    e Zd Zed        Zed        Zd Zy)WrapperTensorc                 P    | j                   |i |\  }}d|vr|j                         }n|d   }|d= d|vr|j                  |d<   d|vr|j                  |d<   d|vr|j                  |d<   d|vrd|d<   t        j                  j                  | |fi |}|j                          |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	   wrappers         W/home/dcms/DCMS/lib/python3.12/site-packages/torch/testing/_internal/common_subclass.py__new__zWrapperTensor.__new__   s    .C..??	6668D&>Dv& ggF7O6! xxF86! xxF8&(&+F?# ,,55c4J6J!!#    c                     t        d      )Nz,You need to implement get_wrapper_properties)NotImplementedError)r   r   r   s      r   r   z$WrapperTensor.get_wrapper_properties&   s    
 ""PQQr   c                     g d}|D ]X  }t        | j                  |      t        t        j                  |      us4t	        d| j                  j
                   d| d       y )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els      r   r   zWrapperTensor._validate_methods-   sq    
 _% 	GBt~~r*'%,,2KK"Yt~~/F/F.G H//1d 3F$F G G	Gr   N)r"   
__module____qualname__staticmethodr   classmethodr   r    r   r   r   r      s0     , R R
Gr   r   c                   J     e Zd Zedd       ZddZedd       Z fdZ xZS )WrapperTensorWithCustomSizesc                     ||ddfS )Nsizesr   dispatch_sizes_strides_policyr*   r   r   r   s      r   r   z3WrapperTensorWithCustomSizes.get_wrapper_properties;   s    MT[\\\r   c                     || _         y Nr   r#   r   r   s      r   __init__z%WrapperTensorWithCustomSizes.__init__?   	    r   c                      t         fd|D              st        S |i }d }d }t        | |t        ||      i t        ||xs i             }|S )Nc              3   6   K   | ]  }t        |        y wr3   
issubclass.0r   r   s     r   	<genexpr>zBWrapperTensorWithCustomSizes.__torch_dispatch__.<locals>.<genexpr>D        5!:c1%5   c                 >    t        | t              r| j                  S | S r3   )
isinstancer,   r   es    r   unwrapz?WrapperTensorWithCustomSizes.__torch_dispatch__.<locals>.unwrapJ   s    $Q(DE133L1Lr   c                 P    t        | t        j                        rt        |       S | S r3   )rB   r   r   r,   rC   s    r   wrapz=WrapperTensorWithCustomSizes.__torch_dispatch__.<locals>.wrapM   s!    6@ELL6Q/2XWXXr   allNotImplementedr   r   functypesr   r   rE   rG   rss   `       r   __torch_dispatch__z/WrapperTensorWithCustomSizes.__torch_dispatch__B   s]    5u55!!>F	M	Y dD(64"8[HVV\WY<Z[\	r   c                 >    t         |   d| j                         S Nzt=tensor_contentssuper__repr__r   r#   r    s    r   rV   z%WrapperTensorWithCustomSizes.__repr__S        w"TVVH>>r   Fr*   N	r"   r&   r'   r)   r   r6   rO   rV   __classcell__r    s   @r   r,   r,   :   s:    ] ]   ? ?r   r,   c                   J     e Zd Zedd       ZddZedd       Z fdZ xZS )WrapperTensorWithCustomStridesc                     ||ddfS )Nstridesr/   r*   r1   s      r   r   z5WrapperTensorWithCustomStrides.get_wrapper_propertiesX   s    MT]^^^r   c                     || _         y r3   r4   r5   s      r   r6   z'WrapperTensorWithCustomStrides.__init__\   r7   r   c                      t         fd|D              st        S |i }d }d }t        | |t        ||      i t        ||xs i             }|S )Nc              3   6   K   | ]  }t        |        y wr3   r:   r<   s     r   r>   zDWrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.<genexpr>a   r?   r@   c                 >    t        | t              r| j                  S | S r3   )rB   r_   r   rC   s    r   rE   zAWrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.unwrapg   s    $Q(FG133NQNr   c                 P    t        | t        j                        rt        |       S | S r3   )rB   r   r   r_   rC   s    r   rG   z?WrapperTensorWithCustomStrides.__torch_dispatch__.<locals>.wrapj   s!    8B1ell8S1!4ZYZZr   rH   rK   s   `       r   rO   z1WrapperTensorWithCustomStrides.__torch_dispatch___   s]    5u55!!>F	O	[ dD(64"8[HVV\WY<Z[\	r   c                 >    t         |   d| j                         S rQ   rT   rW   s    r   rV   z'WrapperTensorWithCustomStrides.__repr__p   rX   r   rY   rZ   r[   r]   s   @r   r_   r_   W   s:    _ _   ? ?r   r_   c                   N     e Zd Zedd       ZddZi Zedd       Z fdZ xZ	S )DiagTensorBelowc                 p    |j                   dk(  sJ ||j                         |j                         z   |dfS )N   r	   r   )ndimr	   )r   diagr   s      r   r   z&DiagTensorBelow.get_wrapper_propertiesu   s3    yyA~~diikDIIK7-XXXr   c                     || _         y r3   )rn   )r#   rn   r   s      r   r6   zDiagTensorBelow.__init__z   s	    	r   c                     t         fd|D              st        S  j                  j                  |j                  d       }|r ||i |xs i S d }d }t        | |t        ||      i t        ||xs i             }|S )Nc              3   6   K   | ]  }t        |        y wr3   r:   r<   s     r   r>   z5DiagTensorBelow.__torch_dispatch__.<locals>.<genexpr>   r?   r@   c                 Z    t        | t              r| j                  j                         S | S r3   )rB   ri   rn   rC   s    r   rE   z2DiagTensorBelow.__torch_dispatch__.<locals>.unwrap   s     (21o(Fqvv{{}MAMr   c                 P   t        | t        j                        r| j                  dk(  rt	        |       S t        | t        j                        rW| j                  dk(  rH| j                         | j                         j                         k(  rt	        | j                               S | S )Nrk      )rB   r   r   rm   ri   count_nonzerorn   rC   s    r   rG   z0DiagTensorBelow.__torch_dispatch__.<locals>.wrap   st    a.166Q;*1--a.166Q;1??CTXYX^X^X`XnXnXpCp*166844r   )rI   rJ   handled_opsgetr"   r   )	r   rL   rM   r   r   fnrE   rG   rN   s	   `        r   rO   z"DiagTensorBelow.__torch_dispatch__   s    5u55!! __  5t."..N $hvt&< _QWQ][]@^ _`BIr   c                 >    t         |   d| j                         S )Nzdiag=rR   )rU   rV   rn   rW   s    r   rV   zDiagTensorBelow.__repr__   s!    w%		{0CDDr   rY   rZ   )
r"   r&   r'   r)   r   r6   rv   rO   rV   r\   r]   s   @r   ri   ri   t   sA    Y Y K 4E Er   ri   c                   ~     e Zd Zed	d       Zd	dZ fdZd Zed        Z	ed
d       Z
 fdZi Zed        Z xZS )SparseTensorc                 F    |j                   |j                   k(  sJ |||dfS )Nrl   )r   )r   r	   valuesindicesr   s        r   r   z#SparseTensor.get_wrapper_properties   s(    }}...}EEEr   c                      || _         || _        y r3   )r}   r~   )r#   r	   r}   r~   r   s        r   r6   zSparseTensor.__init__   s    r   c                 X    t         |   d| j                   d| j                         S )Nzvalues=z
, indices=rR   )rU   rV   r}   r~   rW   s    r   rV   zSparseTensor.__repr__   s/    w'$++jQUQ]Q]P^0_``r   c                     t        j                  | j                         | j                  j                        }| j                  || j
                  j                  d      <   |S )N)r
   rk   )r   zerosr	   r}   r
   r~   unbind)r#   ress     r   sparse_to_densezSparseTensor.sparse_to_dense   sD    kk$))+T[[->->?&*kkDLL"#
r   c                     | j                         }| |j                  d         }t        | j                         ||      S )Nrk   )nonzeror   r{   r	   )r   r~   r}   s      r   
from_densezSparseTensor.from_dense   s5    ))+7>>!$%AFFHfg66r   c                     |j                    d|j                   }| j                  |||      }|t        ur|S d }d }t	        | |t	        ||      i t	        ||xs i             }	|	S )N.c                 F    t        | t              r| j                         S | S r3   )rB   r{   r   rC   s    r   rE   z/SparseTensor.__torch_dispatch__.<locals>.unwrap   s    *4Q*E1$$&L1Lr   c                 d    t        | t        j                        rt        j	                  |       S | S r3   )rB   r   r   r{   r   rC   s    r   rG   z-SparseTensor.__torch_dispatch__.<locals>.wrap   s&    1;Au||1L<**1-SRSSr   )r&   r"   _try_call_special_implrJ   r   )
r   rL   rM   r   r   	func_namer   rE   rG   rN   s
             r   rO   zSparseTensor.__torch_dispatch__   sx    'q8	((D&An$J	M	T dD(64"8[HVV\WY<Z[\	r   c                 "    t         |   |      S r3   )rU   __rmul__)r#   otherr    s     r   r   zSparseTensor.__rmul__   s    w&&r   c                 V    || j                   vrt        S  | j                   |   ||      S r3   )_SPECIAL_IMPLSrJ   )r   rL   r   r   s       r   r   z#SparseTensor._try_call_special_impl   s0    s)))!!'s!!$'f55r   rY   rZ   )r"   r&   r'   r)   r   r6   rV   r   r(   r   rO   r   r   r   r\   r]   s   @r   r{   r{      sm    F Fa
 7 7
  *' N6 6r   r{   c                   6     e Zd Zd Zed fd	       Zd Z xZS )NonWrapperTensorc                 X    t         j                  j                  | |      }dd i|_        |S )Nlast_func_called)r   r   _make_subclassextra_state)r   datar   s      r   r   zNonWrapperTensor.__new__   s-    LL''T2
 r   c                     t         |   ||||      }t        ||       rN|t        j                  j
                  u rt        |d   j                        |_        |S d|j                  i|_        |S )Nr   r   )	rU   __torch_function__rB   r   r   __deepcopy__r   r   r"   )r   rL   rM   r   r   resultr    s         r   r   z#NonWrapperTensor.__torch_function__   sp    +D%vFfc" u||000%-d1g.A.A%B"  '&" r   c                 J     t        |       t        j                  |            S r3   )typer   empty)r#   shapes     r   	new_emptyzNonWrapperTensor.new_empty   s    tDz%++e,--r   rZ   )r"   r&   r'   r   r)   r   r   r\   r]   s   @r   r   r      s!       .r   r   c                       e Zd Zg dZddZy)SubclassInfoname	create_fnclosed_under_opsc                 .    || _         || _        || _        y r3   r   )r#   r   r   r   s       r   r6   zSubclassInfo.__init__   s    	" 0r   N)T)r"   r&   r'   	__slots__r6   r*   r   r   r   r      s    9I1r   r   c                 |     | t        j                  |            }|j                          |j                          |S r3   )r   randnr	   r   )r   r   subs      r   _create_and_access_shaper     s.    
ekk% 
!C
 HHJJJLJr   base_tensor)r   non_wrapper_tensorc                 >    t        t        j                  |             S r3   )r   r   r   r   s    r   <lambda>r     s     0U1C D r   logging_tensorc                 >    t        t        j                  |             S r3   )r   r   r   r   s    r   r   r     s    ekk%.@ A r   sparse_tensorc                 n    t         j                  t        j                  |       j	                               S r3   )r{   r   r   r   relur   s    r   r   r     s#     7 7E8J8O8O8Q R r   diag_tensor_belowc                 >    t        t        j                  |             S r3   )ri   r   r   r   s    r   r   r     s    E0B C r   F)r   r   wrapper_with_custom_sizesc                 "    t        t        |       S r3   )r   r,   r   s    r   r   r   $  s     89UW\ ] r   wrapper_with_custom_stridesc                 "    t        t        |       S r3   )r   r_   r   s    r   r   r   )  s     89WY^ _ r   c                   N    e Zd Zed        Zd Zd Zd Zed        Z	ed        Z
y)SubclassWithTensorFactoryc                 (   |j                   }i }|j                         |d<   |j                         |d<   |j                  |d<   |j                  |d<   |j
                  |d<   |j                  |d<   t        j                  j                  | |fi |}|S )Nra   storage_offsetr   r   r   r
   )
r   r   r   r   r   r   r
   r   r   r   )r   srcr   r   outs        r   r   z!SubclassWithTensorFactory.__new__/  s    		JJLy#&#5#5#7 ::x::x"%"3"3))wll11#uGG
r   c                     || _         y r3   )r   )r#   r   s     r   r6   z"SubclassWithTensorFactory.__init__<  s	    r   c                 0    | j                   j                   S r3   )r    r"   r#   s    r   rV   z"SubclassWithTensorFactory.__repr__?  s    ..))*+r   c                     dgd fS Nr   r*   r   s    r   __tensor_flatten__z,SubclassWithTensorFactory.__tensor_flatten__B  s    w}r   c                     |d   } | |      S r   r*   )r   inner_tensorsmeta
outer_sizeouter_strider   s         r   __tensor_unflatten__z.SubclassWithTensorFactory.__tensor_unflatten__E  s    E"3xr   c                 D   |i }d }t        j                  | ||      }t        j                  | ||      } ||i |}t        j                  |      \  }	}
|	D cg c]&  }t        |t        j
                        r | |      n|( }}t        j                  ||
      S c c}w )Nc                     | j                   j                  t        j                  k(  r6| j                   t        j                  | j                   j
                        z  S | j                   S r3   )r   r
   r   float32onesr   )xs    r   _fnz9SubclassWithTensorFactory.__torch_dispatch__.<locals>._fnO  sA    67eekkU]]6R1555::aeekk22]XYX]X]]r   )pytreetree_map_onlytree_flattenrB   r   r   tree_unflatten)r   rL   rM   r   r   r   _args_kwargs_out	_out_flat	_out_specoout_flats                r   rO   z,SubclassWithTensorFactory.__torch_dispatch__J  s    >F	^ $$S#t4&&sC8U&g&%2248	9JSTQjELL9CFq@TT$$Xy99 Us   +BN)r"   r&   r'   r(   r   r6   rV   r   r)   r   rO   r*   r   r   r   r   .  sK    
 
,   : :r   r   )r   copyr   torch.utils._pytreer   utils_pytreer   &torch.testing._internal.logging_tensorr   r   r   r,   r_   ri   r{   r   r   r   r   subclass_dbr   r*   r   r   <module>r      s(     ( $ $ A)GELL )GX?= ?:?] ?:'Em 'ET76= 76v.u|| .<1 1 
LL, lD <A ,R \C
 !,#]#
 #L%_%5B,: ,:r   