a
    MSic                     @   s^   d dl Z d dlm  mZ d dlmZ d dlmZ d dl	m
Z
mZmZmZ G dd deZdS )    N)constraints)Distribution)broadcast_allprobs_to_logitslazy_propertylogits_to_probsc                       s   e Zd ZdZededdejdZej	Z
d fdd	Zd  fd	d
	Z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dd Ze fddZdd Z  ZS )!NegativeBinomialao  
    Creates a Negative Binomial distribution, i.e. distribution
    of the number of successful independent and identical Bernoulli trials
    before :attr:`total_count` failures are achieved. The probability
    of success of each Bernoulli trial is :attr:`probs`.

    Args:
        total_count (float or Tensor): non-negative number of negative Bernoulli
            trials to stop, although the distribution is still valid for real
            valued count
        probs (Tensor): Event probabilities of success in the half open interval [0, 1)
        logits (Tensor): Event log-odds for probabilities of success
    r                 ?)total_countprobslogitsNc                    s   |d u |d u krt d|d urDt||\| _| _| j| j| _n"t||\| _| _| j| j| _|d urt| jn| j| _| j }tt	| j
||d d S )Nz;Either `probs` or `logits` must be specified, but not both.validate_args)
ValueErrorr   r   r   type_asr   _paramsizesuperr   __init__)selfr   r   r   r   batch_shape	__class__ a/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/distributions/negative_binomial.pyr      s    
zNegativeBinomial.__init__c                    s   |  t|}t|}| j||_d| jv rD| j||_|j|_d| jv rd| 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   )   s    


zNegativeBinomial.expandc                 O   s   | j j|i |S N)r   r#   )r   argskwargsr   r   r   _new7   s    zNegativeBinomial._newc                 C   s   | j t| j S r$   )r   r   expr   r   r   r   r   mean:   s    zNegativeBinomial.meanc                 C   s    | j d | j   jddS )N   r	   )min)r   r   r(   floorclampr)   r   r   r   mode>   s    zNegativeBinomial.modec                 C   s   | j t| j  S r$   )r*   r   sigmoidr   r)   r   r   r   varianceB   s    zNegativeBinomial.variancec                 C   s   t | jddS NT)	is_binary)r   r   r)   r   r   r   r   F   s    zNegativeBinomial.logitsc                 C   s   t | jddS r2   )r   r   r)   r   r   r   r   J   s    zNegativeBinomial.probsc                 C   s
   | j  S r$   )r   r   r)   r   r   r   param_shapeN   s    zNegativeBinomial.param_shapec                 C   s   t jj| jt | j ddS )NF)concentrationrater   )r   distributionsGammar   r(   r   r)   r   r   r   _gammaR   s    
zNegativeBinomial._gammac                 C   sD   t  ( | jj|d}t |W  d    S 1 s60    Y  d S )N)sample_shape)r   no_gradr9   samplepoisson)r   r:   r6   r   r   r   r<   Y   s    
zNegativeBinomial.samplec                 C   sz   | j r| | | jt| j  |t| j  }t| j|  td|  t| j }d|| j| dk< || S )Nr
   r	   )r!   _validate_sampler   F
logsigmoidr   r   lgamma)r   valueZlog_unnormalized_probZlog_normalizationr   r   r   log_prob^   s    

zNegativeBinomial.log_prob)NNN)N)__name__
__module____qualname____doc__r   greater_than_eqhalf_open_intervalrealarg_constraintsnonnegative_integersupportr   r   r'   propertyr*   r/   r1   r   r   r   r4   r9   r   r   r<   rC   __classcell__r   r   r   r   r      s2   







r   )r   Ztorch.nn.functionalnn
functionalr?   Ztorch.distributionsr    torch.distributions.distributionr   torch.distributions.utilsr   r   r   r   r   r   r   r   r   <module>   s
   