
    }Yh#                         d dl Z d dlmZmZ d dlZd dlm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mZmZ d	gZ G d
 d	e	          ZdS )    N)OptionalUnion)Tensor)constraints)ExponentialFamily)broadcast_allclamp_probslazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logits)_Number_sizeNumberContinuousBernoullic                   8    e Zd ZdZej        ej        dZej        ZdZ	dZ
	 	 	 	 d!deeeef                  deeeef                  d	eeef         d
ee         ddf
 fdZd" fd	Zd Zd Zd Zd Zedefd            Zedefd            Zedefd            Zedefd            Zedefd            Zedej         fd            Z! ej                     fdZ" ej                     fde#defdZ$d Z%d Z&d Z'd Z(edee         fd            Z)d  Z* xZ+S )#r   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?r   r   limsvalidate_argsreturnc                    |d u |d u k    rt          d          |t          |t                    }t          |          \  | _        |F| j        d                             | j                                                  st          d          t          | j                  | _        n/|J t          |t                    }t          |          \  | _	        || j        n| j	        | _
        |rt          j                    }n| j
                                        }|| _        t                                          ||           d S )Nz;Either `probs` or `logits` must be specified, but not both.r   z&The parameter probs has invalid valuesr   )
ValueError
isinstancer   r   r   arg_constraintscheckallr	   r   _paramtorchSizesize_limssuper__init__)selfr   r   r   r   	is_scalarbatch_shape	__class__s          z/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torch/distributions/continuous_bernoulli.pyr&   zContinuousBernoulli.__init__7   s>    TMv~..M   "5'22I)%00MTZ (+G4::4:FFJJLL O$%MNNN$TZ00DJJ%%%"6733I*622NT[$)$5djj4; 	-*,,KK+**,,K
MBBBBB    c                    |                      t          |          }| j        |_        t          j        |          }d| j        v r+| j                            |          |_        |j        |_        d| j        v r+| j	                            |          |_	        |j	        |_        t          t          |                              |d           | j        |_        |S )Nr   r   Fr   )_get_checked_instancer   r$   r!   r"   __dict__r   expandr    r   r%   r&   _validate_args)r'   r)   	_instancenewr*   s       r+   r0   zContinuousBernoulli.expandW   s    (()<iHHJ	j--dm##
))+66CICJt}$$++K88CJCJ!3''00E0RRR!0
r,   c                 &     | j         j        |i |S N)r    r3   )r'   argskwargss      r+   _newzContinuousBernoulli._newe   s    t{////r,   c                     t          j        t          j        | j        | j        d                   t          j        | j        | j        d                             S )Nr      )r!   maxler   r$   gtr'   s    r+   _outside_unstable_regionz,ContinuousBernoulli._outside_unstable_regionh   sD    yHTZA//$*djQRm1T1T
 
 	
r,   c                     t          j        |                                 | j        | j        d         t          j        | j                  z            S )Nr   )r!   wherer?   r   r$   	ones_liker>   s    r+   
_cut_probszContinuousBernoulli._cut_probsm   sD    {))++JJqMEODJ777
 
 	
r,   c           	      *   |                                  }t          j        t          j        |d          |t          j        |                    }t          j        t          j        |d          |t          j        |                    }t          j        t          j        t          j	        |           t          j        |          z
                      t          j        t          j        |d          t          j	        d|z            t          j        d|z  dz
                      z
  }t          j
        | j        dz
  d          }t          j        d          dd|z  z   |z  z   }t          j        |                                 ||          S )zLcomputes the log normalizing constant as a function of the 'probs' parameter      ?g              @      ?   gUUUUUU?g'}'}@)rC   r!   rA   r<   
zeros_likegerB   logabslog1ppowr   mathr?   )r'   	cut_probscut_probs_below_halfcut_probs_above_halflog_normxtaylors          r+   _cont_bern_log_normz'ContinuousBernoulli._cont_bern_log_normt   sV   OO%%	${HY$$i1A)1L1L 
  
  %{HY$$i1K1K 
  
 9Iek9*--	)0D0DDEE
 
KHY$$K3344Ic003677
 

 Idj3&**#)lQ.>">!!CC{488::HfMMMr,   c                 B   |                                  }|d|z  dz
  z  dt          j        |           t          j        |          z
  z  z   }| j        dz
  }dddt          j        |d          z  z   |z  z   }t          j        |                                 ||          S )NrF   rG   rE   gUUUUUU?gll?rH   )rC   r!   rM   rK   r   rN   rA   r?   )r'   rP   musrT   rU   s        r+   meanzContinuousBernoulli.mean   s    OO%%	3?S01CK
##ei	&:&::5
 
 J	K%)Aq//$AAQFF{488::CHHHr,   c                 4    t          j        | j                  S r5   )r!   sqrtvariancer>   s    r+   stddevzContinuousBernoulli.stddev   s    z$-(((r,   c                    |                                  }||dz
  z  t          j        dd|z  z
  d          z  dt          j        t          j        |           t          j        |          z
  d          z  z   }t          j        | j        dz
  d          }ddd|z  z
  |z  z
  }t          j        |                                 ||          S )NrG   rF   rH   rE   gUUUUUU?g?ggjV?)rC   r!   rN   rM   rK   r   rA   r?   )r'   rP   varsrT   rU   s        r+   r\   zContinuousBernoulli.variance   s    OO%%	IO,uy#	/!10
 0
 
%)EK
33ei	6J6JJANNNO Idj3&**zMA,==BB{488::D&IIIr,   c                 .    t          | j        d          S NT)	is_binary)r   r   r>   s    r+   r   zContinuousBernoulli.logits   s    tzT::::r,   c                 H    t          t          | j        d                    S ra   )r	   r   r   r>   s    r+   r   zContinuousBernoulli.probs   s    ?4;$GGGHHHr,   c                 4    | j                                         S r5   )r    r#   r>   s    r+   param_shapezContinuousBernoulli.param_shape   s    {!!!r,   c                    |                      |          }t          j        || j        j        | j        j                  }t          j                    5  |                     |          cd d d            S # 1 swxY w Y   d S N)dtypedevice)_extended_shaper!   randr   rh   ri   no_gradicdfr'   sample_shapeshapeus       r+   samplezContinuousBernoulli.sample   s    $$\22JuDJ$4TZ=NOOO]__ 	  	 99Q<<	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   A66A:=A:ro   c                     |                      |          }t          j        || j        j        | j        j                  }|                     |          S rg   )rj   r!   rk   r   rh   ri   rm   rn   s       r+   rsamplezContinuousBernoulli.rsample   sE    $$\22JuDJ$4TZ=NOOOyy||r,   c                     | j         r|                     |           t          | j        |          \  }}t	          ||d           |                                 z   S )Nnone)	reduction)r1   _validate_sampler   r   r   rV   )r'   valuer   s      r+   log_probzContinuousBernoulli.log_prob   sd     	)!!%(((%dk599-fevNNNN&&(()	
r,   c           
         | j         r|                     |           |                                 }t          j        ||          t          j        d|z
  d|z
            z  |z   dz
  d|z  dz
  z  }t          j        |                                 ||          }t          j        t          j        |d          t          j        |          t          j        t          j	        |d          t          j
        |          |                    S )NrG   rF   g        )r1   rx   rC   r!   rN   rA   r?   r<   rI   rJ   rB   )r'   ry   rP   cdfsunbounded_cdfss        r+   cdfzContinuousBernoulli.cdf   s     	)!!%(((OO%%	Ii''%)C)OS5[*Q*QQ 9_s"	$
 T%B%B%D%DdERR{HUC  U##K,,eoe.D.DnUU
 
 	
r,   c           	      :   |                                  }t          j        |                                 t          j        | |d|z  dz
  z  z             t          j        |           z
  t          j        |          t          j        |           z
  z  |          S )NrF   rG   )rC   r!   rA   r?   rM   rK   )r'   ry   rP   s      r+   rm   zContinuousBernoulli.icdf   s    OO%%	{))++YJ#	/C2G)HHII+yj))* y##ek9*&=&==	?
 
 
 	
r,   c                     t          j        | j                   }t          j        | j                  }| j        ||z
  z  |                                 z
  |z
  S r5   )r!   rM   r   rK   rY   rV   )r'   
log_probs0
log_probs1s      r+   entropyzContinuousBernoulli.entropy   sV    [$*--
Ytz**
Ij01&&(()	
r,   c                     | j         fS r5   )r   r>   s    r+   _natural_paramsz#ContinuousBernoulli._natural_params   s    ~r,   c                    t          j        t          j        || j        d         dz
            t          j        || j        d         dz
                      }t          j        ||| j        d         dz
  t          j        |          z            }t          j        t          j        t           j	        
                    |                              t          j        t          j        |                    z
  }d|z  t          j        |d          dz  z   t          j        |d          dz  z
  }t          j        |||          S )zLcomputes the log normalizing constant as a function of the natural parameterr   rE   r:   rH   g      8@   g     @)r!   r;   r<   r$   r=   rA   rB   rK   rL   specialexpm1rN   )r'   rT   out_unst_regcut_nat_paramsrS   rU   s         r+   _log_normalizerz#ContinuousBernoulli._log_normalizer   s   yHQ
1+,,ehq$*Q-#:M.N.N
 
 !djmc1U_Q5G5GG
 
 9Iem)).99::
 
Iei//001 q59Q??T11EIaOOf4LL{<6:::r,   )NNr   Nr5   ),__name__
__module____qualname____doc__r   unit_intervalrealr   support_mean_carrier_measurehas_rsampler   r   r   r   tuplefloatboolr&   r0   r8   r?   rC   rV   propertyrY   r]   r\   r
   r   r   r!   r"   re   rr   r   rt   rz   r~   rm   r   r   r   __classcell__)r*   s   @r+   r   r      s        4 !, 9[EUVVO'GK 2626$2(,C Cffn-.C vv~./C E5L!	C
  ~C 
C C C C C C@     0 0 0
 
 


 
 
N N N( If I I I XI ) ) ) ) X) J& J J J XJ ; ; ; ; ]; Iv I I I ]I "UZ " " " X" #-%*,,         -7EJLL  E V    

 
 

 
 
 

 

 


 
 
 v    X; ; ; ; ; ; ;r,   )rO   typingr   r   r!   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   r	   r
   r   r   torch.nn.functionalr   torch.typesr   r   r   __all__r    r,   r+   <module>r      s'    " " " " " " " "        + + + + + + < < < < < <              A @ @ @ @ @ . . . . . . . . . . !
!^; ^; ^; ^; ^;+ ^; ^; ^; ^; ^;r,   