U
    9%eU                     @   sb   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 dgZG dd de	ZdS )	    )NumberRealN)constraints)	Dirichlet)ExponentialFamily)broadcast_allBetac                       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 )!r   aq  
    Beta distribution parameterized by :attr:`concentration1` and :attr:`concentration0`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> 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                    sp   t |tr,t |tr,tt|t|g}nt||\}}t||gd}t||d| _t	 j
| jj|d d S )Nvalidate_args)
isinstancer   torchtensorfloatr   stackr   
_dirichletsuper__init__Z_batch_shape)selfr
   r   r   Zconcentration1_concentration0	__class__ W/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/distributions/beta.pyr   $   s"       zBeta.__init__c                    sD   |  t|}t|}| j||_tt|j|dd | j|_|S )NFr   )	Z_get_checked_instancer   r   Sizer   expandr   r   _validate_args)r   Zbatch_shapeZ	_instancenewr   r   r   r   5   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$   A   s    z	Beta.modec                 C   s*   | j | j }| j | j |d|d   S )N      )r
   r   pow)r   totalr   r   r   varianceE   s    zBeta.variancer   c                 C   s   | j |ddS )Nr   r   )r   rsampleselect)r   Zsample_shaper   r   r   r*   J   s    zBeta.rsamplec                 C   s0   | j r| | t|d| gd}| j|S )Ng      ?r   )r   Z_validate_sampler   r   r   log_prob)r   valueZheads_tailsr   r   r   r,   M   s    
zBeta.log_probc                 C   s
   | j  S r    )r   entropyr!   r   r   r   r.   S   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
   V   s    
zBeta.concentration1c                 C   s*   | j jd }t|tr"t|gS |S d S )N).r&   r/   r0   r   r   r   r   ^   s    
zBeta.concentration0c                 C   s   | j | jfS r    r	   r!   r   r   r   _natural_paramsf   s    zBeta._natural_paramsc                 C   s"   t |t | t ||  S r    )r   lgamma)r   xyr   r   r   _log_normalizerj   s    zBeta._log_normalizer)N)N)r   )__name__
__module____qualname____doc__r   ZpositiveZarg_constraintsZunit_intervalZsupportZhas_rsampler   r   propertyr"   r$   r)   r*   r,   r.   r
   r   r2   r6   __classcell__r   r   r   r   r      s0   






)numbersr   r   r   Ztorch.distributionsr   Ztorch.distributions.dirichletr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   __all__r   r   r   r   r   <module>   s   