U
    9%e!                     @   sv   d dl Z d dlmZ 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mZ d dlmZ dgZG dd deZdS )	    N)Number)constraints)ExponentialFamily)broadcast_allclamp_probslazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logitsContinuousBernoullic                       s  e Zd ZdZejejdZejZdZ	dZ
d/ fdd	Zd0 fd	d
	Zdd Zdd Z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 fdd Ze fd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Z ed+d, Z!d-d. Z"  Z#S )1r   a  
    Creates a continuous Bernoulli distribution parameterized by :attr:`probs`
    or :attr:`logits` (but not both).

    The distribution is supported in [0, 1] and parameterized by 'probs' (in
    (0,1)) or 'logits' (real-valued). Note that, unlike the Bernoulli, 'probs'
    does not correspond to a probability and 'logits' does not correspond to
    log-odds, but the same names are used due to the similarity with the
    Bernoulli. See [1] for more details.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> m = ContinuousBernoulli(torch.tensor([0.3]))
        >>> m.sample()
        tensor([ 0.2538])

    Args:
        probs (Number, Tensor): (0,1) valued parameters
        logits (Number, Tensor): real valued parameters whose sigmoid matches 'probs'

    [1] The continuous Bernoulli: fixing a pervasive error in variational
    autoencoders, Loaiza-Ganem G and Cunningham JP, NeurIPS 2019.
    https://arxiv.org/abs/1907.06845
    )probslogitsr   TNgV-?gx&1?c                    s   |d k|d kkrt d|d k	rjt|t}t|\| _|d k	r\| jd | j s\t dt| j| _nt|t}t|\| _	|d k	r| jn| j	| _
|rt }n
| j
 }|| _t j||d d S )Nz;Either `probs` or `logits` must be specified, but not both.r   z&The parameter probs has invalid valuesvalidate_args)
ValueError
isinstancer   r   r   arg_constraintscheckallr   r   _paramtorchSizesize_limssuper__init__)selfr   r   Zlimsr   Z	is_scalarbatch_shape	__class__ g/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/distributions/continuous_bernoulli.pyr   2   s&    



zContinuousBernoulli.__init__c                    s~   |  t|}| j|_t|}d| jkr>| j||_|j|_d| jkr^| j	||_	|j	|_t
t|j|dd | j|_|S )Nr   r   Fr   )Z_get_checked_instancer   r   r   r   __dict__r   expandr   r   r   r   _validate_args)r   r   Z	_instancenewr   r!   r"   r$   M   s    


zContinuousBernoulli.expandc                 O   s   | j j||S N)r   r&   )r   argskwargsr!   r!   r"   _new[   s    zContinuousBernoulli._newc                 C   s,   t t | j| jd t | j| jd S )Nr      )r   maxler   r   gtr   r!   r!   r"   _outside_unstable_region^   s     z,ContinuousBernoulli._outside_unstable_regionc                 C   s&   t |  | j| jd t | j S )Nr   )r   wherer0   r   r   	ones_liker/   r!   r!   r"   
_cut_probsc   s
    zContinuousBernoulli._cut_probsc              	   C   s   |   }tt|d|t|}tt|d|t|}ttt	| t| tt|dt	d| td| d  }t
| jd d}tddd|  |  }t|  ||S )zLcomputes the log normalizing constant as a function of the 'probs' parameter      ?g              @      ?   gUUUUUU?g'}'}@)r3   r   r1   r-   
zeros_likeger2   logabslog1ppowr   mathr0   )r   	cut_probsZcut_probs_below_halfZcut_probs_above_halflog_normxtaylorr!   r!   r"   _cont_bern_log_normj   s.    
  
  
z'ContinuousBernoulli._cont_bern_log_normc                 C   sj   |   }|d| d  dt| t|   }| jd }dddt|d  |  }t|  ||S )Nr5   r6   r4   gUUUUUU?gll?r7   )r3   r   r<   r:   r   r=   r1   r0   )r   r?   ZmusrA   rB   r!   r!   r"   mean~   s    
zContinuousBernoulli.meanc                 C   s   t | jS r'   )r   sqrtvariancer/   r!   r!   r"   stddev   s    zContinuousBernoulli.stddevc                 C   s   |   }||d  tdd|  d dtt| t| d  }t| jd d}ddd|  |  }t|  ||S )Nr6   r5   r7   r4   gUUUUUU?g?ggjV?)r3   r   r=   r<   r:   r   r1   r0   )r   r?   varsrA   rB   r!   r!   r"   rF      s    
  zContinuousBernoulli.variancec                 C   s   t | jddS NT)Z	is_binary)r	   r   r/   r!   r!   r"   r      s    zContinuousBernoulli.logitsc                 C   s   t t| jddS rI   )r   r   r   r/   r!   r!   r"   r      s    zContinuousBernoulli.probsc                 C   s
   | j  S r'   )r   r   r/   r!   r!   r"   param_shape   s    zContinuousBernoulli.param_shapec              
   C   sL   |  |}tj|| jj| jjd}t  | |W  5 Q R  S Q R X d S N)dtypedevice)_extended_shaper   randr   rL   rM   Zno_gradicdfr   Zsample_shapeshapeur!   r!   r"   sample   s    

zContinuousBernoulli.samplec                 C   s,   |  |}tj|| jj| jjd}| |S rK   )rN   r   rO   r   rL   rM   rP   rQ   r!   r!   r"   rsample   s    
zContinuousBernoulli.rsamplec                 C   s8   | j r| | t| j|\}}t||dd |   S )Nnone)Z	reduction)r%   _validate_sampler   r   r
   rC   )r   valuer   r!   r!   r"   log_prob   s    
zContinuousBernoulli.log_probc              
   C   s   | j r| | |  }t||td| d|  | d d| d  }t|  ||}tt|dt|tt	|dt
||S )Nr6   r5   g        )r%   rW   r3   r   r=   r1   r0   r-   r8   r9   r2   )r   rX   r?   ZcdfsZunbounded_cdfsr!   r!   r"   cdf   s     


zContinuousBernoulli.cdfc              	   C   sT   |   }t|  t| |d| d   t|  t|t|   |S )Nr5   r6   )r3   r   r1   r0   r<   r:   )r   rX   r?   r!   r!   r"   rP      s    
zContinuousBernoulli.icdfc                 C   s4   t | j }t | j}| j||  |   | S r'   )r   r<   r   r:   rD   rC   )r   Z
log_probs0Z
log_probs1r!   r!   r"   entropy   s    zContinuousBernoulli.entropyc                 C   s   | j fS r'   )r   r/   r!   r!   r"   _natural_params   s    z#ContinuousBernoulli._natural_paramsc                 C   s   t t || jd d t || jd d }t ||| jd d t | }t t t 	|d t t | }d| t 
|dd  t 
|dd  }t |||S )	zLcomputes the log normalizing constant as a function of the natural parameterr   r4   r+   r6   r7   g      8@   g     @)r   r,   r-   r   r.   r1   r2   r:   r;   expr=   )r   rA   Zout_unst_regZcut_nat_paramsr@   rB   r!   r!   r"   _log_normalizer   s       (z#ContinuousBernoulli._log_normalizer)NNr   N)N)$__name__
__module____qualname____doc__r   Zunit_intervalrealr   ZsupportZ_mean_carrier_measureZhas_rsampler   r$   r*   r0   r3   rC   propertyrD   rG   rF   r   r   r   rJ   r   r   rT   rU   rY   rZ   rP   r[   r\   r_   __classcell__r!   r!   r   r"   r      sH          
	

	


		
)r>   numbersr   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   r   r   r   r	   Ztorch.nn.functionalr
   __all__r   r!   r!   r!   r"   <module>   s   