U
    ©Ê¹jÑ
  ã                   @   sz   d dl Z d dlmZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZ dgZG d	d„ deƒZdS )
é    N)ÚNumber)Úconstraints)ÚTransformedDistribution)ÚAffineTransformÚExpTransform)ÚUniform)Úbroadcast_allÚeuler_constantÚGumbelc                       s„   e Zd ZdZejejdœZejZd‡ fdd„	Z	d‡ fdd„	Z
dd	„ Zed
d„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Z‡  ZS )r
   a¶  
    Samples from a Gumbel Distribution.

    Examples::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> m = Gumbel(torch.tensor([1.0]), torch.tensor([2.0]))
        >>> m.sample()  # sample from Gumbel distribution with loc=1, scale=2
        tensor([ 1.0124])

    Args:
        loc (float or Tensor): Location parameter of the distribution
        scale (float or Tensor): Scale parameter of the distribution
    ©ÚlocÚscaleNc                    s¾   t ||ƒ\| _| _t | jj¡}t|tƒrLt|tƒrLt|j	d|j
 |d�}n*tt | j|j	¡t | jd|j
 ¡|d�}tƒ jtdt | j¡ d�tƒ jt|| j d�g}tƒ j|||d� d S )Né   )Úvalidate_argsr   r   )r   r   r   ÚtorchÚfinfoZdtypeÚ
isinstancer   r   ZtinyÚepsZ	full_liker   Úinvr   Z	ones_likeÚsuperÚ__init__)Úselfr   r   r   r   Z	base_distZ
transforms©Ú	__class__© úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/gumbel.pyr       s    ýüzGumbel.__init__c                    s8   |   t|¡}| j |¡|_| j |¡|_tƒ j||d�S )N)Ú	_instance)Z_get_checked_instancer
   r   Úexpandr   r   )r   Zbatch_shaper   Únewr   r   r   r   3   s    zGumbel.expandc                 C   s6   | j r|  |¡ | j| | j }|| ¡  | j ¡  S ©N)Z_validate_argsZ_validate_sampler   r   ÚexpÚlog)r   ÚvalueÚyr   r   r   Úlog_prob:   s    
zGumbel.log_probc                 C   s   | j | jt  S r   )r   r   r	   ©r   r   r   r   Úmean@   s    zGumbel.meanc                 C   s   | j S r   )r   r%   r   r   r   ÚmodeD   s    zGumbel.modec                 C   s   t jt  d¡ | j S )Né   )ÚmathÚpiÚsqrtr   r%   r   r   r   ÚstddevH   s    zGumbel.stddevc                 C   s   | j  d¡S )Né   )r,   Úpowr%   r   r   r   ÚvarianceL   s    zGumbel.variancec                 C   s   | j  ¡ dt  S )Nr   )r   r!   r	   r%   r   r   r   ÚentropyP   s    zGumbel.entropy)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚrealZpositiveZarg_constraintsZsupportr   r   r$   Úpropertyr&   r'   r,   r/   r0   Ú__classcell__r   r   r   r   r
      s   



)r)   Únumbersr   r   Ztorch.distributionsr   Z,torch.distributions.transformed_distributionr   Ztorch.distributions.transformsr   r   Ztorch.distributions.uniformr   Ztorch.distributions.utilsr   r	   Ú__all__r
   r   r   r   r   Ú<module>   s   