
    9jQ                     j    d dl Z d dl m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)Tensor)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    \/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributions/binomial.py_clamp_by_zeror      s+    GGGNQQ/144    c                       e Zd ZdZej
                  ej                  ej                  dZdZ		 	 	 	 dde
ez  de
dz  de
dz  dedz  d	df
 fd
Zd fd	Zd Z ej                   dd      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 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logitsTNr   r   r   validate_argsreturnc                    |d u |d u k(  rt        d      |Dt        ||      \  | _        | _        | j                  j	                  | j                        | _        nP|t        d      t        ||      \  | _        | _        | j                  j	                  | j                        | _        || j                  n| j                  | _        | j                  j                         }t        | )  ||       y )Nz;Either `probs` or `logits` must be specified, but not both.zlogits is unexpectedly Noner   )
ValueErrorr   r   r   type_asAssertionErrorr   _paramsizesuper__init__)selfr   r   r   r   batch_shape	__class__s         r   r#   zBinomial.__init__7   s     TMv~.M  
 k51	 
#//77

CD~$%BCC
 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.expandW   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._newe   s    t{{///r   r   )is_discrete	event_dimc                 B    t        j                  d| j                        S )Nr   )r   integer_intervalr   r$   s    r   supportzBinomial.supporth   s     ++At/?/?@@r   c                 4    | j                   | j                  z  S r1   r   r   r9   s    r   meanzBinomial.meanm   s    $**,,r   c                     | j                   dz   | j                  z  j                         j                  | j                         S )N   r   )r   r   floorr   r9   s    r   modezBinomial.modeq   s9    !!A%3::<BBtGWGWBXXr   c                 T    | j                   | j                  z  d| j                  z
  z  S Nr?   r<   r9   s    r   variancezBinomial.varianceu   s$    $**,DJJ??r   c                 0    t        | j                  d      S NT)	is_binary)r	   r   r9   s    r   r   zBinomial.logitsy   s    tzzT::r   c                 0    t        | j                  d      S rF   )r   r   r9   s    r   r   zBinomial.probs}   s    t{{d;;r   c                 6    | j                   j                         S r1   )r    r!   r9   s    r   param_shapezBinomial.param_shape   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r1   )_extended_shaper)   no_gradbinomialr   r+   r   )r$   sample_shapeshapes      r   samplezBinomial.sample   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 rC   )
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   NotImplementedErrorr]   enumerate_supportr)   rV   sum)r$   r   r]   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    re   rf   viewlen_batch_shaper+   )r$   r+   r   valuess       r   ra   zBinomial.enumerate_support   s    $**..01##%4%Q  O4;;#4#4T[[=O=O
 UTC0A0A,B%BBC]]54+<+<#<=Fr   )r?   NNNr1   )T)!__name__
__module____qualname____doc__r   nonnegative_integerunit_intervalrealarg_constraintshas_enumerate_supportr   r_   boolr#   r+   r4   dependent_propertyr:   propertyr=   rA   rD   r   r   r   r)   r*   rJ   rQ   r]   rc   ra   __classcell__)r&   s   @r   r
   r
      s   2 #66**""O
 ! %&# $%)Cc\C }C 	C
 d{C 
C@0 $[##BA CA -f - - Yf Y Y @& @ @ ; ; ; <v < < "UZZ " " #-%**, 
(8r   )r)   r   torch.distributionsr    torch.distributions.distributionr   torch.distributions.utilsr   r   r   r	   __all__r   r
    r   r   <module>r      s9      + 9  ,5
_| _r   