a
    MSic                     @   sT   d dl mZ d dlZd dlmZ d dlmZ d dlmZ dd Z	G dd	 d	eZ
dS )
    )NumberN)constraints)ExponentialFamily)broadcast_allc                 C   s
   t | S N)torch_standard_gamma)concentration r
   U/var/www/html/django/DPS/env/lib/python3.9/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d Zedd Zed	d
 Zd fdd	Zd fdd	Ze fddZdd Zdd Zedd Zdd Z  ZS )Gammaa	  
    Creates a Gamma distribution parameterized by shape :attr:`concentration` and :attr:`rate`.

    Example::

        >>> 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 = 1 / scale of the distribution
            (often referred to as beta)
    r	   rateTr   c                 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   variance*   s    zGamma.varianceNc                    sR   t ||\| _| _t|tr0t|tr0t }n
| j }tt	| j
||d d S )Nvalidate_args)r   r	   r   
isinstancer   r   Sizesizesuperr   __init__)r   r	   r   r   batch_shape	__class__r
   r   r    .   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%   6   s    
zGamma.expandc                 C   sD   |  |}t| j|| j| }| jt|j	j
d |S )Nr   )_extended_shaper   r	   r%   r   detachclamp_r   finfodtypetiny)r   sample_shapeshapevaluer
   r
   r   rsample?   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)r-   devicer   )
r   	as_tensorr   r-   r3   r&   _validate_samplexlogyr	   lgamma)r   r1   r
   r
   r   log_probE   s    

zGamma.log_probc                 C   s4   | j t| j t| j  d| j  t| j   S )Ng      ?)r	   r   logr   r7   digammar   r
   r
   r   entropyM   s    zGamma.entropyc                 C   s   | j d | j fS Nr   r   r   r
   r
   r   _natural_paramsQ   s    zGamma._natural_paramsc                 C   s&   t |d |d t |    S r<   )r   r7   r9   
reciprocal)r   xyr
   r
   r   _log_normalizerU   s    zGamma._log_normalizer)N)N)__name__
__module____qualname____doc__r   positivearg_constraintsnonnegativesupporthas_rsample_mean_carrier_measurepropertyr   r   r   r    r%   r   r   r2   r8   r;   r=   rA   __classcell__r
   r
   r"   r   r      s&   


	
r   )numbersr   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   r   r   r
   r
   r
   r   <module>   s   