
    jQ                     r    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dS )	    N)Tensor)constraints)Distribution)broadcast_alllazy_propertylogits_to_probsprobs_to_logitsBinomialc                 h    |                      d          | z   |                      d          z
  dz  S )Nr   )minmax   )clamp)xs    f/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/torch/distributions/binomial.py_clamp_by_zeror      s/    GGGNNQ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j        fd            Z ej                    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logitsT   Nr   r   r   validate_argsreturnc                    |d u |d u k    rt          d          |Bt          ||          \  | _        | _        | j                            | j                  | _        nR|t          d          t          ||          \  | _        | _        | j                            | j                  | _        || j        n| j        | _        | j                                        }t                      
                    ||           d S )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1	 
#/77
CCD~$%BCCC
 k622	 #/77DDD$)$5djj4;k&&((MBBBBBr   c                    |                      t          |          }t          j        |          }| j                            |          |_        d| j        v r+| j                            |          |_        |j        |_        d| j        v r+| 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==j--*11+>>dm##
))+66CICJt}$$++K88CJCJh%%k%GGG!0
r   c                 &     | j         j        |i |S N)r!   r0   )r%   argskwargss      r   _newzBinomial._newe   s    t{////r   r   )is_discrete	event_dimc                 6    t          j        d| j                  S )Nr   )r   integer_intervalr   r%   s    r   supportzBinomial.supporth   s     +At/?@@@r   c                      | j         | j        z  S r2   r   r   r:   s    r   meanzBinomial.meanm   s    $*,,r   c                 |    | j         dz   | j        z                                                      | j                   S )Nr   r   )r   r   floorr   r:   s    r   modezBinomial.modeq   s7    !A%3::<<BBtGWBXXXr   c                 6    | j         | j        z  d| j        z
  z  S Nr   r=   r:   s    r   variancezBinomial.varianceu   s    $*,DJ??r   c                 .    t          | j        d          S NT)	is_binary)r	   r   r:   s    r   r   zBinomial.logitsy   s    tzT::::r   c                 .    t          | j        d          S rF   )r   r   r:   s    r   r   zBinomial.probs}   s    t{d;;;;r   c                 4    | j                                         S r2   )r!   r"   r:   s    r   param_shapezBinomial.param_shape   s    {!!!r   c                    |                      |          }t          j                    5  t          j        | j                            |          | j                            |                    cd d d            S # 1 swxY w Y   d S r2   )_extended_shaper*   no_gradbinomialr   r,   r   )r%   sample_shapeshapes      r   samplezBinomial.sample   s    $$\22]__ 	 	> ''..
0A0A%0H0H 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA;;A?A?c           	         | j         r|                     |           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!';<<,uqy11!L)9E)AA)EFF ~dk:::UY	$+8N8N7N-O-O!P!PPQ 	 DK/14EEV	
r   c                 L   t          | j                                                  }| j                                        |k    st	          d          |                     |                     d                    }t          j        |          |z  	                    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011##%%44%G   ==!7!7!>!>??8$$x/44Q7777r   c                    t          | j                                                  }| j                                        |k    st	          d          t          j        d|z   | j        j        | j        j	                  }|
                    ddt          | j                  z  z             }|r|                    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011##%%44%Q   O4;#4T[=O
 
 
 UTC0A,B,B%BBCC 	>]]54+<#<==Fr   )r   NNNr2   )T)!__name__
__module____qualname____doc__r   nonnegative_integerunit_intervalrealarg_constraintshas_enumerate_supportr   r_   boolr$   r,   r5   dependent_propertyr;   propertyr>   rA   rD   r   r   r   r*   r+   rJ   rQ   r]   rc   ra   __classcell__)r'   s   @r   r
   r
      sw        2 #6*" O
 ! %&# $%)C Cc\C }C 	C
 d{C 
C C C C C C@     0 0 0 $[#BBBA A CBA -f - - - X- Yf Y Y Y XY @& @ @ @ X@ ; ; ; ; ]; <v < < < ]< "UZ " " " X" #-%*,,    
 
 
(8 8 8       r   )r*   r   torch.distributionsr    torch.distributions.distributionr   torch.distributions.utilsr   r   r   r	   __all__r   r
    r   r   <module>r      s           + + + + + + 9 9 9 9 9 9            ,5 5 5
_ _ _ _ _| _ _ _ _ _r   