a
    MSic                     @   s\   d dl mZ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 G dd de	ZdS )	    )RealNumberN)constraints)	Dirichlet)ExponentialFamily)broadcast_allc                       s   e Zd ZdZejejdZejZdZ	d fdd	Z
d fdd	Zed	d
 Zedd Zedd Zd ddZdd Zdd Zedd Zedd Zedd Zdd Z  ZS )!Betaa8  
    Beta distribution parameterized by :attr:`concentration1` and :attr:`concentration0`.

    Example::

        >>> m = Beta(torch.tensor([0.5]), torch.tensor([0.5]))
        >>> m.sample()  # Beta distributed with concentration concentration1 and concentration0
        tensor([ 0.1046])

    Args:
        concentration1 (float or Tensor): 1st concentration parameter of the distribution
            (often referred to as alpha)
        concentration0 (float or Tensor): 2nd concentration parameter of the distribution
            (often referred to as beta)
    concentration1concentration0TNc                    st   t |tr,t |tr,tt|t|g}nt||\}}t||gd}t||d| _t	t
| j| jj|d d S )Nvalidate_args)
isinstancer   torchtensorfloatr   stackr   
_dirichletsuperr   __init___batch_shape)selfr
   r   r   Zconcentration1_concentration0	__class__ T/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/distributions/beta.pyr      s    zBeta.__init__c                    sD   |  t|}t|}| j||_tt|j|dd | j|_|S )NFr   )	_get_checked_instancer   r   Sizer   expandr   r   _validate_args)r   batch_shape	_instancenewr   r   r   r   '   s    
zBeta.expandc                 C   s   | j | j | j  S Nr	   r   r   r   r   mean/   s    z	Beta.meanc                 C   s   | j jd S N).r   )r   moder%   r   r   r   r(   3   s    z	Beta.modec                 C   s*   | j | j }| j | j |d|d   S )N      )r
   r   pow)r   totalr   r   r   variance7   s    
zBeta.variancer   c                 C   s   | j |ddS )Nr   r   )r   rsampleselect)r   sample_shaper   r   r   r.   =   s    zBeta.rsamplec                 C   s0   | j r| | t|d| gd}| j|S )Ng      ?r   )r    _validate_sampler   r   r   log_prob)r   valueZheads_tailsr   r   r   r2   @   s    
zBeta.log_probc                 C   s
   | j  S r$   )r   entropyr%   r   r   r   r4   F   s    zBeta.entropyc                 C   s*   | j jd }t|tr"t|gS |S d S r'   r   Zconcentrationr   r   r   r   r   resultr   r   r   r
   I   s    
zBeta.concentration1c                 C   s*   | j jd }t|tr"t|gS |S d S )N).r*   r5   r6   r   r   r   r   Q   s    
zBeta.concentration0c                 C   s   | j | jfS r$   r	   r%   r   r   r   _natural_paramsY   s    zBeta._natural_paramsc                 C   s"   t |t | t ||  S r$   )r   lgamma)r   xyr   r   r   _log_normalizer]   s    zBeta._log_normalizer)N)N)r   )__name__
__module____qualname____doc__r   positivearg_constraintsunit_intervalsupporthas_rsampler   r   propertyr&   r(   r-   r.   r2   r4   r
   r   r8   r<   __classcell__r   r   r   r   r   
   s,   	






r   )numbersr   r   r   Ztorch.distributionsr   Ztorch.distributions.dirichletr   torch.distributions.exp_familyr   torch.distributions.utilsr   r   r   r   r   r   <module>   s   