
    Αi                        S SK Jr  S SKrS SKJr  S SKJrJrJr  \(       a  S SKJ	r	  S SK
Jr  S SKJr  S SKJr   " S	 S
\R                  5      rSS jrg)    )annotationsN)TYPE_CHECKING)distributionindependent	transform)Sequence)Tensor)Distribution)	Transformc                  |   ^  \ rS rSr% SrS\S'   S\S'         SU 4S jjr/ 4SS jjr/ 4SS	 jjrSS
 jr	Sr
U =r$ )TransformedDistribution   a7  
Applies a sequence of Transforms to a base distribution.

Args:
    base (Distribution): The base distribution.
    transforms (Sequence[Transform]): A sequence of ``Transform`` .

Examples:

    .. code-block:: python

        >>> import paddle
        >>> paddle.seed(2023)
        >>> from paddle.distribution import transformed_distribution

        >>> d = transformed_distribution.TransformedDistribution(
        ...     paddle.distribution.Normal(0., 1.),
        ...     [paddle.distribution.AffineTransform(paddle.to_tensor(1.), paddle.to_tensor(2.))]
        ... )

        >>> # doctest: +SKIP('random sample')
        >>> print(d.sample([10]))
        Tensor(shape=[10], dtype=float32, place=Place(cpu), stop_gradient=True,
            [ 3.22699189,  1.12264419,  0.50283587,  1.83812487, -2.00740123,
            -2.70338631,  1.26663208,  4.47909021, -0.11529565,  4.32719326])
        >>> print(d.log_prob(paddle.to_tensor(0.5)))
        Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
            -1.64333570)
        >>> # doctest: -SKIP
r
   baseSequence[Transform]
transformsc                  > [        U[        R                  5      (       d  [        S[	        U5       S35      e[        U[
        R                  5      (       d  [        S[	        U5       S35      e[        S U 5       5      (       d  [        S5      e[        R                  " U5      nUR                  UR                  -   nXl        X l        U(       d%  [        TU ]=  UR                  UR                  5        g [!        UR                  UR                  -   5      UR"                  R$                  :  a/  ['        SUR"                  R$                   S[!        U5       S35      eUR"                  R$                  [!        UR                  5      :  a@  [(        R*                  " XR"                  R$                  [!        UR                  5      -
  5      nUR-                  UR                  UR                  -   5      nUR.                  R$                  [1        [!        UR                  5      UR"                  R$                  -
  S5      -   n[        TU ]=  US [!        U5      U-
   U[!        U5      U-
  S  5        g )	Nz1Expected type of 'base' is Distribution, but got .zGExpected type of 'transforms' is Sequence[Transform] or Chain, but got c              3  V   #    U  H  n[        U[        R                  5      v   M!     g 7f)N)
isinstancer   r   ).0ts     l/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/distribution/transformed_distribution.py	<genexpr>3TransformedDistribution.__init__.<locals>.<genexpr>K   s      Jz!:a!4!455zs   ')z1All element of transforms must be Transform type.z.'base' needs to have shape with size at least z
, bug got r   )r   r   r
   	TypeErrortypetypingr   allr   ChainTransformbatch_shapeevent_shape_base_transformssuper__init__len_domain
event_rank
ValueErrorr   Independentforward_shape	_codomainmax)selfr   r   chain
base_shapetransformed_shapetransformed_event_rank	__class__s          r   r%    TransformedDistribution.__init__@   s+    $ 9 9::CDJ<qQ  *foo66YZ^_iZjYkklm  JzJJJOPP((4%%(8(88

%GT--t/?/?@t$"2"223emm6N6NN@AYAY@ZZdehisetduuvw  ==##c$*:*:&;;**mm..T5E5E1FFD "//t///
 "'!;!;c  !EMM$<$<<a?
 "
 	A#'(+AA %&)??A		
    c                    U R                   R                  U5      nU R                   H  nUR                  U5      nM     U$ )zSample from ``TransformedDistribution``.

Args:
    shape (Sequence[int], optional): The sample shape. Defaults to [].

Returns:
    [Tensor]: The sample result.
)r"   sampler#   forwardr.   shapexr   s       r   r7   TransformedDistribution.samplem   s:     JJe$!!A		!A "r5   c                    U R                   R                  U5      nU R                   H  nUR                  U5      nM     U$ )zReparameterized sample from ``TransformedDistribution``.

Args:
    shape (Sequence[int], optional): The sample shape. Defaults to [].

Returns:
    [Tensor]: The sample result.
)r"   rsampler#   r8   r9   s       r   r>   TransformedDistribution.rsample{   s:     JJu%!!A		!A "r5   c                   SnUn[        U R                  5      n[        U R                  5       Hy  nUR	                  U5      nXER
                  R                  UR                  R                  -
  -  nU[        UR                  U5      XER
                  R                  -
  5      -
  nUnM{     U[        U R                  R                  U5      U[        U R                  R                  5      -
  5      -  nU$ )zThe log probability evaluated at value.

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

Returns:
    Tensor: The log probability.
g        )r&   r!   reversedr#   inverser'   r(   r,   _sum_rightmostforward_log_det_jacobianr"   log_prob)r.   valuerE   yr(   r   r;   s          r   rE    TransformedDistribution.log_prob   s     ))*
$**+A		!A))..1G1GGGJ.**1-zII<P<P/P# H A , 	NJJ"JTZZ5K5K1L$L
 	
 r5   )r"   r#   )r   r
   r   r   returnNone)r:   zSequence[int]rI   r	   )rF   r	   rI   r	   )__name__
__module____qualname____firstlineno____doc____annotations__r%   r7   r>   rE   __static_attributes____classcell__)r3   s   @r   r   r      sR    > ##+
 +
.A+
	+
Z -/  .0  r5   r   c                \    US:  a%  U R                  [        [        U* S5      5      5      $ U $ )Nr   )sumlistrange)rF   ns     r   rC   rC      s)    ,-E599T%A,'(<u<r5   )rF   r	   rW   intrI   r	   )
__future__r   r   r   paddle.distributionr   r   r   collections.abcr   paddler	    paddle.distribution.distributionr
   paddle.distribution.transformr   r   rC    r5   r   <module>r`      s?    #    D D(=7Bl77 BJ=r5   