o
    ߗiG"                     @   s   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 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)_sizeContinuousBernoullic                       s  e Zd ZdZejejdZejZdZ	dZ
	d1 fdd	Zd2 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!ed"ejfd#d$Zd%d& Zd'd( Z d)d* Z!d+d, Z"ed-d. Z#d/d0 Z$  Z%S )3r   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-deterministic")
        >>> 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 u |d u krt d|d ur5t|t}t|\| _|d ur.| jd | j s.t dt| j| _nt|t}t|\| _	|d urG| jn| j	| _
|rRt }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   limsr   	is_scalarbatch_shape	__class__ f/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/distributions/continuous_bernoulli.pyr   5   s&   



zContinuousBernoulli.__init__c                    s~   |  t|}| j|_t|}d| jv r| j||_|j|_d| jv r/| j	||_	|j	|_t
t|j|dd | j|_|S )Nr   r   Fr   )_get_checked_instancer   r   r   r   __dict__r   expandr   r   r   r   _validate_args)r   r!   	_instancenewr"   r$   r%   r(   P   s   


zContinuousBernoulli.expandc                 O   s   | j j|i |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_regiona   s   $z,ContinuousBernoulli._outside_unstable_regionc                 C   s&   t |  | j| jd t | j S )Nr   )r   wherer5   r   r   	ones_liker4   r$   r$   r%   
_cut_probsf   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'}'}@)r8   r   r6   r2   
zeros_likeger7   logabslog1ppowr   mathr5   )r   	cut_probscut_probs_below_halfcut_probs_above_halflog_normxtaylorr$   r$   r%   _cont_bern_log_normm   s&   
z'ContinuousBernoulli._cont_bern_log_normc                 C   sj   |   }|d| d  dt| t|   }| jd }dddt|d  |  }t|  ||S )Nr:   r;   r9   gUUUUUU?gll?r<   )r8   r   rA   r?   r   rB   r6   r5   )r   rD   musrH   rI   r$   r$   r%   mean   s   
zContinuousBernoulli.meanc                 C   s   t | jS r,   )r   sqrtvariancer4   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 )Nr;   r:   r<   r9   gUUUUUU?g?ggjV?)r8   r   rB   rA   r?   r   r6   r5   )r   rD   varsrH   rI   r$   r$   r%   rN      s    zContinuousBernoulli.variancec                 C   s   t | jddS NT)	is_binary)r	   r   r4   r$   r$   r%   r      s   zContinuousBernoulli.logitsc                 C   s   t t| jddS rQ   )r   r   r   r4   r$   r$   r%   r      s   zContinuousBernoulli.probsc                 C   s
   | j  S r,   )r   r   r4   r$   r$   r%   param_shape   s   
zContinuousBernoulli.param_shapec                 C   sX   |  |}tj|| jj| jjd}t  | |W  d    S 1 s%w   Y  d S N)dtypedevice)_extended_shaper   randr   rU   rV   no_gradicdfr   sample_shapeshapeur$   r$   r%   sample   s
   

$zContinuousBernoulli.sampler\   returnc                 C   s,   |  |}tj|| jj| jjd}| |S rT   )rW   r   rX   r   rU   rV   rZ   r[   r$   r$   r%   rsample   s   

zContinuousBernoulli.rsamplec                 C   s8   | j r| | t| j|\}}t||dd |   S )Nnone)	reduction)r)   _validate_sampler   r   r
   rJ   )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 )Nr;   r:   g        )r)   rd   r8   r   rB   r6   r5   r2   r=   r>   r7   )r   re   rD   cdfsunbounded_cdfsr$   r$   r%   cdf   s    


zContinuousBernoulli.cdfc              	   C   sT   |   }t|  t| |d| d   t|  t|t|   |S )Nr:   r;   )r8   r   r6   r5   rA   r?   )r   re   rD   r$   r$   r%   rZ      s   
zContinuousBernoulli.icdfc                 C   s4   t | j }t | j}| j||  |   | S r,   )r   rA   r   r?   rL   rJ   )r   
log_probs0
log_probs1r$   r$   r%   entropy   s   zContinuousBernoulli.entropyc                 C   s   | j fS r,   )r   r4   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 j	
|t t | }d| t |dd  t |dd  }t |||S )zLcomputes the log normalizing constant as a function of the natural parameterr   r9   r0   r<   g      8@   g     @)r   r1   r2   r   r3   r6   r7   r?   r@   specialexpm1rB   )r   rH   out_unst_regcut_nat_paramsrG   rI   r$   r$   r%   _log_normalizer   s   ((z#ContinuousBernoulli._log_normalizer)NNr   Nr,   )&__name__
__module____qualname____doc__r   unit_intervalrealr   support_mean_carrier_measurehas_rsampler   r(   r/   r5   r8   rJ   propertyrL   rO   rN   r   r   r   rS   r   r   r_   r   Tensorra   rf   ri   rZ   rl   rm   rs   __classcell__r$   r$   r"   r%   r      sD    
	

	


		
)rC   numbersr   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   r   r   r   r	   torch.nn.functionalr
   torch.typesr   __all__r   r$   r$   r$   r%   <module>   s   