U
    5Ç-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-²ïß?gÕxé&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	| _
|r¤t ¡ }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__© úi/var/www/html/Darija-Ai-Train/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   