
    Ǆgu                     ^    d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 dgZ
d Z G d de      Zy)    N)constraints)Distribution)broadcast_alllazy_propertylogits_to_probsprobs_to_logitsBinomialc                 X    | j                  d      | z   | j                  d      z
  dz  S )Nr   )minmax   )clamp)xs    d/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/distributions/binomial.py_clamp_by_zeror      s+    GGGNQQ/144    c                   R    e Zd ZdZej
                  ej                  ej                  dZdZ	d fd	Z
d fd	Zd Z ej                  dd      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 xZS )r	   a  
    Creates a Binomial distribution parameterized by :attr:`total_count` and
    either :attr:`probs` or :attr:`logits` (but not both). :attr:`total_count` must be
    broadcastable with :attr:`probs`/:attr:`logits`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> m = Binomial(100, torch.tensor([0 , .2, .8, 1]))
        >>> x = m.sample()
        tensor([   0.,   22.,   71.,  100.])

        >>> m = Binomial(torch.tensor([[5.], [10.]]), torch.tensor([0.5, 0.8]))
        >>> x = m.sample()
        tensor([[ 4.,  5.],
                [ 7.,  6.]])

    Args:
        total_count (int or Tensor): number of Bernoulli trials
        probs (Tensor): Event probabilities
        logits (Tensor): Event log-odds
    )total_countprobslogitsTc                    |d u |d u k(  rt        d      |Dt        ||      \  | _        | _        | j                  j	                  | j                        | _        nCt        ||      \  | _        | _        | j                  j	                  | j
                        | _        || j                  n| j
                  | _        | j                  j                         }t        | %  ||       y )Nz;Either `probs` or `logits` must be specified, but not both.validate_args)

ValueErrorr   r   r   type_asr   _paramsizesuper__init__)selfr   r   r   r   batch_shape	__class__s         r   r    zBinomial.__init__3   s    TMv~.M   k51 
#//77

CD
 k62 #//77DD$)$5djj4;;kk&&(MBr   c                    | j                  t        |      }t        j                  |      }| j                  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	   torchSizer   expand__dict__r   r   r   r   r    _validate_args)r!   r"   	_instancenewr#   s       r   r(   zBinomial.expandI   s    ((9=jj-**11+>dmm#

))+6CICJt}}$++K8CJCJh%k%G!00
r   c                 :     | j                   j                  |i |S N)r   r,   )r!   argskwargss      r   _newzBinomial._newW   s    t{{///r   r   )is_discrete	event_dimc                 B    t        j                  d| j                        S )Nr   )r   integer_intervalr   r!   s    r   supportzBinomial.supportZ   s    ++At/?/?@@r   c                 4    | j                   | j                  z  S r.   r   r   r6   s    r   meanzBinomial.mean^   s    $**,,r   c                     | j                   dz   | j                  z  j                         j                  | j                         S )N   r   )r   r   floorr   r6   s    r   modezBinomial.modeb   s9    !!A%3::<BBtGWGWBXXr   c                 T    | j                   | j                  z  d| j                  z
  z  S Nr<   r9   r6   s    r   variancezBinomial.variancef   s$    $**,DJJ??r   c                 0    t        | j                  d      S NT)	is_binary)r   r   r6   s    r   r   zBinomial.logitsj   s    tzzT::r   c                 0    t        | j                  d      S rC   )r   r   r6   s    r   r   zBinomial.probsn   s    t{{d;;r   c                 6    | j                   j                         S r.   )r   r   r6   s    r   param_shapezBinomial.param_shaper   s    {{!!r   c                    | j                  |      }t        j                         5  t        j                  | j                  j                  |      | j                  j                  |            cd d d        S # 1 sw Y   y xY wr.   )_extended_shaper&   no_gradbinomialr   r(   r   )r!   sample_shapeshapes      r   samplezBinomial.samplev   sa    $$\2]]_ 	>>  ''.

0A0A%0H	 	 	s   AA88Bc           	         | j                   r| j                  |       t        j                  | j                  dz         }t        j                  |dz         }t        j                  | j                  |z
  dz         }| j                  t        | j                        z  | j                  t        j                  t        j                  t        j                  | j                                     z  z   |z
  }|| j                  z  |z
  |z
  |z
  S r@   )
r*   _validate_sampler&   lgammar   r   r   log1pexpabs)r!   valuelog_factorial_nlog_factorial_klog_factorial_nmknormalize_terms         r   log_probzBinomial.log_prob}   s    !!%(,,t'7'7!';<,,uqy1!LL)9)9E)AA)EF ~dkk::UYY		$++8N7N-O!PPQ 	 DKK/14EEV	
r   c                 (   t        | j                  j                               }| j                  j                         |k(  st	        d      | j                  | j                  d            }t        j                  |      |z  j                  d       S )Nz5Inhomogeneous total count not supported by `entropy`.Fr   )
intr   r   r   NotImplementedErrorrZ   enumerate_supportr&   rS   sum)r!   r   rZ   s      r   entropyzBinomial.entropy   s    $**..01##%4%G  ==!7!7!>?8$x/44Q777r   c                    t        | j                  j                               }| j                  j                         |k(  st	        d      t        j                  d|z   | j                  j                  | j                  j                        }|j                  ddt        | j                        z  z         }|r|j                  d| j                  z         }|S )Nz?Inhomogeneous total count not supported by `enumerate_support`.r<   )dtypedevice))r<   )r\   r   r   r   r]   r&   aranger   rb   rc   viewlen_batch_shaper(   )r!   r(   r   valuess       r   r^   zBinomial.enumerate_support   s    $**..01##%4%Q  O4;;#4#4T[[=O=O
 UTC0A0A,B%BBC]]54+<+<#<=Fr   )r<   NNNr.   )T)__name__
__module____qualname____doc__r   nonnegative_integerunit_intervalrealarg_constraintshas_enumerate_supportr    r(   r1   dependent_propertyr7   propertyr:   r>   rA   r   r   r   rG   r&   r'   rN   rZ   r`   r^   __classcell__)r#   s   @r   r	   r	      s   . #66**""O
 !C,0 $[##BA CA - - Y Y @ @ ; ; < < " " #-%**, 
(8r   )r&   torch.distributionsr    torch.distributions.distributionr   torch.distributions.utilsr   r   r   r   __all__r   r	    r   r   <module>r{      s4     + 9  ,5
R| Rr   