
    j                         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 )
    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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<|t          d          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.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         g/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/torch/distributions/bernoulli.pyr   zBernoulli.__init__/   s     TMv~..M   "5'22I)%00MTZZ~$%BCCC"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.expandJ   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._newW   s    t{////r$   c                     | j         S r-   r   r   s    r#   meanzBernoulli.meanZ   s
    zr$   c                 r    | j         dk                        | j                   }t          || j         dk    <   |S )Ng      ?)r   tor   )r   modes     r#   r7   zBernoulli.mode^   s4    
c!%%dj11"%TZ3r$   c                 &    | j         d| j         z
  z  S )N   r2   r3   s    r#   variancezBernoulli.varianced   s    zQ^,,r$   c                 .    t          | j        d          S NT)	is_binary)r
   r   r3   s    r#   r   zBernoulli.logitsh   s    tzT::::r$   c                 .    t          | j        d          S r<   )r	   r   r3   s    r#   r   zBernoulli.probsl   s    t{d;;;;r$   c                 4    | j                                         S r-   )r   r   r3   s    r#   param_shapezBernoulli.param_shapep   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.samplet   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_proby   sN     	)!!%(((%dk5990&QQQQQr$   c                 :    t          | j        | j        d          S rI   )r   r   r   r3   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))r9   )	r   aranger   rS   rT   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   r3   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   boolr   r(   r0   propertyr4   r7   r:   r   r   r   r   r   r@   rG   rN   rP   r[   tupler^   rc   __classcell__)r"   s   @r#   r   r      sp        * !, 9[EUVVO!G  )-)-%)	C C%C $&C d{	C
 
C C C C C C6     0 0 0 f    X f    X
 -& - - - X- ; ; ; ; ]; <v < < < ]< "UZ " " " X" #-%*,, = = = =
R R R
 
 

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