U
    Jc                     @   sZ   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gZ	dd Z
G d	d deZdS )
    )NumberN)constraints)ExponentialFamily)broadcast_allGammac                 C   s
   t | S N)torch_standard_gamma)concentration r   =/tmp/pip-unpacked-wheel-gikjz4vx/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 )r   aB  
    Creates a Gamma distribution parameterized by shape :attr:`concentration` and :attr:`rate`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> 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    0   s
    

zGamma.__init__c                    sR   |  t|}t|}| j||_| j||_tt|j|dd | j	|_	|S )NFr   )
Z_get_checked_instancer   r   r   r
   expandr   r   r    _validate_args)r   r!   Z	_instancenewr"   r   r   r$   8   s    
zGamma.expandc                 C   sD   |  |}t| j|| j| }| jt|j	j
d |S )Nr   )Z_extended_shaper	   r
   r$   r   detachZclamp_r   ZfinfodtypeZtiny)r   Zsample_shapeshapevaluer   r   r   rsampleA   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   Z	as_tensorr   r(   r,   r%   Z_validate_sampleZxlogyr
   lgamma)r   r*   r   r   r   log_probG   s    

zGamma.log_probc                 C   s4   | j t| j t| j  d| j  t| j   S )Ng      ?)r
   r   logr   r-   Zdigammar   r   r   r   entropyO   s    zGamma.entropyc                 C   s   | j d | j fS Nr   r   r   r   r   r   _natural_paramsS   s    zGamma._natural_paramsc                 C   s&   t |d |d t |    S r1   )r   r-   r/   Z
reciprocal)r   xyr   r   r   _log_normalizerW   s    zGamma._log_normalizer)N)N)__name__
__module____qualname____doc__r   ZpositiveZarg_constraintsZnonnegativeZsupportZhas_rsampleZ_mean_carrier_measurepropertyr   r   r   r    r$   r   r   r+   r.   r0   r2   r5   __classcell__r   r   r"   r   r      s&   


	
)Znumbersr   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   __all__r	   r   r   r   r   r   <module>   s   