
    x-j                        d dl mZ d dlZd dlmZ d dlmZmZmZ erd dlm	Z	 d dl
mZ d dlmZ d dlmZ  G d	 d
ej                  ZddZdS )    )annotationsN)TYPE_CHECKING)distributionindependent	transform)Sequence)Tensor)Distribution)	Transformc                  Z     e Zd ZU dZded<   ded<   d fdZg fddZg fddZddZ xZ	S )TransformedDistributiona  
    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]
transformsreturnNonec                   t          |t          j                  s t          dt	          |           d          t          |t
          j                  s t          dt	          |           d          t          d |D                       st          d          t          j	        |          }|j
        |j        z   }|| _        || _        |s.t                                          |j
        |j                   d S t!          |j
        |j        z             |j        j        k     r-t'          d|j        j         dt!          |           d          |j        j        t!          |j                  k    r4t)          j        ||j        j        t!          |j                  z
            }|                    |j
        |j        z             }|j        j        t1          t!          |j                  |j        j        z
  d          z   }t                                          |d t!          |          |z
           |t!          |          |z
  d                     d S )	Nz1Expected type of 'base' is Distribution, but got .zGExpected type of 'transforms' is Sequence[Transform] or Chain, but got c              3  J   K   | ]}t          |t          j                  V  d S )N)
isinstancer   r   ).0ts     l/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/distribution/transformed_distribution.py	<genexpr>z3TransformedDistribution.__init__.<locals>.<genexpr>K   s/      JJ!:a!455JJJJJJ    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&   z TransformedDistribution.__init__@   sw    $ 9:: 	QDJJQQQ   *fo66 	mZ^_iZjZjmmm   JJzJJJJJ 	QOPPP(44%(88

% 	GGT-t/?@@@Ft$"2233em6NNNwAYwwehisetetwww   =#c$*:&;&;;;*em.T5E1F1FF D "//t//
 
 "'!;c !!EM$<<a?
 ?
 "
 	A#'((+AAA %&&)??AA		
 	
 	
 	
 	
r   shapeSequence[int]r	   c                x    | j                             |          }| j        D ]}|                    |          }|S )zSample from ``TransformedDistribution``.

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

        Returns:
            [Tensor]: The sample result.
        )r#   sampler$   forwardr/   r5   xr   s       r   r8   zTransformedDistribution.samplem   sA     Je$$! 	 	A		!AAr   c                x    | j                             |          }| j        D ]}|                    |          }|S )zReparameterized sample from ``TransformedDistribution``.

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

        Returns:
            [Tensor]: The sample result.
        )r#   rsampler$   r9   r:   s       r   r=   zTransformedDistribution.rsample{   sA     Ju%%! 	 	A		!AAr   valuec                   d}|}t          | j                  }t          | j                  D ]h}|                    |          }||j        j        |j        j        z
  z  }|t          |	                    |          ||j        j        z
            z
  }|}i|t          | j
                            |          |t          | j
        j                  z
            z  }|S )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/   r>   rD   yr)   r   r;   s          r   rD   z TransformedDistribution.log_prob   s     )**
$*++ 	 	A		!A!).1GGGJ.**1--zAI<P/P# # H AANJ""JTZ5K1L1L$L
 
 	
 r   )r   r
   r   r   r   r   )r5   r6   r   r	   )r>   r	   r   r	   )
__name__
__module____qualname____doc____annotations__r&   r8   r=   rD   __classcell__)r4   s   @r   r   r      s          > ####+
 +
 +
 +
 +
 +
Z -/      .0            r   r   r>   r	   nintr   c                t    |dk    r1|                      t          t          | d                              n| S )Nr   )sumlistrange)r>   rL   s     r   rB   rB      s3    ,-EE599T%A,,''(((u<r   )r>   r	   rL   rM   r   r	   )
__future__r   r   r   paddle.distributionr   r   r   collections.abcr   paddler	    paddle.distribution.distributionr
   paddle.distribution.transformr   r   rB    r   r   <module>rY      s    # " " " " "              D D D D D D D D D D 8((((((======777777B B B B Bl7 B B BJ= = = = = =r   