
    Vh                         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 dgZ G d	 de      Zy)
    N)nanTensor)constraints)ExponentialFamily)broadcast_alllazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logits)_Number	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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j0                  fd       Z ej0                         fdZd Zd ZddZedee   f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         M/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributions/bernoulli.pyr   zBernoulli.__init__,   s    TMv~.M  "5'2I)%0MTZ"673I*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!   returnc                     | 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    r5   zBernoulli.modeR   s7    

c!%%djj1"%TZZ3r!   c                 :    | j                   d| j                   z
  z  S )N   r0   r1   s    r    variancezBernoulli.varianceX   s    zzQ^,,r!   c                 0    t        | j                  d      S NT)	is_binary)r
   r   r1   s    r    r   zBernoulli.logits\   s    tzzT::r!   c                 0    t        | j                  d      S r:   )r	   r   r1   s    r    r   zBernoulli.probs`   s    t{{d;;r!   c                 6    | j                   j                         S r*   )r   r   r1   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 rG   )r   r   r   r1   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))r7   )	r   aranger   rQ   rR   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   r1   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-   propertyr   r2   r5   r8   r   r   r   r   r   r>   rE   rL   rN   rY   tupler\   ra   __classcell__)r   s   @r    r   r      s3   & !, 9 9[EUEUVO!!G C$0 f   f  
 -& - - ; ; ; <v < < "UZZ " " #-%**, =
R

 *v * *)r!   )r   r   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   r   r	   r
   torch.nn.functionalr   torch.typesr   __all__r    r!   r    <module>rw      s<      + <  A  -q)! q)r!   