
    zjH                        d dl mZ d dlZd dlmZ d dlZd dl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 d	 d
ej                  ZdS )    )annotationsN)TYPE_CHECKING)	framework)distribution)Sequence)Never)Tensordtypec                       e Zd ZU dZded<   ded<   ded<   ded<   	 dd fdZedd            Zedd            Zedd            Z	g dfd dZ
g dfd dZd!dZd!dZd!dZd"dZd#dZ xZS )$Cauchyu'  Cauchy distribution is also called Cauchy–Lorentz distribution. It is a continuous probability distribution named after Augustin-Louis Cauchy and Hendrik Lorentz. It has a very wide range of applications in natural sciences.

    The Cauchy distribution has the probability density function (PDF):

    .. math::

        { f(x; loc, scale) = \frac{1}{\pi scale \left[1 + \left(\frac{x - loc}{ scale}\right)^2\right]} = { 1 \over \pi } \left[ {  scale \over (x - loc)^2 +  scale^2 } \right], }

    Args:
        loc (float|Tensor): Location of the peak of the distribution. The data type is float32 or float64.
        scale (float|Tensor): The half-width at half-maximum (HWHM). The data type is float32 or float64. Must be positive values.
        name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.distribution import Cauchy

            >>> # init Cauchy with float
            >>> rv = Cauchy(loc=0.1, scale=1.2)
            >>> print(rv.entropy())
            Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
                    2.71334577)

            >>> # init Cauchy with N-Dim tensor
            >>> rv = Cauchy(loc=paddle.to_tensor(0.1), scale=paddle.to_tensor([1.0, 2.0]))
            >>> print(rv.entropy())
            Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                    [2.53102422, 3.22417140])
    r	   locscaler
   strnameNfloat | Tensor
str | NonereturnNonec                4   ||nd| _         t          |t          j        t          j        t          j        j        f          st          dt          |                     t          |t          j        t          j        t          j        j        f          st          dt          |                     t          |t          j                  rt          j        d|          }t          |t          j                  rt          j        d|          }|j        |j        k    r$t          j        ||g          \  | _        | _        n||c| _        | _        | j        j        | _        t#                                          | j        j        d           d S )Nr   z5Expected type of loc is Real|Variable|Value, but got z7Expected type of scale is Real|Variable|Value, but got  )shape
fill_value)batch_shapeevent_shape)r   
isinstancenumbersRealr   VariablepaddlepirValue	TypeErrortypefullr   broadcast_tensorsr   r   r
   super__init__)selfr   r   r   	__class__s       j/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/distribution/cauchy.pyr'   zCauchy.__init__I   ss    !,DD(	',	 2FJ4DE
 
 	 SS		SS   GL)"4fj6FG
 
 	 W$u++WW   c7<(( 	8+B3777CeW\** 	<KbU;;;E9###)#;S%L#I#I DHdjj#& DHdjX^
TX^DDDDD    r   c                     t          d          )zMean of Cauchy distribution.z Cauchy distribution has no mean.
ValueErrorr(   s    r*   meanzCauchy.meanm   s     ;<<<r+   c                     t          d          )z Variance of Cauchy distribution.z$Cauchy distribution has no variance.r-   r/   s    r*   variancezCauchy.variancer   s     ?@@@r+   c                     t          d          )z*Standard Deviation of Cauchy distribution.z"Cauchy distribution has no stddev.r-   r/   s    r*   stddevzCauchy.stddevw   s     =>>>r+   r   Sequence[int]c                    ||n	| j         dz   }t          j                    5  |                     ||          cddd           S # 1 swxY w Y   dS )a  Sample from Cauchy distribution.

        Note:
            `sample` method has no grad, if you want so, please use `rsample` instead.

        Args:
            shape (Sequence[int], optional): Sample shape.
            name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

        Returns:
            Tensor: Sampled data with shape `sample_shape` + `batch_shape` + `event_shape`.

        Examples:

            .. code-block:: pycon

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> # init Cauchy with float
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.sample([10]).shape)
                paddle.Size([10])

                >>> # init Cauchy with 0-Dim tensor
                >>> rv = Cauchy(loc=paddle.full((), 0.1), scale=paddle.full((), 1.2))
                >>> print(rv.sample([10]).shape)
                paddle.Size([10])

                >>> # init Cauchy with N-Dim tensor
                >>> rv = Cauchy(
                ...     loc=paddle.to_tensor(0.1),
                ...     scale=paddle.to_tensor([1.0, 2.0]),
                ... )
                >>> print(rv.sample([10]).shape)
                paddle.Size([10, 2])

                >>> # sample 2-Dim data
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.sample([10, 2]).shape)
                paddle.Size([10, 2])

                >>> rv = Cauchy(
                ...     loc=paddle.to_tensor(0.1),
                ...     scale=paddle.to_tensor([1.0, 2.0]),
                ... )
                >>> print(rv.sample([10, 2]).shape)
                paddle.Size([10, 2, 2])
        N_sample)r   r   no_gradrsample)r(   r   r   s      r*   samplezCauchy.sample|   s    h 'ttdi).C^ 	- 	-<<t,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   AA	A	c                   ||n	| j         dz   }t          |t          j        t          j        t          j        j        t          t          f          st          dt          |                     t          |t                    r|nt          |          }|                     |          }| j                            |          }| j                            |          }t          j        || j                  }t          j        |t          j        |t          j        t          j        |dz
  z                      |          S )a  Sample from Cauchy distribution (reparameterized).

        Args:
            shape (Sequence[int], optional): Sample shape.
            name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.

        Returns:
            Tensor: Sampled data with shape `sample_shape` + `batch_shape` + `event_shape`.

        Examples:

            .. code-block:: pycon

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> # init Cauchy with float
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.rsample([10]).shape)
                paddle.Size([10])

                >>> # init Cauchy with 0-Dim tensor
                >>> rv = Cauchy(loc=paddle.full((), 0.1), scale=paddle.full((), 1.2))
                >>> print(rv.rsample([10]).shape)
                paddle.Size([10])

                >>> # init Cauchy with N-Dim tensor
                >>> rv = Cauchy(
                ...     loc=paddle.to_tensor(0.1),
                ...     scale=paddle.to_tensor([1.0, 2.0]),
                ... )
                >>> print(rv.rsample([10]).shape)
                paddle.Size([10, 2])

                >>> # sample 2-Dim data
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.rsample([10, 2]).shape)
                paddle.Size([10, 2])

                >>> rv = Cauchy(
                ...     loc=paddle.to_tensor(0.1),
                ...     scale=paddle.to_tensor([1.0, 2.0]),
                ... )
                >>> print(rv.rsample([10, 2]).shape)
                paddle.Size([10, 2, 2])
        N_rsamplez1Expected type of shape is Sequence[int], but got r
         ?r   )r   r   npndarrayr   r   r   r    r!   listtupler"   r#   _extend_shaper   expandr   randr
   addmultiplytanpi)r(   r   r   r   r   uniformss         r*   r9   zCauchy.rsample   s    b 'ttdi*.DZ+VZ-=tUK
 
 	 QDKKQQ   $E511CuU||""5))hooe$$
!!%((;uDJ777zOE6:bex#~.F#G#GHH
 
 
 	
r+   valuec                    | j         dz   }t          |t          j        t          j        j        f          st          dt          |                     | 	                    |          
                    |          S )a/  Probability density function(PDF) evaluated at value.

        .. math::

            { f(x; loc, scale) = \frac{1}{\pi scale \left[1 + \left(\frac{x - loc}{ scale}\right)^2\right]} = { 1 \over \pi } \left[ {  scale \over (x - loc)^2 +  scale^2 } \right], }

        Args:
            value (Tensor): Value to be evaluated.

        Returns:
            Tensor: PDF evaluated at value.

        Examples:

            .. code-block:: python

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> # init Cauchy with float
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.prob(paddle.to_tensor(1.5)))
                Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
                        0.11234467)

                >>> # broadcast to value
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.prob(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.11234467, 0.01444674])

                >>> # init Cauchy with N-Dim tensor
                >>> rv = Cauchy(loc=paddle.to_tensor([0.1, 0.1]), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.prob(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.10753712, 0.02195240])

                >>> # init Cauchy with N-Dim tensor with broadcast
                >>> rv = Cauchy(loc=paddle.to_tensor(0.1), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.prob(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.10753712, 0.02195240])
        _prob5Expected type of value is Variable or Value, but got r?   )r   r   r   r   r   r    r!   r"   r#   log_probexp)r(   rL   r   s      r*   probzCauchy.prob   sx    X y7"%)"4fj6F!GHH 	UUUU   }}U##''T'222r+   c                   | j         dz   }t          |t          j        t          j        j        f          st          dt          |                     | 	                    | j
        |          }t	          j        | j
        | j        |g          \  }}}t	          j        t	          j        t	          j        t	          j        ||          |                                                     t	          j        t	          j        |j        t)          j        t(          j                  | j                  |                                          |          S )a  Log of probability density function.

        Args:
            value (Tensor): Value to be evaluated.

        Returns:
            Tensor: Log of probability density evaluated at value.

        Examples:

            .. code-block:: python

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> # init Cauchy with float
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.log_prob(paddle.to_tensor(1.5)))
                Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
                        -2.18618369)

                >>> # broadcast to value
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.log_prob(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [-2.18618369, -4.23728657])

                >>> # init Cauchy with N-Dim tensor
                >>> rv = Cauchy(loc=paddle.to_tensor([0.1, 0.1]), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.log_prob(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [-2.22991920, -3.81887865])

                >>> # init Cauchy with N-Dim tensor with broadcast
                >>> rv = Cauchy(loc=paddle.to_tensor(0.1), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.log_prob(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [-2.22991920, -3.81887865])
        	_log_probrO   r=   r?   )r   r   r   r   r   r    r!   r"   r#   _check_values_dtype_in_probsr   r%   r   subtractsquaredividelog1prG   r$   r   r@   logrJ   r
   r(   rL   r   r   r   s        r*   rP   zCauchy.log_prob0  s$   P y;&%)"4fj6F!GHH 	UUUU   11$(EBB"4Xtz5)
 
UE fmFOE3,G,GOOPPegg JCIrvbe}}DJGGG		  	
 	
 	
 		
r+   c                   | j         dz   }t          |t          j        t          j        j        f          st          dt          |                     | 	                    | j
        |          }t	          j        | j
        | j        |g          \  }}}t	          j        t	          j        t	          j        ||          |          |          t           j        z  dz   S )a  Cumulative distribution function(CDF) evaluated at value.

        .. math::

            { \frac{1}{\pi} \arctan\left(\frac{x-loc}{ scale}\right)+\frac{1}{2}\! }

        Args:
            value (Tensor): Value to be evaluated.

        Returns:
            Tensor: CDF evaluated at value.

        Examples:

            .. code-block:: python

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> # init Cauchy with float
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.cdf(paddle.to_tensor(1.5)))
                Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
                        0.77443725)

                >>> # broadcast to value
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.cdf(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.77443725, 0.92502367])

                >>> # init Cauchy with N-Dim tensor
                >>> rv = Cauchy(loc=paddle.to_tensor([0.1, 0.1]), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.cdf(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.80256844, 0.87888104])

                >>> # init Cauchy with N-Dim tensor with broadcast
                >>> rv = Cauchy(loc=paddle.to_tensor(0.1), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.cdf(paddle.to_tensor([1.5, 5.1])))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.80256844, 0.87888104])
        _cdfrO   r?   r>   )r   r   r   r   r   r    r!   r"   r#   rU   r   r%   r   atanrX   rV   r@   rJ   r[   s        r*   cdfz
Cauchy.cdfo  s    X y6!%)"4fj6F!GHH 	UUUU   11$(EBB"4Xtz5)
 
UE
 KfoeS995AA   e 		
r+   c           	         | j         dz   }t          j        t          j        | j        j        t          j        dt          j        z            | j	                  | j
                                        |          S )a}  Entropy of Cauchy distribution.

        .. math::

            { \log(4\pi scale)\! }

        Returns:
            Tensor: Entropy of distribution.

        Examples:

            .. code-block:: python

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> # init Cauchy with float
                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> print(rv.entropy())
                Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
                        2.71334577)

                >>> # init Cauchy with N-Dim tensor
                >>> rv = Cauchy(loc=paddle.to_tensor(0.1), scale=paddle.to_tensor([1.0, 2.0]))
                >>> print(rv.entropy())
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [2.53102422, 3.22417140])

        _entropy   r=   r?   )r   r   rG   r$   r   r   r@   rZ   rJ   r
   r   )r(   r   s     r*   entropyzCauchy.entropy  se    < y:%zKq25y(9(9LLLJNN
 
 
 	
r+   otherc           	        | j         dz   }t          |t                    st          dt	          |                     | j        }|j        }| j        }|j        }t          j        t          j	        t          j        ||          d          t          j	        t          j
        ||          d                                                    }dt          j        ||          z                                  }t          j
        |||          S )u]  The KL-divergence between two Cauchy distributions.

        Note:
            [1] Frédéric Chyzak, Frank Nielsen, A closed-form formula for the Kullback-Leibler divergence between Cauchy distributions, 2019

        Args:
            other (Cauchy): instance of Cauchy.

        Returns:
            Tensor: kl-divergence between two Cauchy distributions.

        Examples:

            .. code-block:: python

                >>> import paddle
                >>> from paddle.distribution import Cauchy

                >>> rv = Cauchy(loc=0.1, scale=1.2)
                >>> rv_other = Cauchy(loc=paddle.to_tensor(1.2), scale=paddle.to_tensor([2.3, 3.4]))
                >>> print(rv.kl_divergence(rv_other))
                Tensor(shape=[2], dtype=float32, place=Place(cpu), stop_gradient=True,
                        [0.19819736, 0.31532931])
        _kl_divergencez*Expected type of other is Cauchy, but got    rb   r?   )r   r   r   r"   r#   r   r   r   rG   powrV   rZ   rH   )	r(   rd   r   a_locb_loca_scaleb_scalet1t2s	            r*   kl_divergencezCauchy.kl_divergence  s    2 y++%(( 	JT%[[JJ   	*+ZJvz'733Q77Jvue44a88
 
 #%% 	 &/'733388::r2D1111r+   )N)r   r   r   r   r   r   r   r   )r   r   )r   r5   r   r   r   r	   )rL   r	   r   r	   )r   r	   )rd   r   r   r	   )__name__
__module____qualname____doc____annotations__r'   propertyr0   r2   r4   r:   r9   rR   rP   r_   rc   ro   __classcell__)r)   s   @r*   r   r   "   s         B KKKMMMLLLIII  	"E "E "E "E "E "E "EH = = = X= A A A XA ? ? ? X?
 &(D6- 6- 6- 6- 6-r &(DE
 E
 E
 E
 E
N33 33 33 33j=
 =
 =
 =
~>
 >
 >
 >
@#
 #
 #
 #
J,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2r+   r   )
__future__r   r   typingr   numpyr@   r   paddle.baser   paddle.distributionr   collections.abcr   typing_extensionsr   r	   r
   Distributionr   r   r+   r*   <module>r      s    # " " " " "                   ! ! ! ! ! ! , , , , , , %((((((''''''$$$$$$$$^2 ^2 ^2 ^2 ^2\& ^2 ^2 ^2 ^2 ^2r+   