U
    ©Ê¹jX  ã                   @   sZ   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d„ ZG dd„ deƒZdS )	é    N)Ú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   ú[/var/www/html/bwave/python/venv/lib/python3.8/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$‡ fdd„	Z
d%‡ fdd	„	Zd
d„ Zejddd�dd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe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-deterinistic")
        >>> 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é   Nc                    sš   |d k|d kkrt dƒ‚|d k	rDt||ƒ\| _| _| j | j¡| _n"t||ƒ\| _| _| j | j¡| _|d k	rt| jn| j| _| j ¡ }tƒ j	||d� d S )Nz;Either `probs` or `logits` must be specified, but not both.©Úvalidate_args)
Ú
ValueErrorr   r   r   Ztype_asr   Ú_paramÚsizeÚsuperÚ__init__)Úselfr   r   r   r   Úbatch_shape©Ú	__class__r   r   r   1   s$    ÿýý
zBinomial.__init__c                    s„   |   t|¡}t |¡}| j |¡|_d| jkrD| j |¡|_|j|_d| jkrd| j	 |¡|_	|j	|_t
t|ƒj|dd� | j|_|S )Nr   r   Fr   )Z_get_checked_instancer   ÚtorchÚSizer   ÚexpandÚ__dict__r   r   r   r   r   Ú_validate_args)r   r   Z	_instanceÚnewr   r   r   r#   G   s    


zBinomial.expandc                 O   s   | j j||ŽS ©N)r   r&   )r   ÚargsÚkwargsr   r   r   Ú_newU   s    zBinomial._newr   )Zis_discreteZ	event_dimc                 C   s   t  d| j¡S )Nr   )r   Zinteger_intervalr   ©r   r   r   r   ÚsupportX   s    zBinomial.supportc                 C   s   | j | j S r'   ©r   r   r+   r   r   r   Úmean\   s    zBinomial.meanc                 C   s   | j d | j  ¡ j| j d�S )Nr   r
   )r   r   Úfloorr   r+   r   r   r   Úmode`   s    zBinomial.modec                 C   s   | j | j d| j  S ©Nr   r-   r+   r   r   r   Úvarianced   s    zBinomial.variancec                 C   s   t | jdd�S ©NT)Z	is_binary)r   r   r+   r   r   r   r   h   s    zBinomial.logitsc                 C   s   t | jdd�S r3   )r   r   r+   r   r   r   r   l   s    zBinomial.probsc                 C   s
   | j  ¡ S r'   )r   r   r+   r   r   r   Úparam_shapep   s    zBinomial.param_shapec              
   C   sF   |   |¡}t ¡ �* t | j |¡| j |¡¡W  5 Q R £ S Q R X d S r'   )Z_extended_shaper!   Zno_gradZbinomialr   r#   r   )r   Zsample_shapeÚshaper   r   r   Úsamplet   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 r1   )
r%   Z_validate_sampler!   Úlgammar   r   r   Úlog1pÚexpÚabs)r   ÚvalueZlog_factorial_nZlog_factorial_kZlog_factorial_nmkZ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	   ÚNotImplementedErrorr<   Úenumerate_supportr!   r9   Úsum)r   r   r<   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ƒ  ¡}|rl| d| j ¡}|S )Nz?Inhomogeneous total count not supported by `enumerate_support`.r   )ÚdtypeÚdevice)éÿÿÿÿ)r   )r=   r   r   r	   r>   r!   Zaranger   rB   rC   ÚviewÚlenZ_batch_shaper#   )r   r#   r   Úvaluesr   r   r   r?   ™   s    ÿ  ÿzBinomial.enumerate_support)r   NNN)N)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Znonnegative_integerZunit_intervalÚrealZarg_constraintsZhas_enumerate_supportr   r#   r*   Zdependent_propertyr,   Úpropertyr.   r0   r2   r   r   r   r4   r!   r"   r6   r<   rA   r?   Ú__classcell__r   r   r   r   r      s6   ý







)r!   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.utilsr   r   r   r   Ú__all__r   r   r   r   r   r   Ú<module>   s   