U
    ©Ê¹j©  ã                   @   sR   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	G dd„ deƒZ
dS )é    )ÚNumberN)Úconstraints)ÚExponentialFamily)Úbroadcast_allÚPoissonc                       s�   e Zd ZdZdejiZej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e	dd„ ƒZdd„ Z‡  ZS )r   aÆ  
    Creates a Poisson distribution parameterized by :attr:`rate`, the rate parameter.

    Samples are nonnegative integers, with a pmf given by

    .. math::
      \mathrm{rate}^k \frac{e^{-\mathrm{rate}}}{k!}

    Example::

        >>> # xdoctest: +SKIP("poisson_cpu not implemented for 'Long'")
        >>> m = Poisson(torch.tensor([4]))
        >>> m.sample()
        tensor([ 3.])

    Args:
        rate (Number, Tensor): the rate parameter
    Úratec                 C   s   | j S ©N©r   ©Úself© r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/poisson.pyÚmean!   s    zPoisson.meanc                 C   s
   | j  ¡ S r   )r   Úfloorr
   r   r   r   Úmode%   s    zPoisson.modec                 C   s   | j S r   r	   r
   r   r   r   Úvariance)   s    zPoisson.varianceNc                    s>   t |ƒ\| _t|tƒr t ¡ }n
| j ¡ }tƒ j||d� d S )N©Úvalidate_args)	r   r   Ú
isinstancer   ÚtorchÚSizeÚsizeÚsuperÚ__init__)r   r   r   Úbatch_shape©Ú	__class__r   r   r   -   s
    


zPoisson.__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   5   s    
zPoisson.expandc              
   C   s<   |   |¡}t ¡ �  t | j |¡¡W  5 Q R £ S Q R X d S r   )Z_extended_shaper   Zno_gradZpoissonr   r   )r   Zsample_shapeÚshaper   r   r   Úsample=   s    

zPoisson.samplec                 C   s:   | j r|  |¡ t| j|ƒ\}}| |¡| |d  ¡  S )Né   )r   Z_validate_sampler   r   ZxlogyÚlgamma)r   Úvaluer   r   r   r   Úlog_probB   s    
zPoisson.log_probc                 C   s   t  | j¡fS r   )r   Úlogr   r
   r   r   r   Ú_natural_paramsH   s    zPoisson._natural_paramsc                 C   s
   t  |¡S r   )r   Úexp)r   Úxr   r   r   Ú_log_normalizerL   s    zPoisson._log_normalizer)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ZnonnegativeZarg_constraintsZnonnegative_integerZsupportÚpropertyr   r   r   r   r   r   r   r!   r%   r'   r*   Ú__classcell__r   r   r   r   r      s    




)Únumbersr   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   Ú__all__r   r   r   r   r   Ú<module>   s   