a
    h                     @   s   d dl mZmZ d dlZd dlm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 dlmZmZ d	gZG d
d	 d	eZdS )    )OptionalUnionN)Tensor)constraints)Distribution)broadcast_alllazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logits)_NumberNumber	Geometricc                       s   e Zd ZdZejejdZejZ	de
eeef  e
eeef  e
e dd fddZd fdd	Zeed	d
dZeed	ddZeed	ddZeed	ddZeed	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.

    .. math::

        P(X=k) = (1-p)^{k} p, k = 0, 1, ...

    .. note::
        :func:`torch.distributions.geometric.Geometric` :math:`(k+1)`-th trial is the first success
        hence draws samples in :math:`\{0, 1, \ldots\}`, whereas
        :func:`torch.Tensor.geometric_` `k`-th trial is the first success hence draws samples in :math:`\{1, 2, \ldots\}`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> 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logitsN)r   r   validate_argsreturnc           	   	      s   |d u |d u krt d|d ur.t|\| _n|d us:J t|\| _|d urR|n|}t|trjt }n|d usvJ | }t	 j
||d | jr|d u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.r   r   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__ K/var/www/auris/lib/python3.9/site-packages/torch/distributions/geometric.pyr   2   s<    

zGeometric.__init__c                    sf   |  t|}t|}d| jv r.| j||_d| jv 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+   U   s    


zGeometric.expand)r   c                 C   s   d| j  d S Ng      ?r   r#   r(   r(   r)   mean`   s    zGeometric.meanc                 C   s   t | jS )N)r   Z
zeros_liker   r/   r(   r(   r)   moded   s    zGeometric.modec                 C   s   d| j  d | j  S r-   r.   r/   r(   r(   r)   varianceh   s    zGeometric.variancec                 C   s   t | jddS NT)Z	is_binary)r
   r   r/   r(   r(   r)   r   l   s    zGeometric.logitsc                 C   s   t | jddS r3   )r	   r   r/   r(   r(   r)   r   p   s    zGeometric.probsc                 C   s   |  |}t| jjj}t l tj rTtj	|| jj| jj
d}|j|d}n| j||d}| | j    W  d    S 1 s0    Y  d S )N)dtypedevice)min   )Z_extended_shaper   Zfinfor   r4   tinyZno_gradZ_CZ_get_tracing_stateZrandr5   clampr,   Zuniform_loglog1pfloor)r#   Zsample_shaper!   r8   ur(   r(   r)   samplet   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   r7   )	r   Z_validate_sampler   r   cloner   Zcontiguous_formatr;   r:   )r#   r%   r   r(   r(   r)   log_prob   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)   entropy   s    zGeometric.entropy)NNN)N)r   
__module____qualname____doc__r   Zunit_intervalrealZarg_constraintsZnonnegative_integerZsupportr   r   r   r   boolr   r+   propertyr0   r1   r2   r   r   r   r   r   r>   r@   rB   __classcell__r(   r(   r&   r)   r      s4      #)typingr   r   r   r   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.utilsr   r   r	   r
   Ztorch.nn.functionalr   Ztorch.typesr   r   __all__r   r(   r(   r(   r)   <module>   s   