o
    eiQ                     @   sf   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d ZG d	d deZdS )
    N)Tensor)constraints)Distribution)broadcast_alllazy_propertylogits_to_probsprobs_to_logitsBinomialc                 C   s    | j dd|  | j dd d S )Nr   )minmax   )clamp)x r   f/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/distributions/binomial.py_clamp_by_zero   s    r   c                       s*  e Zd ZdZejejejdZdZ					d)de
eB de
dB de
dB d	edB d
df
 fddZd* fdd	Zdd Zejddddd Zed
e
fddZed
e
fddZed
e
fddZed
e
fddZed
e
fddZed
ejfdd Ze fd!d"Zd#d$ Zd%d& Zd+d'd(Z  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                    s   |d u |d u krt d|d ur"t||\| _| _| j| j| _n|d u r*tdt||\| _| _| j| j| _|d urB| jn| j| _| j }t	 j
||d 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__r   r   r    7   s(   
zBinomial.__init__c                    s   |  t|}t|}| j||_d| jv r"| j||_|j|_d| jv r2| j	||_	|j	|_t
t|j|dd | j|_|S )Nr   r   Fr   )_get_checked_instancer	   torchSizer   expand__dict__r   r   r   r   r    _validate_args)r!   r"   	_instancenewr#   r   r   r(   W   s   


zBinomial.expandc                 O   s   | j j|i |S N)r   r,   )r!   argskwargsr   r   r   _newe   s   zBinomial._newr   )is_discrete	event_dimc                 C   s   t d| jS )Nr   )r   integer_intervalr   r!   r   r   r   supporth   s   zBinomial.supportc                 C   s   | j | j S r-   r   r   r4   r   r   r   meanm   s   zBinomial.meanc                 C   s   | j d | j  j| j dS )Nr   r   )r   r   floorr   r4   r   r   r   modeq   s   zBinomial.modec                 C   s   | j | j d| j  S Nr   r6   r4   r   r   r   varianceu   s   zBinomial.variancec                 C      t | jddS NT)	is_binary)r   r   r4   r   r   r   r   y      zBinomial.logitsc                 C   r<   r=   )r   r   r4   r   r   r   r   }   r?   zBinomial.probsc                 C   s
   | j  S r-   )r   r   r4   r   r   r   param_shape   s   
zBinomial.param_shapec                 C   sR   |  |}t  t| j|| j|W  d    S 1 s"w   Y  d S r-   )_extended_shaper&   no_gradbinomialr   r(   r   )r!   sample_shapeshaper   r   r   sample   s   

$zBinomial.samplec              	   C   s   | j r| | t| jd }t|d }t| j| d }| jt| j | jttt	| j   | }|| j | | | S r:   )
r*   _validate_sampler&   lgammar   r   r   log1pexpabs)r!   valuelog_factorial_nlog_factorial_klog_factorial_nmknormalize_termr   r   r   log_prob   s   
zBinomial.log_probc                 C   sJ   t | j }| j |kstd| | d}t|| 	d S )Nz5Inhomogeneous total count not supported by `entropy`.Fr   )
intr   r   r
   NotImplementedErrorrQ   enumerate_supportr&   rJ   sum)r!   r   rQ   r   r   r   entropy   s   zBinomial.entropyc                 C   sp   t | j }| j |kstdtjd| | jj| jj	d}|
ddt| j  }|r6|d| j }|S )Nz?Inhomogeneous total count not supported by `enumerate_support`.r   )dtypedevice))r   )rR   r   r   r
   rS   r&   aranger   rW   rX   viewlen_batch_shaper(   )r!   r(   r   valuesr   r   r   rT      s   zBinomial.enumerate_support)r   NNNr-   )T)!__name__
__module____qualname____doc__r   nonnegative_integerunit_intervalrealarg_constraintshas_enumerate_supportr   rR   boolr    r(   r0   dependent_propertyr5   propertyr7   r9   r;   r   r   r   r&   r'   r@   rF   rQ   rV   rT   __classcell__r   r   r#   r   r	      sT     

)r&   r   torch.distributionsr    torch.distributions.distributionr   torch.distributions.utilsr   r   r   r   __all__r   r	   r   r   r   r   <module>   s   