
    Ǆgg                     |    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e      Zy)
    )NumberN)nan)constraints)ExponentialFamily)broadcast_alllazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logits	Bernoullic                   :    e Zd ZdZej
                  ej                  dZej                  Z	dZ
dZd fd	Zd fd	Zd Zed        Zed	        Zed
        Zed        Zed        Zed        Z ej0                         fdZd Zd ZddZed        Zd Z xZS )r   a1  
    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`
    )probslogitsTr   c                 ~   |d u |d u k(  rt        d      |#t        |t              }t        |      \  | _        n"t        |t              }t        |      \  | _        || j                  n| j
                  | _        |rt        j                         }n| j                  j                         }t        | -  ||       y )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   	is_scalarbatch_shape	__class__s         e/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/distributions/bernoulli.pyr   zBernoulli.__init__,   s    TMv~.M  "5&1I)%0MTZ"662I*62NT[$)$5djj4;;**,K++**,KMB    c                    | j                  t        |      }t        j                  |      }d| j                  v r1| j
                  j                  |      |_        |j
                  |_        d| j                  v r1| j                  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.expand>   s    ((I>jj-dmm#

))+6CICJt}}$++K8CJCJi&{%&H!00
r    c                 :     | j                   j                  |i |S N)r   r'   )r   argskwargss      r   _newzBernoulli._newK   s    t{{///r    c                     | j                   S r)   r   r   s    r   meanzBernoulli.meanN   s    zzr    c                     | j                   dk\  j                  | j                         }t        || j                   dk(  <   |S )Ng      ?)r   tor   )r   modes     r   r3   zBernoulli.modeR   s7    

c!%%djj1"%TZZ3r    c                 :    | j                   d| j                   z
  z  S )N   r.   r/   s    r   variancezBernoulli.varianceX   s    zzQ^,,r    c                 0    t        | j                  d      S NT)	is_binary)r
   r   r/   s    r   r   zBernoulli.logits\   s    tzzT::r    c                 0    t        | j                  d      S r8   )r	   r   r/   s    r   r   zBernoulli.probs`   s    t{{d;;r    c                 6    | j                   j                         S r)   )r   r   r/   s    r   param_shapezBernoulli.param_shaped   s    {{!!r    c                     | j                  |      }t        j                         5  t        j                  | j                  j                  |            cd d d        S # 1 sw Y   y xY wr)   )_extended_shaper   no_grad	bernoullir   r$   )r   sample_shapeshapes      r   samplezBernoulli.sampleh   sK    $$\2]]_ 	=??4::#4#4U#;<	= 	= 	=s   .AA'c                     | j                   r| j                  |       t        | j                  |      \  }}t	        ||d       S Nnone)	reduction)r%   _validate_sampler   r   r   )r   valuer   s      r   log_probzBernoulli.log_probm   s?    !!%(%dkk590&QQQr    c                 F    t        | j                  | j                  d      S rE   )r   r   r   r/   s    r   entropyzBernoulli.entropys   s    /KKv
 	
r    c                    t        j                  d| j                  j                  | j                  j                        }|j                  ddt        | j                        z  z         }|r|j                  d| j                  z         }|S )N   )dtypedevice))r5   )	r   aranger   rO   rP   viewlen_batch_shaper$   )r   r$   valuess      r   enumerate_supportzBernoulli.enumerate_supportx   sl    at{{'8'8ASASTUTC0A0A,B%BBC]]54+<+<#<=Fr    c                 B    t        j                  | j                        fS r)   )r   logitr   r/   s    r   _natural_paramszBernoulli._natural_params   s    DJJ'))r    c                 R    t        j                  t        j                  |            S r)   )r   log1pexp)r   xs     r   _log_normalizerzBernoulli._log_normalizer   s    {{599Q<((r    )NNNr)   )T) __name__
__module____qualname____doc__r   unit_intervalrealarg_constraintsbooleansupporthas_enumerate_support_mean_carrier_measurer   r$   r,   propertyr0   r3   r6   r   r   r   r<   r   r   rC   rJ   rL   rW   rZ   r_   __classcell__)r   s   @r   r   r      s    $ !, 9 9[EUEUVO!!G C$0    
 - - ; ; < < " " #-%**, =
R

 * *)r    )numbersr   r   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   r   r	   r
   torch.nn.functionalr   __all__r    r    r   <module>rt      s<       + <  A -p)! p)r    