U
    ©Ê¹jJ  ã                   @   sv   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 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)Únan)Úconstraints)ÚExponentialFamily)Úbroadcast_allÚlazy_propertyÚlogits_to_probsÚprobs_to_logits)Ú binary_cross_entropy_with_logitsÚ	Bernoullic                       sÚ   e Zd ZdZejejdœZejZ	dZ
d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edd„ ƒZedd„ ƒZe ¡ fdd„Zdd„ Zdd„ Zd&dd„Zed d!„ ƒZd"d#„ Z‡  ZS )'r   a0  
    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-deterinistic")
        >>> 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`
    )ÚprobsÚlogitsTr   Nc                    s�   |d k|d kkrt dƒ‚|d k	r8t|tƒ}t|ƒ\| _nt|tƒ}t|ƒ\| _|d k	r\| jn| j| _|rrt ¡ }n
| j 	¡ }t
ƒ j||d� d S )Nz;Either `probs` or `logits` must be specified, but not both.©Úvalidate_args)Ú
ValueErrorÚ
isinstancer   r   r   r   Ú_paramÚtorchÚSizeÚsizeÚsuperÚ__init__)Úselfr   r   r   Z	is_scalarÚbatch_shape©Ú	__class__© ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/bernoulli.pyr   *   s    ÿ



zBernoulli.__init__c                    sv   |   t|¡}t |¡}d| jkr6| j |¡|_|j|_d| jk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   <   s    


zBernoulli.expandc                 O   s   | j j||ŽS ©N)r   r!   )r   ÚargsÚkwargsr   r   r   Ú_newI   s    zBernoulli._newc                 C   s   | j S r"   ©r   ©r   r   r   r   ÚmeanL   s    zBernoulli.meanc                 C   s$   | j dk | j ¡}t|| j dk< |S )Ng      à?)r   Útor   )r   Úmoder   r   r   r*   P   s    zBernoulli.modec                 C   s   | j d| j   S )Né   r&   r'   r   r   r   ÚvarianceV   s    zBernoulli.variancec                 C   s   t | jdd�S ©NT)Z	is_binary)r	   r   r'   r   r   r   r   Z   s    zBernoulli.logitsc                 C   s   t | jdd�S r-   )r   r   r'   r   r   r   r   ^   s    zBernoulli.probsc                 C   s
   | j  ¡ S r"   )r   r   r'   r   r   r   Úparam_shapeb   s    zBernoulli.param_shapec              
   C   s<   |   |¡}t ¡ �  t | j |¡¡W  5 Q R £ S Q R X d S r"   )Z_extended_shaper   Zno_gradZ	bernoullir   r   )r   Zsample_shapeÚshaper   r   r   Úsamplef   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_probk   s    
zBernoulli.log_probc                 C   s   t | j| jdd�S r1   )r
   r   r   r'   r   r   r   Úentropyq   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)éÿÿÿÿ)r+   )	r   Zaranger   r7   r8   ÚviewÚlenZ_batch_shaper   )r   r   Úvaluesr   r   r   Úenumerate_supportv   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%   Úpropertyr(   r*   r,   r   r   r   r.   r   r   r0   r4   r5   r=   r>   rB   Ú__classcell__r   r   r   r   r      s6   







)Únumbersr   r   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   r   r   r	   Ztorch.nn.functionalr
   Ú__all__r   r   r   r   r   Ú<module>   s   