o
    h                     @   sj   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	m
Z
 dgZdd	 ZG d
d deZdS )    N)Tensor)constraints)ExponentialFamily)broadcast_all)_Number_sizeGammac                 C   s
   t | S N)torch_standard_gamma)concentration r   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torch/distributions/gamma.pyr      s   
r   c                       s   e Zd ZdZejejdZejZdZ	dZ
edefddZedefdd	Zedefd
dZd fdd	Zd fdd	Ze fdedefddZdd Zdd Zedeeef fddZdd Zdd Z  ZS )r   aS  
    Creates a Gamma distribution parameterized by shape :attr:`concentration` and :attr:`rate`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> m = Gamma(torch.tensor([1.0]), torch.tensor([1.0]))
        >>> m.sample()  # Gamma distributed with concentration=1 and rate=1
        tensor([ 0.1046])

    Args:
        concentration (float or Tensor): shape parameter of the distribution
            (often referred to as alpha)
        rate (float or Tensor): rate parameter of the distribution
            (often referred to as beta), rate = 1 / scale
    r   rateTr   returnc                 C   s   | j | j S r	   r   selfr   r   r   mean+   s   z
Gamma.meanc                 C   s   | j d | j jddS )N   r   min)r   r   clampr   r   r   r   mode/   s   z
Gamma.modec                 C   s   | j | jd S )N   )r   r   powr   r   r   r   variance3      zGamma.varianceNc                    sN   t ||\| _| _t|trt|trt }n| j }t j	||d d S )Nvalidate_args)
r   r   r   
isinstancer   r
   Sizesizesuper__init__)r   r   r   r   batch_shape	__class__r   r   r$   7   s
   

zGamma.__init__c                    sR   |  t|}t|}| j||_| j||_tt|j|dd | j	|_	|S )NFr   )
_get_checked_instancer   r
   r!   r   expandr   r#   r$   _validate_args)r   r%   	_instancenewr&   r   r   r)   ?   s   
zGamma.expandsample_shapec                 C   sD   |  |}t| j|| j| }| jt|j	j
d |S )Nr   )_extended_shaper   r   r)   r   detachclamp_r
   finfodtypetiny)r   r-   shapevaluer   r   r   rsampleH   s   
zGamma.rsamplec                 C   s`   t j|| jj| jjd}| jr| | t | j| jt | jd | | j|  t 	| j S )N)r2   devicer   )
r
   	as_tensorr   r2   r7   r*   _validate_samplexlogyr   lgammar   r5   r   r   r   log_probR   s   

zGamma.log_probc                 C   s4   | j t| j t| j  d| j  t| j   S )Ng      ?)r   r
   logr   r;   digammar   r   r   r   entropy]   s   

zGamma.entropyc                 C   s   | j d | j fS Nr   r   r   r   r   r   _natural_paramse   r   zGamma._natural_paramsc                 C   s&   t |d |d t |    S rA   )r
   r;   r>   
reciprocal)r   xyr   r   r   _log_normalizeri   s   &zGamma._log_normalizerc                 C   s&   | j r| | tj| j| j| S r	   )r*   r9   r
   specialgammaincr   r   r<   r   r   r   cdfl   s   
z	Gamma.cdfr	   )__name__
__module____qualname____doc__r   positivearg_constraintsnonnegativesupporthas_rsample_mean_carrier_measurepropertyr   r   r   r   r$   r)   r
   r!   r   r6   r=   r@   tuplerB   rF   rI   __classcell__r   r   r&   r   r      s.    	
)r
   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   torch.typesr   r   __all__r   r   r   r   r   r   <module>   s   