
    }Yh                         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	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            	           e Zd ZdZej        ej        dZej        Z	dZ
dZ	 	 	 ddeeeef                  deeeef                  dee         d	df fd
Zd fd	Zd Zed	efd            Zed	efd            Zed	efd            Zed	efd            Zed	efd            Zed	ej        fd            Z ej                    fdZd Zd Z ddZ!ed	e"e         fd            Z#d Z$ x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   Nr   r   validate_argsreturnc                    |d u |d u k    rt          d          |,t          |t                    }t          |          \  | _        n/|J t          |t                    }t          |          \  | _        || j        n| j        | _        |rt          j                    }n| j        	                                }t                                          ||           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   	is_scalarbatch_shape	__class__s         o/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torch/distributions/bernoulli.pyr   zBernoulli.__init__/   s     TMv~..M   "5'22I)%00MTZZ%%%"6733I*622NT[$)$5djj4; 	-*,,KK+**,,KMBBBBB    c                    |                      t          |          }t          j        |          }d| j        v r+| j                            |          |_        |j        |_        d| j        v r+| j                            |          |_        |j        |_        t          t          |          
                    |d           | j        |_        |S )Nr   r   Fr   )_get_checked_instancer   r   r   __dict__r   expandr   r   r   r   _validate_args)r    r"   	_instancenewr#   s       r$   r)   zBernoulli.expandG   s    ((I>>j--dm##
))+66CICJt}$$++K88CJCJi&&{%&HHH!0
r%   c                 &     | j         j        |i |S N)r   r,   )r    argskwargss      r$   _newzBernoulli._newT   s    t{////r%   c                     | j         S r.   r   r    s    r$   meanzBernoulli.meanW   s
    zr%   c                 r    | j         dk                        | j                   }t          || j         dk    <   |S )Ng      ?)r   tor   )r    modes     r$   r8   zBernoulli.mode[   s4    
c!%%dj11"%TZ3r%   c                 &    | j         d| j         z
  z  S )N   r3   r4   s    r$   variancezBernoulli.variancea   s    zQ^,,r%   c                 .    t          | j        d          S NT)	is_binary)r   r   r4   s    r$   r   zBernoulli.logitse   s    tzT::::r%   c                 .    t          | j        d          S r=   )r   r   r4   s    r$   r   zBernoulli.probsi   s    t{d;;;;r%   c                 4    | j                                         S r.   )r   r   r4   s    r$   param_shapezBernoulli.param_shapem   s    {!!!r%   c                     |                      |          }t          j                    5  t          j        | j                            |                    cd d d            S # 1 swxY w Y   d S r.   )_extended_shaper   no_grad	bernoullir   r)   )r    sample_shapeshapes      r$   samplezBernoulli.sampleq   s    $$\22]__ 	= 	=?4:#4#4U#;#;<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   ,A""A&)A&c                     | j         r|                     |           t          | j        |          \  }}t	          ||d           S Nnone)	reduction)r*   _validate_sampler	   r   r   )r    valuer   s      r$   log_probzBernoulli.log_probv   sN     	)!!%(((%dk5990&QQQQQr%   c                 :    t          | j        | j        d          S rJ   )r   r   r   r4   s    r$   entropyzBernoulli.entropy|   s$    /Kv
 
 
 	
r%   c                     t          j        d| j        j        | j        j                  }|                    ddt          | j                  z  z             }|r|                    d| j        z             }|S )N   )dtypedevice))r:   )	r   aranger   rT   rU   viewlen_batch_shaper)   )r    r)   valuess      r$   enumerate_supportzBernoulli.enumerate_support   sn    at{'8ASTTTUTC0A,B,B%BBCC 	>]]54+<#<==Fr%   c                 6    t          j        | j                  fS r.   )r   logitr   r4   s    r$   _natural_paramszBernoulli._natural_params   s    DJ''))r%   c                 N    t          j        t          j        |                    S r.   )r   log1pexp)r    xs     r$   _log_normalizerzBernoulli._log_normalizer   s    {59Q<<(((r%   )NNNr.   )T)&__name__
__module____qualname____doc__r   unit_intervalrealarg_constraintsbooleansupporthas_enumerate_support_mean_carrier_measurer   r   r   r   boolr   r)   r1   propertyr5   r8   r;   r
   r   r   r   r   rA   rH   rO   rQ   r\   tupler_   rd   __classcell__)r#   s   @r$   r   r      sz        ( !, 9[EUVVO!G  2626(,	C Cffn-.C vv~./C  ~	C
 
C C C C C C0     0 0 0 f    X f    X
 -& - - - X- ; ; ; ; ]; <v < < < ]< "UZ " " " X" #-%*,, = = = =
R R R
 
 

    *v * * * X*) ) ) ) ) ) )r%   )typingr   r   r   r   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr	   r
   r   r   torch.nn.functionalr   torch.typesr   r   __all__r    r%   r$   <module>r|      s   " " " " " " " "          + + + + + + < < < < < <            A @ @ @ @ @ ' ' ' ' ' ' ' ' -x) x) x) x) x)! x) x) x) x) x)r%   