U
    d.
  ć                   @   sL   d dl mZ d dlZd dlmZ d dlmZ d dlmZ G dd deZ	dS )é    )ŚNumberN)Śconstraints)ŚExponentialFamily)Śbroadcast_allc                       s¼   e Zd ZdZdejiZejZdZ	dZ
ed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dd Zdd Zedd Zdd Z  ZS )"ŚExponentiala4  
    Creates a Exponential distribution parameterized by :attr:`rate`.

    Example::

        >>> m = Exponential(torch.tensor([1.0]))
        >>> m.sample()  # Exponential distributed with rate=1
        tensor([ 0.1046])

    Args:
        rate (float or Tensor): rate = 1 / scale of the distribution
    ŚrateTr   c                 C   s
   | j  ” S ©N©r   Z
reciprocal©Śself© r   śC/tmp/pip-unpacked-wheel-ua33x9lu/torch/distributions/exponential.pyŚmean   s    zExponential.meanc                 C   s   t  | j”S r   )ŚtorchZ
zeros_liker   r
   r   r   r   Śmode   s    zExponential.modec                 C   s
   | j  ” S r   r	   r
   r   r   r   Śstddev#   s    zExponential.stddevc                 C   s   | j  d”S )Néž’’’)r   Śpowr
   r   r   r   Śvariance'   s    zExponential.varianceNc                    s@   t |\| _t|trt ” n| j ” }tt| j	||d d S )N©Śvalidate_args)
r   r   Ś
isinstancer   r   ŚSizeŚsizeŚsuperr   Ś__init__)r   r   r   Śbatch_shape©Ś	__class__r   r   r   +   s    zExponential.__init__c                    sD   |   t|”}t |”}| j |”|_tt|j|dd | j|_|S )NFr   )	Z_get_checked_instancer   r   r   r   Śexpandr   r   Ś_validate_args)r   r   Z	_instanceŚnewr   r   r   r   0   s    
zExponential.expandc                 C   sT   |   |”}tj ” r>tj|| jj| jjd}|  ”  | j S | j 	|” 
” | j S )N)ŚdtypeŚdevice)Z_extended_shaper   Z_CZ_get_tracing_stateZrandr   r"   r#   Ślog1pr!   Zexponential_)r   Zsample_shapeŚshapeŚur   r   r   Śrsample8   s
    

zExponential.rsamplec                 C   s$   | j r|  |” | j ” | j|  S r   )r    Ś_validate_sampler   Ślog©r   Śvaluer   r   r   Ślog_prob@   s    
zExponential.log_probc                 C   s&   | j r|  |” dt | j | ” S ©Né   )r    r(   r   Śexpr   r*   r   r   r   ŚcdfE   s    
zExponential.cdfc                 C   s   t  d| ” | j S r-   ©r   r)   r   r*   r   r   r   ŚicdfJ   s    zExponential.icdfc                 C   s   dt  | j” S )Ng      š?r1   r
   r   r   r   ŚentropyM   s    zExponential.entropyc                 C   s
   | j  fS r   )r   r
   r   r   r   Ś_natural_paramsP   s    zExponential._natural_paramsc                 C   s   t  | ” S r   )r   r)   )r   Śxr   r   r   Ś_log_normalizerT   s    zExponential._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'   r,   r0   r2   r3   r4   r6   Ś__classcell__r   r   r   r   r   	   s.   





r   )
Znumbersr   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   r   r   r   r   r   Ś<module>   s
   