
    /jR$                         d dl 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)Tensor)constraints)ExponentialFamily)broadcast_allclamp_probslazy_propertylogits_to_probsprobs_to_logits) binary_cross_entropy_with_logits)_Number_sizeNumberContinuousBernoullic                       e Zd ZdZej        ej        dZej        ZdZ	dZ
	 	 	 	 d!deez  dz  deez  dz  d	eeef         d
edz  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<|t          d          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 valueszlogits is unexpectedly Noner   )
ValueError
isinstancer   r   r   arg_constraintscheckallr   AssertionErrorr   _paramtorchSizesize_limssuper__init__)selfr   r   r   r   	is_scalarbatch_shape	__class__s          m/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/distributions/continuous_bernoulli.pyr%   zContinuousBernoulli.__init__7   sF    TMv~..M   "5'22I)%00MTZ (+G4::4:FFJJLL O$%MNNN$TZ00DJJ~$%BCCC"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*   r/   zContinuousBernoulli.expand[   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   r2   )r&   argskwargss      r*   _newzContinuousBernoulli._newi   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_regionl   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_probsq   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'}'}@)rB   r    r@   r;   
zeros_likegerA   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_normx   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 )NrE   rF   rD   gUUUUUU?gll?rG   )rB   r    rL   rJ   r   rM   r@   r>   )r&   rO   musrS   rT   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 r4   )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 )NrF   rE   rG   rD   gUUUUUU?g?ggjV?)rB   r    rM   rL   rJ   r   r@   r>   )r&   rO   varsrS   rT   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 r`   )r   r	   r   r=   s    r*   r   zContinuousBernoulli.probs   s    ?4;$GGGHHHr+   c                 4    | j                                         S r4   )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   rg   rh   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:rn   c                     |                      |          }t          j        || j        j        | j        j                  }|                     |          S rf   )ri   r    rj   r   rg   rh   rl   rm   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)r0   _validate_sampler   r   r   rU   )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 )NrF   rE   g        )r0   rw   rB   r    rM   r@   r>   r;   rH   rI   rA   )r&   rx   rO   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 )NrE   rF   )rB   r    r@   r>   rL   rJ   )r&   rx   rO   s      r*   rl   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 r4   )r    rL   r   rJ   rX   rU   )r&   
log_probs0
log_probs1s      r*   entropyzContinuousBernoulli.entropy   sV    [$*--
Ytz**
Ij01&&(()	
r+   c                     | j         fS r4   )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   rD   r9   rG   g      8@   g     @)r    r:   r;   r#   r<   r@   rA   rJ   rK   specialexpm1rM   )r&   rS   out_unst_regcut_nat_paramsrR   rT   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   Nr4   )*__name__
__module____qualname____doc__r   unit_intervalrealr   support_mean_carrier_measurehas_rsampler   r   tuplefloatboolr%   r/   r7   r>   rB   rU   propertyrX   r\   r[   r   r   r   r    r!   rd   rq   r   rs   ry   r}   rl   r   r   r   __classcell__)r)   s   @r*   r   r      s        6 !, 9[EUVVO'GK )-)-$2%)"C "C%"C $&"C E5L!	"C
 d{"C 
"C "C "C "C "C "CH     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+   )rN   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 @ @ @ @ @ . . . . . . . . . . !
!d; d; d; d; d;+ d; d; d; d; d;r+   