o
    ,h                     @   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
 d dlmZ d dlmZmZ d	gZG d
d	 d	e
ZdS )    )OptionalUnionN)Tensor)constraints)	Dirichlet)ExponentialFamily)broadcast_all)_Number_sizeBetac                	       s  e Zd ZdZejejdZejZdZ		d#de
eef de
eef dee ddf fd	d
Zd# fdd	ZedefddZedefddZedefddZd$dedefddZdd Zdd ZedefddZedefddZedeeef fdd Zd!d" Z  ZS )%r   ar  
    Beta distribution parameterized by :attr:`concentration1` and :attr:`concentration0`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> 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concentration0TNr   r   validate_argsreturnc                    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r   )
isinstancer	   torchtensorfloatr   stackr   
_dirichletsuper__init___batch_shape)selfr   r   r   concentration1_concentration0	__class__ S/var/www/html/scripts/venv/lib/python3.10/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!   meanG   s   z	Beta.meanc                 C   s   | j jd S N).r   )r   moder*   r    r    r!   r-   K      z	Beta.modec                 C   s*   | j | j }| j | j |d|d   S )N      )r   r   pow)r   totalr    r    r!   varianceO   s   zBeta.variancer    sample_shapec                 C   s   | j |ddS )Nr   r   )r   rsampleselect)r   r4   r    r    r!   r5   T   s   zBeta.rsamplec                 C   s0   | j r| | t|d| gd}| j|S )Ng      ?r   )r%   _validate_sampler   r   r   log_prob)r   valueheads_tailsr    r    r!   r8   W   s   
zBeta.log_probc                 C   s
   | j  S r)   )r   entropyr*   r    r    r!   r;   ]   s   
zBeta.entropyc                 C   &   | j jd }t|trt|gS |S r,   r   concentrationr   r	   r   r   r   resultr    r    r!   r   `      
zBeta.concentration1c                 C   r<   )N).r0   r=   r?   r    r    r!   r   h   rA   zBeta.concentration0c                 C   s   | j | jfS r)   r   r*   r    r    r!   _natural_paramsp   r.   zBeta._natural_paramsc                 C   s"   t |t | t ||  S r)   )r   lgamma)r   xyr    r    r!   _log_normalizert   s   "zBeta._log_normalizerr)   )r    )__name__
__module____qualname____doc__r   positivearg_constraintsunit_intervalsupporthas_rsampler   r   r   r   boolr   r$   propertyr+   r-   r3   r
   r5   r8   r;   r   r   tuplerB   rF   __classcell__r    r    r   r!   r      sD    

)typingr   r   r   r   torch.distributionsr   torch.distributions.dirichletr   torch.distributions.exp_familyr   torch.distributions.utilsr   torch.typesr	   r
   __all__r   r    r    r    r!   <module>   s   