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)ŚDistribution)Śbroadcast_allc                       sØ   e Zd ZdZejejdZej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  ZS )ŚLaplacea  
    Creates a Laplace distribution parameterized by :attr:`loc` and :attr:`scale`.

    Example::

        >>> m = Laplace(torch.tensor([0.0]), torch.tensor([1.0]))
        >>> m.sample()  # Laplace distributed with loc=0, scale=1
        tensor([ 0.1046])

    Args:
        loc (float or Tensor): mean of the distribution
        scale (float or Tensor): scale of the distribution
    )ŚlocŚscaleTc                 C   s   | j S ©N©r   ©Śself© r   ś?/tmp/pip-unpacked-wheel-ua33x9lu/torch/distributions/laplace.pyŚmean   s    zLaplace.meanc                 C   s   | j S r	   r
   r   r   r   r   Śmode   s    zLaplace.modec                 C   s   d| j  d” S ©Né   )r   Śpowr   r   r   r   Śvariance"   s    zLaplace.variancec                 C   s
   d| j  S )NgĶ;f ö?)r   r   r   r   r   Śstddev&   s    zLaplace.stddevNc                    sR   t ||\| _| _t|tr0t|tr0t ” }n
| j ” }tt	| j
||d d S )N©Śvalidate_args)r   r   r   Ś
isinstancer   ŚtorchŚSizeŚsizeŚsuperr   Ś__init__)r   r   r   r   Śbatch_shape©Ś	__class__r   r   r   *   s
    

zLaplace.__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!   2   s    
zLaplace.expandc                 C   s®   |   |”}t | jj”}tj ” rptj|| jj| jjdd d }| j| j	| 
”  t | ” j|jd ”  S | j |” |jd d”}| j| j	| 
”  t | ”  ”  S )N)ŚdtypeŚdevicer   é   )Śmin)Z_extended_shaper   Śfinfor   r$   Z_CZ_get_tracing_stateZrandr%   r   ŚsignŚlog1pŚabsŚclampZtinyr#   Zuniform_Zeps)r   Zsample_shapeŚshaper(   Śur   r   r   Śrsample;   s    

 .zLaplace.rsamplec                 C   s8   | j r|  |” t d| j ” t || j ”| j  S r   )r"   Ś_validate_sampler   Ślogr   r+   r   ©r   Śvaluer   r   r   Ślog_probG   s    
zLaplace.log_probc                 C   sB   | j r|  |” dd|| j  ”  t || j  ”  | j ”  S )Nē      ą?)r"   r0   r   r)   r   Śexpm1r+   r   r2   r   r   r   ŚcdfL   s    
zLaplace.cdfc                 C   s.   |d }| j | j| ”  t d| ”  ”  S )Nr5   éž’’’)r   r   r)   r   r*   r+   )r   r3   Ztermr   r   r   ŚicdfQ   s    zLaplace.icdfc                 C   s   dt  d| j ” S )Nr&   r   )r   r1   r   r   r   r   r   ŚentropyU   s    zLaplace.entropy)N)N)Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   ŚrealZpositiveZarg_constraintsZsupportZhas_rsampleŚpropertyr   r   r   r   r   r!   r   r   r/   r4   r7   r9   r:   Ś__classcell__r   r   r   r   r      s&   



	r   )
Znumbersr   r   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.utilsr   r   r   r   r   r   Ś<module>   s
   