a
    h                     @   s   d dl mZmZ d dlZd dlmZ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)nanTensor)constraints)ExponentialFamily)broadcast_alllazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logits)_NumberNumber	Bernoullic                       s2  e Zd ZdZejejdZejZ	dZ
d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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ejdddZe fddZdd Zdd Z d(d d!Z!ee"e dd"d#Z#d$d% Z$  Z%S ))r   a  
    Creates a Bernoulli distribution parameterized by :attr:`probs`
    or :attr:`logits` (but not both).

    Samples are binary (0 or 1). They take the value `1` with probability `p`
    and `0` with probability `1 - p`.

    Example::

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

    Args:
        probs (Number, Tensor): the probability of sampling `1`
        logits (Number, Tensor): the log-odds of sampling `1`
        validate_args (bool, optional): whether to validate arguments, None by default
    )probslogitsTr   N)r   r   validate_argsreturnc                    s   |d u |d u krt d|d ur8t|t}t|\| _n"|d usDJ t|t}t|\| _|d urh| jn| j| _|r~t }n
| j	 }t
 j||d d S )Nz;Either `probs` or `logits` must be specified, but not both.r   )
ValueError
isinstancer   r   r   r   _paramtorchSizesizesuper__init__)selfr   r   r   Z	is_scalarbatch_shape	__class__ K/var/www/auris/lib/python3.9/site-packages/torch/distributions/bernoulli.pyr   /   s    



zBernoulli.__init__c                    sv   |  t|}t|}d| jv r6| j||_|j|_d| jv rV| j||_|j|_t	t|j
|dd | j|_|S )Nr   r   Fr   )Z_get_checked_instancer   r   r   __dict__r   expandr   r   r   r   _validate_args)r   r   Z	_instancenewr   r!   r"   r$   G   s    


zBernoulli.expandc                 O   s   | j j|i |S N)r   r&   )r   argskwargsr!   r!   r"   _newT   s    zBernoulli._new)r   c                 C   s   | j S r'   r   r   r!   r!   r"   meanW   s    zBernoulli.meanc                 C   s$   | j dk| j }t|| j dk< |S )Ng      ?)r   tor   )r   moder!   r!   r"   r/   [   s    zBernoulli.modec                 C   s   | j d| j   S )N   r+   r,   r!   r!   r"   variancea   s    zBernoulli.variancec                 C   s   t | jddS NT)Z	is_binary)r   r   r,   r!   r!   r"   r   e   s    zBernoulli.logitsc                 C   s   t | jddS r2   )r
   r   r,   r!   r!   r"   r   i   s    zBernoulli.probsc                 C   s
   | j  S r'   )r   r   r,   r!   r!   r"   param_shapem   s    zBernoulli.param_shapec                 C   sH   |  |}t " t| j|W  d    S 1 s:0    Y  d S r'   )Z_extended_shaper   Zno_gradZ	bernoullir   r$   )r   Zsample_shapeshaper!   r!   r"   sampleq   s    

zBernoulli.samplec                 C   s0   | j r| | t| j|\}}t||dd S Nnone)Z	reduction)r%   Z_validate_sampler   r   r   )r   valuer   r!   r!   r"   log_probv   s    
zBernoulli.log_probc                 C   s   t | j| jddS r6   )r   r   r   r,   r!   r!   r"   entropy|   s    
zBernoulli.entropyc                 C   sH   t jd| jj| jjd}|ddt| j  }|rD|d| j }|S )N   )dtypedevice))r0   )	r   Zaranger   r<   r=   viewlenZ_batch_shaper$   )r   r$   valuesr!   r!   r"   enumerate_support   s
    zBernoulli.enumerate_supportc                 C   s   t | jfS r'   )r   Zlogitr   r,   r!   r!   r"   _natural_params   s    zBernoulli._natural_paramsc                 C   s   t t |S r'   )r   log1pexp)r   xr!   r!   r"   _log_normalizer   s    zBernoulli._log_normalizer)NNN)N)T)&__name__
__module____qualname____doc__r   Zunit_intervalrealZarg_constraintsbooleanZsupportZhas_enumerate_supportZ_mean_carrier_measurer   r   r   r   boolr   r$   r*   propertyr-   r/   r1   r	   r   r   r   r   r3   r5   r9   r:   rB   tuplerC   rG   __classcell__r!   r!   r   r"   r      sF      
)typingr   r   r   r   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   r	   r
   r   Ztorch.nn.functionalr   Ztorch.typesr   r   __all__r   r!   r!   r!   r"   <module>   s   