
    9j                         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y)
    N)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z  dz  deez  dz  dedz  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j4                  fd       Z ej4                         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/|t        d      t        |t              }t        |      \  | _        || j                  n| j                  | _        |rt        j                         }n| j                  j                         }t        | 1  ||       y )Nz;Either `probs` or `logits` must be specified, but not both.zlogits is unexpectedly Noner   )
ValueError
isinstancer   r   r   AssertionErrorr   _paramtorchSizesizesuper__init__)selfr   r   r   	is_scalarbatch_shape	__class__s         ]/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributions/bernoulli.pyr   zBernoulli.__init__/   s     TMv~.M  "5'2I)%0MTZ~$%BCC"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.expandJ   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._newW   s    t{{///r$   c                     | j                   S r-   r   r   s    r#   meanzBernoulli.meanZ   s    zzr$   c                     | j                   dk\  j                  | j                         }t        || j                   dk(  <   |S )Ng      ?)r   tor   )r   modes     r#   r7   zBernoulli.mode^   s7    

c!%%djj1"%TZZ3r$   c                 :    | j                   d| j                   z
  z  S )N   r2   r3   s    r#   variancezBernoulli.varianced   s    zzQ^,,r$   c                 0    t        | j                  d      S NT)	is_binary)r
   r   r3   s    r#   r   zBernoulli.logitsh   s    tzzT::r$   c                 0    t        | j                  d      S r<   )r	   r   r3   s    r#   r   zBernoulli.probsl   s    t{{d;;r$   c                 6    | j                   j                         S r-   )r   r   r3   s    r#   param_shapezBernoulli.param_shapep   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.samplet   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_proby   s?    !!%(%dkk590&QQQr$   c                 F    t        | j                  | j                  d      S rI   )r   r   r   r3   s    r#   entropyzBernoulli.entropy   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))r9   )	r   aranger   rS   rT   viewlen_batch_shaper(   )r   r(   valuess      r#   enumerate_supportzBernoulli.enumerate_support   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   r3   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   boolr   r(   r0   propertyr4   r7   r:   r   r   r   r   r   r@   rG   rN   rP   r[   tupler^   rc   __classcell__)r"   s   @r#   r   r      s~   * !, 9 9[EUEUVO!!G  )-)-%)	C%C $&C d{	C
 
C6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   r   __all__r    r$   r#   <module>rz      s>      + <  A ' -})! })r$   