o
    h                     @   sn   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 )
    N)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  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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___batch_shape)selfr   r   r   concentration1_concentration0	__class__ l/var/www/html/construction_image-detection-poc/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!   8   s   
zBeta.expandreturnc                 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+   D      z	Beta.modec                 C   s*   | j | j }| j | j |d|d   S )N      )r   r   pow)r   totalr   r   r   varianceH   s   zBeta.variancer   sample_shapec                 C   s   | j |ddS )Nr   r   )r   rsampleselect)r   r2   r   r   r   r3   M   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   r6   P   s   
zBeta.log_probc                 C   s
   | j  S r'   )r   entropyr(   r   r   r   r9   V   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   Y      
zBeta.concentration1c                 C   r:   )N).r.   r;   r=   r   r   r   r   a   r?   zBeta.concentration0c                 C   s   | j | jfS r'   r
   r(   r   r   r   _natural_paramsi   r,   zBeta._natural_paramsc                 C   s"   t |t | t ||  S r'   )r   lgamma)r   xyr   r   r   _log_normalizerm   s   "zBeta._log_normalizerr'   )r   )__name__
__module____qualname____doc__r   positivearg_constraintsunit_intervalsupporthas_rsampler   r!   propertyr   r)   r+   r1   r   r3   r6   r9   r   r   tupler@   rD   __classcell__r   r   r   r   r	      s2    )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   