
    |j                       d dl mZ d dlmZ d dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d d	lmZ erd d
lmZ d dlmZ d dlmZmZ g Zej        j        j        ej        j        j        ej        j        j         ej        j        j!        ej        j        j"        ej        j        j#        gZ$dGdHdZ%dGdHdZ&dGdHdZ'	 dGdIdZ(	 	 	 	 dJdKdZ)dGdHd Z*dGdHd!Z+dGdHd"Z,dGdHd#Z-dGdHd$Z.dGdHd%Z/dGdHd&Z0dGdHd'Z1	 	 	 dLdMd*Z2dGdNd-Z3dGdHd.Z4dGdHd/Z5dGdHd0Z6dGdHd1Z7dGdHd2Z8dGdHd3Z9 edd4g          dGdOd7            Z:dGdHd8Z;	 dGdPd=Z<	 	 	 	 dQdRdFZ=dS )S    )annotations)TYPE_CHECKINGN)_C_ops)
check_typecheck_variable_and_dtype)convert_np_dtype_to_dtype_corein_dynamic_or_pir_mode)Variable)LayerHelper)param_one_alias)Sequence)Tensor)	DTypeLike	ShapeLikexr   name
str | Nonereturnc                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise sin of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = sin(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.sin(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-0.90929741,  0.84147102])
    <Currently, Sparse API only support dynamic mode or pir mode.)r
   r   
sparse_sinr   r   s     c/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/sparse/unary.pysinr   5   :    : "##  F # Q    c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise tan of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = tan(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.tan(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[2.18503976, 1.55740774])
    r   )r
   r   
sparse_tanr   s     r   tanr    X   r   r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise asin of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = asin(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.asin(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[nan       , 1.57079625])
    r   )r
   r   sparse_asinr   s     r   asinr#   {   :    : "##  F # a   r   permSequence[int]c                \    t                      s
J d            t          j        | |          S )a  
    Changes the perm order of ``x`` without changing its data, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = transpose(x, perm)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        perm (list|tuple): Permute the input according to the data of perm.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A transposed Sparse Tensor with the same data type as ``x``.

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('indices overflow')
            >>> # doctest: +REQUIRES(env:GPU)
            >>> import paddle

            >>> dense_x = paddle.to_tensor([[-2., 0.], [1., 2.]])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.transpose(sparse_x, [1, 0])
            >>> out
            Tensor(shape=[2, 2], dtype=paddle.float32, place=Place(gpu:0), stop_gradient=True,
                indices=[[0, 0]],
                values=[[-2.,  0.],
                        [ 1.,  2.]])

    r   )r
   r   sparse_transpose)r   r%   r   s      r   	transposer)      s=    H "##  F # "1d+++r   Faxisint | Sequence[int] | NonedtypeDTypeLike | Nonekeepdimboolc           
     0   d}|d}t          |          }t                      rt          j        | |||          S |g }n|g}|||d}|r|                    | j        |d           t          | dg dd           t          |d	t          t          t          t          d          t          fd           d}t          |          }|r|                    |
          }	n|                    | j        
          }	|                    |d| id|	i|           |	S )a
  
    Computes the sum of sparse tensor elements over the given dimension, requiring x to be a SparseCooTensor or SparseCsrTensor.

    Args:
        x (Tensor): An N-D Tensor, the data type is bool, float16, float32, float64, int32 or int64.
        axis (int|list|tuple|None, optional): The dimensions along which the sum is performed. If
            :attr:`None`, sum all elements of :attr:`x` and return a
            Tensor with a single element, otherwise must be in the
            range :math:`[-rank(x), rank(x))`. If :math:`axis[i] < 0`,
            the dimension to reduce is :math:`rank + axis[i]`.
        dtype (str|None, optional): The dtype of output Tensor. The default value is None, the dtype
            of output is the same as input Tensor `x`.
        keepdim (bool, optional): Whether to reserve the reduced dimension in the
            output Tensor. The result Tensor will have one fewer dimension
            than the :attr:`x` unless :attr:`keepdim` is true, default
            value is False.
        name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        Tensor: Results of summation operation on the specified axis of input Tensor `x`.
        if `x.dtype='bool'` or `x.dtype='int32'`, it's data type is `'int64'`,
        otherwise it's data type is the same as `x`.

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([[-2., 0.], [1., 2.]])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out1 = paddle.sparse.sum(sparse_x)
            >>> out1
            Tensor(shape=[1], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[0],
                values=1.)
            >>> out2 = paddle.sparse.sum(sparse_x, axis=0)
            >>> out2
            Tensor(shape=[1, 2], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0]],
                values=[[-1.,  2.]])
            >>> out3 = paddle.sparse.sum(sparse_x, axis=-1)
            >>> out3
            Tensor(shape=[2], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 1]],
                values=[-2.,  3.])
            >>> out4 = paddle.sparse.sum(sparse_x, axis=1, keepdim=True)
            >>> out4
            Tensor(shape=[2, 1], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 1]],
                values=[[-2.],
                        [ 3.]])
    FNT)r*   r,   r.   )in_dtype	out_dtyper   r/   float32float64int16int32int64
sparse_sumr*   r,   outtypeinputsoutputsattrs)r   r
   r   r9   updater,   r   r   intlisttupler=   r   r   )create_sparse_variable_for_type_inference	append_op)
r   r*   r,   r.   r   
dtype_flagr@   op_typehelperr;   s
             r   sumrJ      ss   v J
*511 ) D%999<DD6D'BB 	DLLagEBBCCC    	
 	
 	
 	&3eT$ZZBL	
 	
 	
 W%% 	BBBOOCCBBg C  C 	#qE3<u 	 	
 	
 	
 
r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise atan of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = atan(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.atan(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-1.10714877,  0.78539819])
    r   )r
   r   sparse_atanr   s     r   atanrM   4  r$   r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise sinh of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = sinh(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.sinh(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-3.62686038,  1.17520118])
    r   )r
   r   sparse_sinhr   s     r   sinhrP   W  r$   r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise asinh of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = asinh(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.asinh(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-1.44363546,  0.88137358])
    r   )r
   r   sparse_asinhr   s     r   asinhrS   z  :    : "##  F # q!!!r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise atanh of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = atanh(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.atanh(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[nan , inf.])
    r   )r
   r   sparse_atanhr   s     r   atanhrW     rT   r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise tanh of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = tanh(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.tanh(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-0.96402758,  0.76159418])
    r   )r
   r   sparse_tanhr   s     r   tanhrZ     r$   r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise square of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = square(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.square(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[4., 1.])
    r   )r
   r   sparse_squarer   s     r   squarer]     s:    : "##  F # """r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise sqrt of SparseTensor, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = sqrt(x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.sqrt(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[nan, 1. ])
    r   )r
   r   sparse_sqrtr   s     r   sqrtr`     r$   r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate the natural log of (1+x), requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = ln(1+x)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2, 0, 1], dtype='float32')
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.log1p(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[nan       , 0.69314718])
    r   )r
   r   sparse_log1pr   s     r   log1prc   )  rT   r   index_dtypevalue_dtypec                N   t                      s
J d            |r:t          |t          j        j        t          j        f          st          |          }|r:t          |t          j        j        t          j        f          st          |          }t          j        | ||          S )a?  
    cast non-zero-index of SparseTensor to `index_dtype`, non-zero-element of SparseTensor to
    `value_dtype` , requiring x to be a SparseCooTensor or SparseCsrTensor.

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        index_dtype (np.dtype|str, optional): Data type of the index of SparseCooTensor,
            or crows/cols of SparseCsrTensor. Can be uint8, int8, int16, int32, int64.
        value_dtype (np.dtype|str, optional): Data type of the value of SparseCooTensor,
            SparseCsrTensor. Can be bool, float16, float32, float64, int8, int32, int64, uint8.
        name (str|core.VarDesc.VarType|core.DataType|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2, 0, 1])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.cast(sparse_x, 'int32', 'float64')
            >>> out
            Tensor(shape=[3], dtype=paddle.float64, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-2.,  1.])
    r   )	r
   
isinstancer	   VarDescVarTypeDataTyper   r   sparse_cast)r   rd   re   r   s       r   castrl   L  s    F "##  F #  >:dl*DM:  > 1== >:dl*DM:  > 1==ak:::r   factorfloatc                v    t                      s
J d            t          j        | t          |                    S )a  
    Calculate elementwise pow of x, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = x^{factor}

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        factor (float|int): factor of pow.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2, 0, 3], dtype='float32')
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.pow(sparse_x, 2)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[4., 9.])
    r   )r
   r   
sparse_powrn   )r   rm   r   s      r   powrq   }  sB    < "##  F # Qf...r   c                `    t                      s
J d            t          j        | ddd          S )a  
    Calculate elementwise negative of x, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = -x

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2, 0, 3], dtype='float32')
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.neg(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[ 2., -3.])
    r   g              T)r
   r   sparse_scaler   s     r   negru     s@    : "##  F # q$T222r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise absolute value of x, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = |x|

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2, 0, 3], dtype='float32')
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.abs(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[2., 3.])
    r   )r
   r   
sparse_absr   s     r   absrx     r   r   c                Z    t                      s
J d            t          j        |           S )a  
    the coalesced operator include sorted and merge, after coalesced, the indices of x is sorted and unique.

    Parameters:
        x (Tensor): the input SparseCooTensor.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        Tensor: return the SparseCooTensor after coalesced.

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> indices = [[0, 0, 1], [1, 1, 2]]
            >>> values = [1.0, 2.0, 3.0]
            >>> sp_x = paddle.sparse.sparse_coo_tensor(indices, values)
            >>> sp_x = paddle.sparse.coalesce(sp_x)
            >>> print(sp_x.indices())
            Tensor(shape=[2, 2], dtype=int64, place=Place(cpu), stop_gradient=True,
            [[0, 1],
             [1, 2]])
            >>> print(sp_x.values())
            Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
            [3., 3.])
    r   )r
   r   sparse_coalescer   s     r   coalescer{     s:    : "##  F # !!$$$r   c                    t                      s
J d            | j        t          v r*t          j        | dt
          j        j        j                  } t          j	        | dt          j        z  dd          S )a  
    Convert each of the elements of input x from radian to degree,
    requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        rad2deg(x) = 180/ \pi * x

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, int32, int64.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([3.142, 0., -3.142])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.rad2deg(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[ 180.02334595, -180.02334595])
    r   N     f@rs   Tr
   r,   _int_dtype_r   rk   r	   rh   ri   FP32rt   nppir   s     r   rad2degr   
  so    < "##  F # 	w+q$(<(ABBq%"%-d;;;r   c                    t                      s
J d            | j        t          v r*t          j        | dt
          j        j        j                  } t          j	        | t          j        dz  dd          S )a  
    Convert each of the elements of input x from degree to radian,
    requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        deg2rad(x) = \pi * x / 180

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, int32, int64.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-180, 0, 180])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.deg2rad(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-3.14159274,  3.14159274])
    r   Nr}   rs   Tr~   r   s     r   deg2radr   0  so    < "##  F # 	w+q$(<(ABBq"%%-d;;;r   c                Z    t                      s
J d            t          j        |           S )a  
    Calculate elementwise `exp(x)-1` , requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = exp(x) - 1

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64, complex64, complex128.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same data type and shape as ``x`` .

    Examples:
        .. code-block:: python

            >>> import paddle

            >>> dense_x = paddle.to_tensor([-2., 0., 1.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.expm1(sparse_x)
            >>> out
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                indices=[[0, 2]],
                values=[-0.86466473,  1.71828187])
    r   )r
   r   sparse_expm1r   s     r   expm1r   V  rT   r   inputshaper   c                H   t                      rt          j        | |          S t          | dg dd           t	          |dt
          t          fd           d| i}d|i}t          d          }|                    | j	                  }|
                    d|d|i|           |S )a  
    Changes the shape of ``x`` without changing its value, requiring x to be a SparseCooTensor or SparseCsrTensor.
    Currently this function can only reshape the sparse dims of ``x`` , but ``shape`` argument must be specified
    as the shape of the reshaped tensor.

    Note that if x is a SparseCsrTensor, then len(shape) must be 2 or 3.

    There are some tricks when specifying the target shape.

        - 1. -1 means the value of this dimension is inferred from the total element number of x and remaining dimensions. Thus one and only one dimension can be set -1.

        - 2. 0 means the actual dimension value is going to be copied from the corresponding dimension of x. The indices of 0 in the target shape can not exceed the rank of x.

    Here are some examples to explain it.

        - 1. Given a 3-D tensor x with a shape [2, 4, 6], and the target shape is [6, 8], the reshape operator will transform x into a 2-D tensor with shape [6, 8] and leaving x's data unchanged.

        - 2. Given a 3-D tensor x with a shape [2, 4, 6], and the target shape is [2, 3, -1, 2], the reshape operator will transform x into a 4-D tensor with shape [2, 3, 4, 2] and leaving x's data unchanged. In this case, one dimension of the target shape is set to -1, the value of this dimension is inferred from the total element number of x and remaining dimensions.

        - 3. Given a 3-D tensor x with a shape [2, 4, 6], and the target shape is [-1, 0, 3, 2], the reshape operator will transform x into a 4-D tensor with shape [2, 4, 3, 2] and leaving x's data unchanged. In this case, besides -1, 0 means the actual dimension value is going to be copied from the corresponding dimension of x.

    .. note::
        Alias Support: The parameter name ``input`` can be used as an alias for ``x``.
        For example, ``reshape(input=tensor_x, ...)`` is equivalent to ``reshape(x=tensor_x, ...)``.

    Args:
        x (Tensor): The input sparse tensor with data type ``float32``, ``float64``, ``int32``, ``int64`` or ``bool``.
        shape (list|tuple): Define the target shape. At most one dimension of the target shape can be -1.
                        The data type is ``int32``.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        Tensor: A reshaped Tensor with the same data type as ``x``.

    Examples:
        .. code-block:: pycon

            >>> import paddle

            >>> x_shape = [6, 2, 3]
            >>> new_shape = [1, 0, 2, -1, 3]
            >>> format = "coo"

            >>> dense_x = paddle.randint(-100, 100, x_shape) * paddle.randint(0, 2, x_shape)

            >>> if format == "coo":
            ...     sp_x = dense_x.to_sparse_coo(len(x_shape))
            >>> else:
            ...     sp_x = dense_x.to_sparse_csr()
            >>> sp_out = paddle.sparse.reshape(sp_x, new_shape)

            >>> print(sp_out.shape)
            paddle.Size([1, 2, 2, 3, 3])

    r   )float16r4   r5   r6   r7   r8   r/   uint16reshaper   sparse_reshaper;   r<   )r
   r   r   r   r   rC   rD   r   rE   r,   rF   )r   r   r   r>   r@   rI   r;   s          r   r   r   y  s    t  $Q... 	 	 	 	
 	
 	
 	5'D%=)<<<q% -..>>qwGG!CL	 	 	
 	
 	
 
r   c                    t                      rt          j        |           S d}t          |          }|                    | j                  }|                    |d| id|ii            |S )a  

    Return whether every element of input tensor is `NaN` or not, requiring x to be a SparseCooTensor or SparseCsrTensor.

    Args:
        x (Tensor): The input tensor (SparseCooTensor or SparseCsrTensor), it's data type should be float16, float32, float64, int32, int64.
        name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        A Sparse Tensor with the same shape as ``x``,  the bool result which shows every element of `x` whether it is `NaN` or not.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> import numpy as np

            >>> format = "coo"
            >>> np_x = np.asarray([[[0., 0], [1., 2.]], [[0., 0], [3., float('nan')]]])
            >>> dense_x = paddle.to_tensor(np_x)

            >>> if format == "coo":
            ...     sparse_x = dense_x.to_sparse_coo(len(np_x.shape))
            >>> else:
            ...     sparse_x = dense_x.to_sparse_csr()
            ...
            >>> sparse_out = paddle.sparse.isnan(sparse_x)
            >>> print(sparse_out)
            Tensor(shape=[2, 2, 2], dtype=paddle.bool, place=Place(gpu:0), stop_gradient=True,
                   indices=[[0, 0, 1, 1],
                            [1, 1, 1, 1],
                            [0, 1, 0, 1]],
                   values=[False, False, False, True ])

    sparse_isnanr   r;   r<   )r
   r   r   r   rE   r,   rF   )r   r   rH   rI   r;   s        r   isnanr     s    H  	"1%%% W%%>>qwGG#qE3<r 	 	
 	
 	
 
r   axes)Sequence[int] | Sequence[Tensor] | Tensorstartsendsc                   t                      rt          j        | |||          S |||d}t          | dg dd           t	          |dt
          t          fd           t	          |dt
          t          fd           t	          |dt
          t          fd           d}t          |          }|                    | j	                  }|
                    |d| id	|i|
           |S )a  
    This operator produces a slice of ``x`` along multiple axes for sparse tensors.
    Slice uses ``axes``, ``starts`` and ``ends`` attributes to specify the start and
    end dimension for each axis in the list of axes and Slice uses this information
    to slice the input sparse tensor (x). If a negative value is passed to
    ``starts`` or ``ends`` such as :math:`-i`, it represents the reverse position of
    the axis :math:`i-1` (here 0 is the initial position).
    If the value passed to ``starts`` or ``ends`` is greater than the number of elements
    in the dimension (n), it represents n.
    For slicing to the end of a dimension with unknown size, it is recommended to pass
    in INT_MAX. The size of ``axes`` must be equal to ``starts`` and ``ends``.

    Args:
        x (Tensor): The input Tensor (``SparseCooTensor`` or ``SparseCsrTensor``), it's data type should be ``float16``, ``float32``, ``float64``, ``int32``, ``int64``.
        axes (list|tuple|Tensor): The data type is ``int32``.If ``axes`` is a list or tuple, the elements of
                it should be integers or a 0-D Tensor with shape []. If ``axes`` is a Tensor, it should be a 1-D Tensor.
                Axes that `starts` and `ends` apply to.
        starts (list|tuple|Tensor): The data type is ``int32``. If ``starts`` is a list or tuple, the elements of
                it should be integers or a 0-D Tensor with shape []. If ``starts`` is a Tensor, it should be a 1-D Tensor.
                It represents starting indices of corresponding axis in ``axes``.
        ends (list|tuple|Tensor): The data type is ``int32``. If ``ends`` is a list or tuple, the elements of
                it should be integers or a 0-D Tensor with shape []. If ``ends`` is a Tensor, it should be a 1-D Tensor.
                It represents ending indices of corresponding axis in ``axes``.

    Returns:
        A Sparse Tensor. The data type is same as ``x``.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> import numpy as np

            >>> format = 'coo'
            >>> np_x = np.asarray([[4, 0, 7, 0], [0, 0, 5, 0], [-4, 2, 0, 0]])
            >>> dense_x = paddle.to_tensor(np_x)
            >>> if format == 'coo':
            ...     sp_x = dense_x.to_sparse_coo(len(np_x.shape))
            >>> else:
            ...     sp_x = dense_x.to_sparse_csr()
            ...
            >>> axes = [0, 1]
            >>> starts = [1, 0]
            >>> ends = [3, -2]
            >>> sp_out = paddle.sparse.slice(sp_x, axes, starts, ends)
            >>> # sp_out is x[1:3, 0:-2]

            >>> print(sp_out)
            Tensor(shape=[2, 2], dtype=paddle.int64, place=Place(cpu), stop_gradient=True,
                   indices=[[1, 1],
                            [0, 1]],
                   values=[-4,  2])

    )r   r   r   r   r3   sparse_slicer   r   r   r:   r;   r<   )r
   r   r   r   r   rC   rD   r   rE   r,   rF   )	r   r   r   r   r   r@   rH   rI   r;   s	            r   slicer     s   z  "1dFD999>>    	
 	
 	
 	4$???68dE]NCCC4$??? W%%>>QW>MM#qE3<u 	 	
 	
 	
 
r   T   q
int | NonecenterniterrB   tuple[Tensor, Tensor, Tensor]c           	         d }d d fddfd	dfd		}t          j        |           st          d
t          |                      |                                 st          d          t           j                                        }|2|dk    s,t          |                    d          d                   dk     rt          d          | j	        dd         \  }}	|t          d||	          }n=|dk    r|t          ||	          k    s#t          d| dt          ||	                     |dk    st          d| d           ||           }
|s || ||d          S t          | j	                  dk    rt          d          t           j                            | d          }|                                |z  }t           j                            |                                ||j        |j                  }|                                d         }t          j        dt          |          f|j                  }||d<   t           j                            ||                                |	df|
| j                  }t          j        g | j	        dd         d||
          } t          j        |                                |                    } || |||          S )a"  
    Performs linear Principal Component Analysis (PCA) on a sparse matrix.

    Let :math:`X` be the input matrix or a batch of input matrices, the output should satisfies:

    .. math::
        X = U * diag(S) * V^{T}

    Args:
        x (Tensor): The input tensor. Its shape should be `[N, M]`,
            N and M can be arbitrary positive number.
            The data type of x should be float32 or float64.
        q (int|None, optional): a slightly overestimated rank of :math:`X`.
            Default value is :math:`q=min(6,N,M)`.
        center (bool, optional): if True, center the input tensor.
            Default value is True.
        name (str|None, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        - Tensor U, is N x q matrix.
        - Tensor S, is a vector with length q.
        - Tensor V, is M x q matrix.

        tuple (U, S, V): which is the nearly optimal approximation of a singular value decomposition of a centered matrix :math:`X`.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env:GPU)
            >>> import paddle
            >>> paddle.device.set_device('gpu')

            >>> format = "coo"
            >>> paddle.seed(2023)
            >>> dense_x = paddle.randn((5, 5), dtype='float64')

            >>> if format == "coo":
            ...     sparse_x = dense_x.to_sparse_coo(len(dense_x.shape))
            >>> else:
            ...     sparse_x = dense_x.to_sparse_csr()

            >>> print("sparse.pca_lowrank API only support CUDA 11.x")
            >>> # U, S, V = None, None, None
            >>> # use code blow when your device CUDA version >= 11.0
            >>> U, S, V = paddle.sparse.pca_lowrank(sparse_x)

            >>> print(U)
            Tensor(shape=[5, 5], dtype=float64, place=Place(gpu:0), stop_gradient=True,
                   [[-0.31412600,  0.44814876,  0.18390454, -0.19967630, -0.79170452],
                    [-0.31412600,  0.44814876,  0.18390454, -0.58579808,  0.56877700],
                    [-0.31412600,  0.44814876,  0.18390454,  0.78547437,  0.22292751],
                    [-0.38082462,  0.10982129, -0.91810233,  0.00000000,  0.00000000],
                    [ 0.74762770,  0.62082796, -0.23585052,  0.00000000, -0.00000000]])

            >>> print(S)
            Tensor(shape=[5], dtype=float64, place=Place(gpu:0), stop_gradient=True,
                   [1.56031096, 1.12956227, 0.27922715, 0.00000000, 0.00000000])

            >>> print(V)
            Tensor(shape=[5, 5], dtype=float64, place=Place(gpu:0), stop_gradient=True,
                   [[ 0.88568469, -0.29081908,  0.06163676,  0.19597228, -0.29796422],
                    [-0.26169364, -0.27616183,  0.43148760, -0.42522796, -0.69874939],
                    [ 0.28587685,  0.30695344, -0.47790836, -0.76982533, -0.05501437],
                    [-0.23958121, -0.62770647, -0.71141770,  0.11463224, -0.17125926],
                    [ 0.08918713, -0.59238761,  0.27478686, -0.41833534,  0.62498824]])
    c                v    | j         }|t          j        t          j        t          j        fv r|S t          j        S N)r,   paddler   r4   r5   )r   r,   s     r   get_floating_dtypez'pca_lowrank.<locals>.get_floating_dtype  s.    V^V^V^DDDL~r   c                V    |                                  r|                                 S | S r   )
is_complexconj)r   s    r   	conjugatezpca_lowrank.<locals>.conjugate  s$    <<>> 	6688Or   c                .   | j         }t          t          dt          |                              }g |d d         |d         |d         }|                                 r t
          j                            | |          S t          j        | |          S )Nr   )r   rC   rangelen	is_sparser   sparser)   )r   r   r%   s      r   r)   zpca_lowrank.<locals>.transpose  s    E!SZZ(())/crc/DH/d2h/;;== 	4=**1d3334(((r   c                ,      |                     S r    )r   r   r)   s    r   transjugatez pca_lowrank.<locals>.transjugate  s    y1&&&r   r   Nc                   |dn|}| j         dd          \  }}t          j        j        }t          j        ||f| j                  } |           } |          }	| |t          j                            | |                    d         }
t          |          D ]`} |t          j                            |	|
                    d         }
 |t          j                            | |
                    d         }
an |          } |t          j                            | |          t          j        ||          z
            d         }
t          |          D ]} |t          j                            |	|
          t          j        ||
          z
            d         }
 |t          j                            | |
          t          j        ||
          z
            d         }
|
S )Nr   r   r:   r   )	r   r   linalgqrrandnr,   r   matmulr   )r   r   r   Mmnr   RA_tA_HQiM_Hr   r   r)   s                r   get_approximate_basisz*pca_lowrank.<locals>.get_approximate_basis  s   ]wrss|1]L!Qqw///illinn96=''1--..q1A5\\ 6 6Bv}++C3344Q7Bv}++Aq1122156 +a..C6=''1--a0C0CCDDQGA5\\ L LBv}++C33fmC6K6KKLLQOBv}++Aq11FM!Q4G4GGHHKr      c                D   |dn|}| j         dd          \  }}|d }n |          } |           }||k     s||k    r) ||||          } |          }	|!t          j                            | |	          }
n6t          j                            | |	          t          j        ||	          z
  }
|
j         d         |k    sJ |
j         |f            |
j         d         |k    sJ |
j         |f            |
j         d         |
j         d         k    sJ |
j                     t          j                            |
d          \  }}} |          }|                    |          }n2 | |||          } |          }	|!t          j                            ||	          }n6t          j                            ||	          t          j        ||	          z
  } |          }
|
j         d         |k    sJ |
j         |f            |
j         d         |k    sJ |
j         |f            |
j         d         |
j         d         k    sJ |
j                     t          j                            |
d          \  }}} |          }|                    |          }|||fS )Nr   r   r   r   r   F)full_matrices)r   r   r   r   r   svd)r   r   r   r   r   r   M_tr   r   Q_cB_tUSVhVBr   r   r   r)   s                   r   svd_lowrankz pca_lowrank.<locals>.svd_lowrank  s   AAwrss|19CC)A,,Cillq55AEE%%c1ESAAAA)A,,Cym**1c22m**1c22V]1c5J5JJ9R=A%%%	1~%%%9R=A%%%	1~%%%9R=CIbM11139111}((E(BBHAq"BAAA%%a%1===A)A,,CyM((c22M((c22V]35L5LL)A,,C9R=A%%%	1~%%%9R=A%%%	1~%%%9R=CIbM11139111}((E(BBHAq"BAA!Qwr   zInput must be tensor, but got z#Input must be sparse, but got denseFalse.r      z-sparse.pca_lowrank API only support CUDA 11.xr   zq(=z>) must be non-negative integer and not greater than min(m, n)=zniter(=z) must be non-negative integerr   z,input is expected to be 2-dimensional tensor)r*   )r,   placer:      )r   N)r   r   N)r   	is_tensor
ValueErrorr=   r   versioncudarB   splitr   minr   r   rJ   valuessparse_coo_tensorindicesr,   r   zerosonesr   to_dense)r   r   r   r   r   r   r   cuda_versionr   r   r,   s_sums_valccolumn_indicesr   C_t	ones_m1_tr   r   r   r   r)   s                      @@@@r   pca_lowrankr   _  s   V    
) ) )' ' ' ' ' '       .% % % % % % % % %N A EC$q''CCDDD;;== @>???>&&((L7""|!!#&&q)**R//HIIIWRSS\FQy1aLL1ffc!Qii;! ; ;/21ayy; ;
 
 	
 QJJH5HHHIIIq!!E 6{1au5555
17||qGHHH Mab))ELLNNQE''ek 	( 	 	A YY[[^NlAs>223>;OPPPGGAJ
-
)
)aV5 *  C 1agcrcl1A1q1???I	&-	::;;A;q!5A....r   r   )r   r   r   r   r   r   )r   r   r%   r&   r   r   r   r   )NNFN)r   r   r*   r+   r,   r-   r.   r/   r   r   r   r   )NNN)
r   r   rd   r-   re   r-   r   r   r   r   )r   r   rm   rn   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )NTr   N)r   r   r   r   r   r/   r   rB   r   r   r   r   )>
__future__r   typingr   numpyr   r   r   paddle.base.data_feederr   r   paddle.base.frameworkr   r	   r
   paddle.common_ops_importr   paddle.frameworkr   paddle.utils.decorator_utilsr   collections.abcr   r   paddle._typingr   r   __all__rh   ri   UINT8INT8INT16INT32INT64BOOLr   r   r    r#   r)   rJ   rM   rP   rS   rW   rZ   r]   r`   rc   rl   rq   ru   rx   r{   r   r   r   r   r   r   r   r   r   r   <module>r      sk   # " " " " "                        H H H H H H H H         
 . - - - - - ( ( ( ( ( (       4((((((33333333
 	LLLLLL              F              F !  !  !  !  !H 8<', ', ', ', ',X (,"i i i i iX !  !  !  !  !F !  !  !  !  !F "  "  "  "  "F "  "  "  "  "F !  !  !  !  !F #  #  #  #  #F !  !  !  !  !F "  "  "  "  "J %)$(	.; .; .; .; .;b!/ !/ !/ !/ !/H 3  3  3  3  3F              F %  %  %  %  %F#< #< #< #< #<L#< #< #< #< #<L "  "  "  "  "F #w  X X X X ! Xv- - - - -j W W W W Wx P/ P/ P/ P/ P/ P/ P/r   