U
    ©Ê¹j„  ã                   @   sj   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	m
Z
mZ d dlmZ dgZG dd„ deƒZdS )	é    )ÚNumberN)Úconstraints)ÚDistribution)Úbroadcast_allÚlazy_propertyÚlogits_to_probsÚprobs_to_logits)Ú binary_cross_entropy_with_logitsÚ	Geometricc                       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edd	„ ƒZed
d„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe ¡ fdd„Zdd„ Zdd„ Z‡  ZS )r
   aØ  
    Creates a Geometric distribution parameterized by :attr:`probs`,
    where :attr:`probs` is the probability of success of Bernoulli trials.
    It represents the probability that in :math:`k + 1` Bernoulli trials, the
    first :math:`k` trials failed, before seeing a success.

    Samples are non-negative integers [0, :math:`\inf`).

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> m = Geometric(torch.tensor([0.3]))
        >>> m.sample()  # underlying Bernoulli has 30% chance 1; 70% chance 0
        tensor([ 2.])

    Args:
        probs (Number, Tensor): the probability of sampling `1`. Must be in range (0, 1]
        logits (Number, Tensor): the log-odds of sampling `1`.
    )ÚprobsÚlogitsNc           	   	      sÚ   |d k|d kkrt dƒ‚|d k	r.t|ƒ\| _nt|ƒ\| _|d k	rF|n|}t|tƒr^t ¡ }n| ¡ }t	ƒ j
||d� | jrÖ|d k	rÖ| j}|dk}| ¡ sÖ|j|  }t dt|ƒj› dt|jƒ› dt| ƒ› d|› �ƒ‚d S )Nz;Either `probs` or `logits` must be specified, but not both.©Úvalidate_argsr   zExpected parameter probs (z
 of shape z) of distribution z* to be positive but found invalid values:
)Ú
ValueErrorr   r   r   Ú
isinstancer   ÚtorchÚSizeÚsizeÚsuperÚ__init__Ú_validate_argsÚallÚdataÚtypeÚ__name__ÚtupleÚshapeÚrepr)	Úselfr   r   r   Zprobs_or_logitsÚbatch_shapeÚvalueZvalidZinvalid_value©Ú	__class__© ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/geometric.pyr   (   s(    ÿ

*ÿzGeometric.__init__c                    sf   |   t|¡}t |¡}d| jkr.| j |¡|_d| jkrF| j |¡|_tt|ƒj	|dd� | j
|_
|S )Nr   r   Fr   )Z_get_checked_instancer
   r   r   Ú__dict__r   Úexpandr   r   r   r   )r   r   Z	_instanceÚnewr!   r#   r$   r&   D   s    


zGeometric.expandc                 C   s   d| j  d S ©Ng      ð?©r   ©r   r#   r#   r$   ÚmeanO   s    zGeometric.meanc                 C   s   t  | j¡S )N)r   Z
zeros_liker   r*   r#   r#   r$   ÚmodeS   s    zGeometric.modec                 C   s   d| j  d | j  S r(   r)   r*   r#   r#   r$   ÚvarianceW   s    zGeometric.variancec                 C   s   t | jdd�S ©NT)Z	is_binary)r   r   r*   r#   r#   r$   r   [   s    zGeometric.logitsc                 C   s   t | jdd�S r.   )r   r   r*   r#   r#   r$   r   _   s    zGeometric.probsc              
   C   s–   |   |¡}t | jj¡j}t ¡ �j tj ¡ rTtj	|| jj| jj
d�}|j|d�}n| j |¡ |d¡}| ¡ | j  ¡   ¡ W  5 Q R £ S Q R X d S )N)ÚdtypeÚdevice)Úminé   )Z_extended_shaper   Zfinfor   r/   ÚtinyZno_gradZ_CZ_get_tracing_stateZrandr0   Úclampr'   Zuniform_ÚlogÚlog1pÚfloor)r   Zsample_shaper   r3   Úur#   r#   r$   Úsamplec   s    


zGeometric.samplec                 C   sZ   | j r|  |¡ t|| jƒ\}}|jtjd�}d||dk|dk@ < ||  ¡  | j ¡  S )N)Zmemory_formatr   r2   )	r   Z_validate_sampler   r   Úcloner   Zcontiguous_formatr6   r5   )r   r    r   r#   r#   r$   Úlog_probo   s    
zGeometric.log_probc                 C   s   t | j| jdd�| j S )NÚnone)Z	reduction)r	   r   r   r*   r#   r#   r$   Úentropyw   s    ÿÿzGeometric.entropy)NNN)N)r   Ú
__module__Ú__qualname__Ú__doc__r   Zunit_intervalÚrealZarg_constraintsZnonnegative_integerZsupportr   r&   Úpropertyr+   r,   r-   r   r   r   r   r   r9   r;   r=   Ú__classcell__r#   r#   r!   r$   r
      s$   




)Únumbersr   r   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.utilsr   r   r   r   Ztorch.nn.functionalr	   Ú__all__r
   r#   r#   r#   r$   Ú<module>   s   