
    Αi                        S SK Jr  S SKrS SKJr  S SKrS SKJr  S SKJ	r	  S SK
Jr  S SKJr  \(       a  S SKJr  S S	KJr   " S
 S\R"                  5      rSSS jjrg)    )annotationsN)TYPE_CHECKING)check_variable_and_dtype)LayerHelper)exponential_family)in_dynamic_or_pir_mode)Sequence)Tensorc                     ^  \ rS rSr% SrS\S'   SU 4S jjr\SS j5       r\SS j5       r	/ 4SS jjr
SS	 jrSS
 jrSS jr\SS j5       rSS jrSrU =r$ )	Dirichlet    a  
Dirichlet distribution with parameter "concentration".

The Dirichlet distribution is defined over the `(k-1)-simplex` using a
positive, length-k vector concentration(`k > 1`).
The Dirichlet is identically the Beta distribution when `k = 2`.

For independent and identically distributed continuous random variable
:math:`\boldsymbol X \in R_k` , and support
:math:`\boldsymbol X \in (0,1), ||\boldsymbol X|| = 1` ,
The probability density function (pdf) is

.. math::

    f(\boldsymbol X; \boldsymbol \alpha) = \frac{1}{B(\boldsymbol \alpha)} \prod_{i=1}^{k}x_i^{\alpha_i-1}

where :math:`\boldsymbol \alpha = {\alpha_1,...,\alpha_k}, k \ge 2` is
parameter, the normalizing constant is the multivariate beta function.

.. math::

    B(\boldsymbol \alpha) = \frac{\prod_{i=1}^{k} \Gamma(\alpha_i)}{\Gamma(\alpha_0)}

:math:`\alpha_0=\sum_{i=1}^{k} \alpha_i` is the sum of parameters,
:math:`\Gamma(\alpha)` is gamma function.

Args:
    concentration (Tensor): "Concentration" parameter of dirichlet
        distribution, also called :math:`\alpha`. When it's over one
        dimension, the last axis denotes the parameter of distribution,
        ``event_shape=concentration.shape[-1:]`` , axes other than last are
        consider batch dimensions with ``batch_shape=concentration.shape[:-1]`` .

Examples:

    .. code-block:: python

        >>> import paddle
        >>> dirichlet = paddle.distribution.Dirichlet(paddle.to_tensor([1., 2., 3.]))
        >>> print(dirichlet.entropy())
        Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
        -1.24434423)

        >>> print(dirichlet.prob(paddle.to_tensor([.3, .5, .6])))
        Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
        10.80000019)
r
   concentrationc                   > UR                  5       S:  d$  [        R                  " UR                  5      S:X  a  [	        S5      eXl        [        TU ]  UR                  S S UR                  SS  5        g )N   r   z:`concentration` parameter must be at least one dimensional)dimmathprodshape
ValueErrorr   super__init__)selfr   	__class__s     ]/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/distribution/dirichlet.pyr   Dirichlet.__init__S   sk    "dii0C0C&D&IL  +,,Sb1=3F3Frs3KL    c                P    U R                   U R                   R                  SSS9-  $ )zJMean of Dirichlet distribution.

Returns:
    Mean value of distribution.
r   Tkeepdim)r   sumr   s    r   meanDirichlet.mean]   s+     !!D$6$6$:$:2t$:$LLLr   c                    U R                   R                  SSS9nU R                   XR                   -
  -  UR                  S5      US-   -  -  $ )zRVariance of Dirichlet distribution.

Returns:
    Variance value of distribution.
r   Tr      r   )r   r!   pow)r   concentration0s     r   varianceDirichlet.variancef   sX     ++//D/A""n7I7I&IJq!^a%78
 	
r   c                    [        U[        5      (       a  UO
[        U5      n[        U R                  R	                  U R                  U5      5      5      $ )zvSample from dirichlet distribution.

Args:
    shape (Sequence[int], optional): Sample shape. Defaults to empty list.
)
isinstancetuple
_dirichletr   expand_extend_shape)r   r   s     r   sampleDirichlet.sampler   sB     $E511uU|$,,33D4F4Fu4MNOOr   c                L    [         R                  " U R                  U5      5      $ )zProbability density function(PDF) evaluated at value.

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

Returns:
    PDF evaluated at value.
)paddleexplog_probr   values     r   probDirichlet.prob{   s     zz$--.//r   c                ,   [         R                  " U5      U R                  S-
  -  R                  S5      [         R                  " U R                  R                  S5      5      -   [         R                  " U R                  5      R                  S5      -
  $ )zWLog of probability density function.

Args:
    value (Tensor): Value to be evaluated.
      ?r   )r4   logr   r!   lgammar7   s     r   r6   Dirichlet.log_prob   st     ZZ$"4"4s":;@@DmmD..222678mmD../33B78	
r   c                   U R                   R                  S5      nU R                   R                  S   n[        R                  " U R                   5      R                  S5      [        R                  " U5      -
  X!-
  [        R
                  " U5      -  -
  U R                   S-
  [        R
                  " U R                   5      -  R                  S5      -
  $ )zJEntropy of Dirichlet distribution.

Returns:
    Entropy of distribution.
r   r<   )r   r!   r   r4   r>   digamma)r   r(   ks      r   entropyDirichlet.entropy   s     ++//3$$R(MM$,,-11"5mmN+,!V^^N%CCD ##c)V^^D<N<N-OOc"g	
r   c                    U R                   4$ Nr   r"   s    r   _natural_parametersDirichlet._natural_parameters   s    ""$$r   c                    UR                  5       R                  S5      [        R                   " UR                  S5      5      -
  $ )Nr   )r>   r!   r4   )r   xs     r   _log_normalizerDirichlet._log_normalizer   s-    xxz~~b!FMM!%%)$<<<r   rG   )r   r
   returnNone)rN   r
   )r   zSequence[int]rN   r
   )r8   r
   rN   r
   )rN   ztuple[Tensor])rK   r
   rN   r
   )__name__
__module____qualname____firstlineno____doc____annotations__r   propertyr#   r)   r1   r9   r6   rC   rH   rL   __static_attributes____classcell__)r   s   @r   r   r       sy    .` M M M 	
 	
 -/ P	0


" % %= =r   r   c                   [        5       (       a  [        R                  R                  U 5      $ Sn[	        U S/ SQU5        [        U40 [        5       D6nUR                  U R                  S9nUR                  USU 0SU00 S9  U$ )N	dirichletr   )float16float32float64uint16)dtypeAlphaOut)typeinputsoutputsattrs)
r   r4   _C_opsrZ   r   r   locals"create_variable_for_type_inferencer_   	append_op)r   nameop_typehelperouts        r   r.   r.      s    }}&&}55 7		
 W1177%% 8 
 	]+CL	 	 	
 
r   rF   )r   r
   rj   z
str | NonerN   r
   )
__future__r   r   typingr   r4   paddle.base.data_feederr   paddle.base.layer_helperr   paddle.distributionr   paddle.frameworkr   collections.abcr	   r
   ExponentialFamilyr   r.    r   r   <module>rw      sC    #     < 0 2 3(H="44 H=Vr   