
    zjw                       U d dl mZ d dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
 erd dlmZ d dlmZ d dlZd dlmZ d d	lmZ d d
lmZ d dlmZ eeef         Zded<   eej        ej        ej        ej        f         Zded<   eeee         ee         ej         e         ef         Z!ded<   eeee         ee         ej         eej        ej        f                  ef         Z"ded<    G d de
          Z#dS )    )annotations)TYPE_CHECKINGN)Normal)ExpTransform)TransformedDistribution)Sequence)Union)	TypeAlias)Tensor)NestedSequencer
   _LognormalLocBase_LognormalLocNDArray_LognormalLoc_LognormalScalec                       e Zd ZU dZded<   ded<   d fd	Zedd
            Zedd            ZddZ	ddZ
ddZ xZS )	LogNormala  The LogNormal distribution with location `loc` and `scale` parameters.

    .. math::

        X \sim Normal(\mu, \sigma)

        Y = exp(X) \sim LogNormal(\mu, \sigma)


    Due to LogNormal distribution is based on the transformation of Normal distribution, we call that :math:`Normal(\mu, \sigma)` is the underlying distribution of :math:`LogNormal(\mu, \sigma)`

    Mathematical details

    The probability density function (pdf) is

    .. math::
        pdf(x; \mu, \sigma) = \frac{1}{\sigma x \sqrt{2\pi}}e^{(-\frac{(ln(x) - \mu)^2}{2\sigma^2})}

    In the above equation:

    * :math:`loc = \mu`: is the means of the underlying Normal distribution.
    * :math:`scale = \sigma`: is the stddevs of the underlying Normal distribution.

    Args:
        loc(int|float|complex|list|tuple|numpy.ndarray|Tensor): The means of the underlying Normal distribution.The data type is float32, float64, complex64 and complex128.
        scale(int|float|list|tuple|numpy.ndarray|Tensor): The stddevs of the underlying Normal distribution.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.distribution import LogNormal

            >>> # Define a single scalar LogNormal distribution.
            >>> dist = LogNormal(loc=0., scale=3.)
            >>> # Define a batch of two scalar valued LogNormals.
            >>> # The underlying Normal of first has mean 1 and standard deviation 11, the underlying Normal of second 2 and 22.
            >>> dist = LogNormal(loc=[1., 2.], scale=[11., 22.])
            >>> # Get 3 samples, returning a 3 x 2 tensor.
            >>> dist.sample((3, ))

            >>> # Define a batch of two scalar valued LogNormals.
            >>> # Their underlying Normal have mean 1, but different standard deviations.
            >>> dist = LogNormal(loc=1., scale=[11., 22.])

            >>> # Complete example
            >>> value_tensor = paddle.to_tensor([0.8], dtype="float32")

            >>> lognormal_a = LogNormal([0.], [1.])
            >>> lognormal_b = LogNormal([0.5], [2.])
            >>> sample = lognormal_a.sample((2, ))
            >>> # a random tensor created by lognormal distribution with shape: [2, 1]
            >>> entropy = lognormal_a.entropy()
            >>> print(entropy)
            Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
                [1.41893852])
            >>> lp = lognormal_a.log_prob(value_tensor)
            >>> print(lp)
            Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
                [-0.72069150])
            >>> p = lognormal_a.probs(value_tensor)
            >>> print(p)
            Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
                [0.48641577])
            >>> kl = lognormal_a.kl_divergence(lognormal_b)
            >>> print(kl)
            Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
                [0.34939718])
    r   locscaler   r   returnNonec                    t          ||          | _        | j        j        | _        | j        j        | _        t	                                          | j        t                      g           d S )N)r   r   )r   _baser   r   super__init__r   )selfr   r   	__class__s      m/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/distribution/lognormal.pyr   zLogNormal.__init__   sW    5111
:>Z%
lnn%566666    c                ^    t          j        | j        j        | j        j        dz  z             S )zZMean of lognormal distribution.

        Returns:
            Tensor: mean value.
           )paddleexpr   meanvariancer   s    r   r#   zLogNormal.mean   s'     z$*/DJ,?!,CCDDDr   c                    t          j        | j        j                  t          j        d| j        j        z  | j        j        z             z  S )zbVariance of lognormal distribution.

        Returns:
            Tensor: variance value.
        r    )r!   expm1r   r$   r"   r#   r%   s    r   r$   zLogNormal.variance   sD     |DJ/006:
$*"554
 4
 
 	
r   c                N    | j                                         | j         j        z   S )a  Shannon entropy in nats.

        The entropy is

        .. math::

            entropy(\sigma) = 0.5 \log (2 \pi e \sigma^2) + \mu

        In the above equation:

        * :math:`loc = \mu`: is the mean of the underlying Normal distribution.
        * :math:`scale = \sigma`: is the stddevs of the underlying Normal distribution.

        Returns:
          Tensor: Shannon entropy of lognormal distribution.

        )r   entropyr#   r%   s    r   r)   zLogNormal.entropy   s!    $ z!!##djo55r   valuec                P    t          j        |                     |                    S )zProbability density/mass function.

        Args:
          value (Tensor): The input tensor.

        Returns:
          Tensor: probability.The data type is same with :attr:`value` .

        )r!   r"   log_prob)r   r*   s     r   probszLogNormal.probs   s      z$--..///r   otherc                @    | j                             |j                   S )a
  The KL-divergence between two lognormal distributions.

        The probability density function (pdf) is

        .. math::

            KL\_divergence(\mu_0, \sigma_0; \mu_1, \sigma_1) = 0.5 (ratio^2 + (\frac{diff}{\sigma_1})^2 - 1 - 2 \ln {ratio})

        .. math::

            ratio = \frac{\sigma_0}{\sigma_1}

        .. math::

            diff = \mu_1 - \mu_0

        In the above equation:

        * :math:`loc = \mu_0`: is the means of current underlying Normal distribution.
        * :math:`scale = \sigma_0`: is the stddevs of current underlying Normal distribution.
        * :math:`loc = \mu_1`: is the means of other underlying Normal distribution.
        * :math:`scale = \sigma_1`: is the stddevs of other underlying Normal distribution.
        * :math:`ratio`: is the ratio of scales.
        * :math:`diff`: is the difference between means.

        Args:
            other (LogNormal): instance of LogNormal.

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

        )r   kl_divergence)r   r.   s     r   r0   zLogNormal.kl_divergence   s    B z''444r   )r   r   r   r   r   r   )r   r   )r*   r   r   r   )r.   r   r   r   )__name__
__module____qualname____doc____annotations__r   propertyr#   r$   r)   r-   r0   __classcell__)r   s   @r   r   r   6   s         D DL KKKMMM7 7 7 7 7 7 E E E XE 
 
 
 X
6 6 6 6(
0 
0 
0 
0!5 !5 !5 !5 !5 !5 !5 !5r   r   )$
__future__r   typingr   r!   paddle.distribution.normalr   paddle.distribution.transformr   ,paddle.distribution.transformed_distributionr   collections.abcr   r	   numpynpnumpy.typingnpttyping_extensionsr
   r   paddle._typingr   floatcomplexr   r5   float32float64	complex64
complex128r   NDArrayr   r   r    r   r   <module>rL      s   # " " " " " "              - - - - - - 6 6 6 6 6 6 P P P P P P ((((((++++++------#(#88888&+

BJbm;'      %"#()()		 M     "'uE"*bj012		"O    e5 e5 e5 e5 e5' e5 e5 e5 e5 e5r   