
    קgC"                         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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                       e Zd ZdZej        ej        dZej        ZdZ	dZ
	 d fd	Zd fd	Zd	 Zd
 Zd Zd Zed             Zed             Zed             Zed             Zed             Zed             Z ej                    fdZ ej                    fdedej        fdZd Zd Z d Z!d Z"e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?c                    |d u |d u k    rt          d          |t          |t                    }t          |          \  | _        |F| j        d                             | j                                                  st          d          t          | j                  | _        n+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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__s          d/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/distributions/continuous_bernoulli.pyr    zContinuousBernoulli.__init__5   s2    TMv~..M   "5&11I)%00MTZ (+G4::4:FFJJLL O$%MNNN$TZ00DJJ"6622I*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&   r+   zContinuousBernoulli.expandP   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   r.   )r!   argskwargss      r&   _newzContinuousBernoulli._new^   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_regiona   sD    yHTZA//$*djQRm1T1T
 
 	
r'   c                     t          j        |                                 | j        | j        d         t          j        | j                  z            S )Nr   )r   wherer:   r   r   	ones_liker9   s    r&   
_cut_probszContinuousBernoulli._cut_probsf   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'}'}@)r>   r   r<   r7   
zeros_likeger=   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_normm   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 )NrA   rB   r@   gUUUUUU?gll?rC   )r>   r   rH   rF   r   rI   r<   r:   )r!   rK   musrO   rP   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 r0   )r   sqrtvariancer9   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 )NrB   rA   rC   r@   gUUUUUU?g?ggjV?)r>   r   rI   rH   rF   r   r<   r:   )r!   rK   varsrO   rP   s        r&   rW   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   r9   s    r&   r   zContinuousBernoulli.logits   s    tzT::::r'   c                 H    t          t          | j        d                    S r\   )r   r	   r   r9   s    r&   r   zContinuousBernoulli.probs   s    ?4;$GGGHHHr'   c                 4    | j                                         S r0   )r   r   r9   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   rc   rd   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:rj   returnc                     |                      |          }t          j        || j        j        | j        j                  }|                     |          S rb   )re   r   rf   r   rc   rd   rh   ri   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)r,   _validate_sampler   r   r   rQ   )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 )NrB   rA   g        )r,   rt   r>   r   rI   r<   r:   r7   rD   rE   r=   )r!   ru   rK   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 )NrA   rB   )r>   r   r<   r:   rH   rF   )r!   ru   rK   s      r&   rh   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 r0   )r   rH   r   rF   rT   rQ   )r!   
log_probs0
log_probs1s      r&   entropyzContinuousBernoulli.entropy   sV    [$*--
Ytz**
Ij01&&(()	
r'   c                     | j         fS r0   )r   r9   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	        |          dz
                      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   r@   r5   rB   rC   g      8@   g     @)r   r6   r7   r   r8   r<   r=   rF   rG   exprI   )r!   rO   out_unst_regcut_nat_paramsrN   rP   s         r&   _log_normalizerz#ContinuousBernoulli._log_normalizer   s   yHQ
1+,,ehq$*Q-#:M.N.N
 
 !djmc1U_Q5G5GG
 
 9UYuy'@'@3'FGGHH59In%%L
 L
 
 q59Q??T11EIaOOf4LL{<6:::r'   )NNr   Nr0   )&__name__
__module____qualname____doc__r   unit_intervalrealr   support_mean_carrier_measurehas_rsampler    r+   r3   r:   r>   rQ   propertyrT   rX   rW   r   r   r   r`   r   r   rm   r   Tensorrp   rv   rz   rh   r   r   r   __classcell__)r%   s   @r&   r   r      sA        2 !, 9[EUVVO'GK KOC C C C C C6     0 0 0
 
 


 
 
N N N( I I XI ) ) X) J J XJ ; ; ]; I I ]I " " X" #-%*,,         -7EJLL  E U\    

 
 

 
 
 

 

 


 
 
   X; ; ; ; ; ; ;r'   )rJ   numbersr   r   torch.distributionsr   torch.distributions.exp_familyr   torch.distributions.utilsr   r   r   r	   r
   torch.nn.functionalr   torch.typesr   __all__r    r'   r&   <module>r      s           + + + + + + < < < < < <              A @ @ @ @ @       !
!X; X; X; X; X;+ X; X; X; X; X;r'   