o
    #j                     @   s`   g Z d dlmZmZ d dlmZ d dlmZ dddZddd	Z	edd
dZ
edddZdS )    )_C_opsin_dynamic_mode)dygraph_only)LayerHelperNc                 C   sF   t  rt| S d}t|}|| j}|j|d| id|ii d |S )a  
    sparse relu activation, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        out = max(x, 0)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        name (str, 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.nn.functional.relu(sparse_x)
            >>> print(out)
            Tensor(shape=[3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                   indices=[[0, 2]],
                   values=[0., 1.])
    sparse_reluxouttypeZinputsZoutputsattrs)r   r   r   r   )create_sparse_variable_for_type_inferencedtype	append_op)r   nameop_typehelperr    r   g/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/sparse/nn/functional/activation.pyrelu   s   
r   c                 C   sL   t  r	t| |S d}t|}|| j}|j|d| id|id|id |S )a
  
    sparse softmax activation, requiring x to be a SparseCooTensor or SparseCsrTensor.

    Note:
        Only support axis=-1 for SparseCsrTensor, which is faster when read data
        by row (axis=-1).

    From the point of view of dense matrix, for each row :math:`i` and each column :math:`j`
    in the matrix, we have:

    .. math::

        softmax_ij = \frac{\exp(x_ij - max_j(x_ij))}{\sum_j(exp(x_ij - max_j(x_ij))}

    Parameters:
        x (Tensor): The input tensor. It can be SparseCooTensor/SparseCsrTensor. The data type can be float32 or float64.
        axis (int, optional): The axis along which to perform softmax calculations. Only support -1 for SparseCsrTensor.
        name (str, optional): Name for the operation (optional, default is None).
            For more information, please refer to :ref:`api_guide_Name`.

    Returns:
        Tensor: SparseCoo or SparseCsr, whose layout is the same with `x` .

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> paddle.seed(100)

            >>> mask = paddle.rand((3, 4)) < 0.5
            >>> x = paddle.rand((3, 4)) * mask
            >>> print(x)
            Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
            [[0.        , 0.95717543, 0.43864486, 0.        ],
             [0.84765935, 0.45680618, 0.39412445, 0.        ],
             [0.59444654, 0.        , 0.78364515, 0.        ]])

            >>> csr = x.to_sparse_csr()
            >>> print(csr)
            Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                   crows=[0, 2, 5, 7],
                   cols=[1, 2, 0, 1, 2, 0, 2],
                   values=[0.95717543, 0.43864486, 0.84765935, 0.45680618, 0.39412445,
                           0.59444654, 0.78364515])

            >>> out = paddle.sparse.nn.functional.softmax(csr)
            >>> print(out)
            Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                   crows=[0, 2, 5, 7],
                   cols=[1, 2, 0, 1, 2, 0, 2],
                   values=[0.62680405, 0.37319586, 0.43255258, 0.29261294, 0.27483448,
                           0.45284089, 0.54715902])

            >>> coo = x.to_sparse_coo(sparse_dim=2)
            >>> print(coo)
            Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                   indices=[[0, 0, 1, 1, 1, 2, 2],
                            [1, 2, 0, 1, 2, 0, 2]],
                   values=[0.95717543, 0.43864486, 0.84765935, 0.45680618, 0.39412445,
                           0.59444654, 0.78364515])

            >>> out = paddle.sparse.nn.functional.softmax(coo)
            >>> print(out)
            Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
                   indices=[[0, 0, 1, 1, 1, 2, 2],
                            [1, 2, 0, 1, 2, 0, 2]],
                   values=[0.62680405, 0.37319589, 0.43255258, 0.29261294, 0.27483445,
                           0.45284092, 0.54715902])
    sparse_softmaxr   r   axisr	   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   softmax?   s   Fr   c                 C   s
   t | S )a  
    sparse relu6 activation, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::

        relu6(x) = min(max(0, x), 6)

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        name (str, 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., 8.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.nn.functional.relu6(sparse_x)
    )r   Zsparse_relu6)r   r   r   r   r   relu6   s   
r   {Gz?c                 C   s   t | |S )a  
    sparse leaky_relu activation, requiring x to be a SparseCooTensor or SparseCsrTensor.

    .. math::
        leaky\_relu(x)=
        \left\{
            \begin{array}{rcl}
                x, & & if \ x >= 0 \\
                negative\_slope * x, & & otherwise \\
            \end{array}
        \right.

    Parameters:
        x (Tensor): The input Sparse Tensor with data type float32, float64.
        negative_slope (float, optional): Slope of the activation function at
            :math:`x < 0` . Default is 0.01.
        name (str, 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., 5.])
            >>> sparse_x = dense_x.to_sparse_coo(1)
            >>> out = paddle.sparse.nn.functional.leaky_relu(sparse_x, 0.5)
    )r   Zsparse_leaky_relu)r   Znegative_sloper   r   r   r   
leaky_relu   s   !r   )N)r   N)r   N)__all__Zpaddler   r   Zpaddle.base.frameworkr   Zpaddle.base.layer_helperr   r   r   r   r   r   r   r   r   <module>   s   

)U