
    rh                         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y)    )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j8                  fd       Z ej8                         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                  j                         }t        | -  ||       y )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         p/var/www/html/ai-insurance-compliance-backend/venv/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.expandG   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._newT   s    t{{///r%   c                     | j                   S r.   r   r    s    r$   meanzBernoulli.meanW   s    zzr%   c                     | j                   dk\  j                  | j                         }t        || j                   dk(  <   |S )Ng      ?)r   tor   )r    modes     r$   r8   zBernoulli.mode[   s7    

c!%%djj1"%TZZ3r%   c                 :    | j                   d| j                   z
  z  S )N   r3   r4   s    r$   variancezBernoulli.variancea   s    zzQ^,,r%   c                 0    t        | j                  d      S NT)	is_binary)r   r   r4   s    r$   r   zBernoulli.logitse   s    tzzT::r%   c                 0    t        | j                  d      S r=   )r   r   r4   s    r$   r   zBernoulli.probsi   s    t{{d;;r%   c                 6    | j                   j                         S r.   )r   r   r4   s    r$   param_shapezBernoulli.param_shapem   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.sampleq   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_probv   s?    !!%(%dkk590&QQQr%   c                 F    t        | j                  | j                  d      S rJ   )r   r   r   r4   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))r:   )	r   aranger   rT   rU   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   r4   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   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      s   ( !, 9 9[EUEUVO!!G  2626(,	Cffn-.C vv~./C  ~	C
 
C00 f   f  
 -& - - ; ; ; <v < < "UZZ " " #-%**, =
R

 *v * *)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)r%   