prob_distr.c (52461B)
1 /* Copyright (c) 2018-2021, The Tor Project, Inc. */ 2 /* See LICENSE for licensing information */ 3 4 /** 5 * \file prob_distr.c 6 * 7 * \brief 8 * Implements various probability distributions. 9 * Almost all code is courtesy of Riastradh. 10 * 11 * \details 12 * Here are some details that might help you understand this file: 13 * 14 * - Throughout this file, `eps' means the largest relative error of a 15 * correctly rounded floating-point operation, which in binary64 16 * floating-point arithmetic is 2^-53. Here the relative error of a 17 * true value x from a computed value y is |x - y|/|x|. This 18 * definition of epsilon is conventional for numerical analysts when 19 * writing error analyses. (If your libm doesn't provide correctly 20 * rounded exp and log, their relative error is usually below 2*2^-53 21 * and probably closer to 1.1*2^-53 instead.) 22 * 23 * The C constant DBL_EPSILON is actually twice this, and should 24 * perhaps rather be named ulp(1) -- that is, it is the distance from 25 * 1 to the next greater floating-point number, which is usually of 26 * more interest to programmers and hardware engineers. 27 * 28 * Since this file is concerned mainly with error bounds rather than 29 * with low-level bit-hacking of floating-point numbers, we adopt the 30 * numerical analysts' definition in the comments, though we do use 31 * DBL_EPSILON in a handful of places where it is convenient to use 32 * some function of eps = DBL_EPSILON/2 in a case analysis. 33 * 34 * - In various functions (e.g. sample_log_logistic()) we jump through hoops so 35 * that we can use reals closer to 0 than closer to 1, since we achieve much 36 * greater accuracy for floating point numbers near 0. In particular, we can 37 * represent differences as small as 10^-300 for numbers near 0, but of no 38 * less than 10^-16 for numbers near 1. 39 **/ 40 41 #define PROB_DISTR_PRIVATE 42 43 #include "orconfig.h" 44 45 #include "lib/math/prob_distr.h" 46 47 #include "lib/crypt_ops/crypto_rand.h" 48 #include "lib/cc/ctassert.h" 49 #include "lib/log/util_bug.h" 50 51 #include <float.h> 52 #include <math.h> 53 #include <stddef.h> 54 55 #ifndef COCCI 56 /** Declare a function that downcasts from a generic dist struct to the actual 57 * subtype probability distribution it represents. */ 58 #define DECLARE_PROB_DISTR_DOWNCAST_FN(name) \ 59 static inline \ 60 const struct name##_t * \ 61 dist_to_const_##name(const struct dist_t *obj) { \ 62 tor_assert(obj->ops == &name##_ops); \ 63 return SUBTYPE_P(obj, struct name ## _t, base); \ 64 } 65 DECLARE_PROB_DISTR_DOWNCAST_FN(uniform) 66 DECLARE_PROB_DISTR_DOWNCAST_FN(geometric) 67 DECLARE_PROB_DISTR_DOWNCAST_FN(logistic) 68 DECLARE_PROB_DISTR_DOWNCAST_FN(log_logistic) 69 DECLARE_PROB_DISTR_DOWNCAST_FN(genpareto) 70 DECLARE_PROB_DISTR_DOWNCAST_FN(weibull) 71 #endif /* !defined(COCCI) */ 72 73 /** 74 * Count number of one bits in 32-bit word. 75 */ 76 static unsigned 77 bitcount32(uint32_t x) 78 { 79 80 /* Count two-bit groups. */ 81 x -= (x >> 1) & UINT32_C(0x55555555); 82 83 /* Count four-bit groups. */ 84 x = ((x >> 2) & UINT32_C(0x33333333)) + (x & UINT32_C(0x33333333)); 85 86 /* Count eight-bit groups. */ 87 x = (x + (x >> 4)) & UINT32_C(0x0f0f0f0f); 88 89 /* Sum all eight-bit groups, and extract the sum. */ 90 return (x * UINT32_C(0x01010101)) >> 24; 91 } 92 93 /** 94 * Count leading zeros in 32-bit word. 95 */ 96 static unsigned 97 clz32(uint32_t x) 98 { 99 100 /* Round up to a power of two. */ 101 x |= x >> 1; 102 x |= x >> 2; 103 x |= x >> 4; 104 x |= x >> 8; 105 x |= x >> 16; 106 107 /* Subtract count of one bits from 32. */ 108 return (32 - bitcount32(x)); 109 } 110 111 /* 112 * Some lemmas that will be used throughout this file to prove various error 113 * bounds: 114 * 115 * Lemma 1. If |d| <= 1/2, then 1/(1 + d) <= 2. 116 * 117 * Proof. If 0 <= d <= 1/2, then 1 + d >= 1, so that 1/(1 + d) <= 1. 118 * If -1/2 <= d <= 0, then 1 + d >= 1/2, so that 1/(1 + d) <= 2. QED. 119 * 120 * Lemma 2. If b = a*(1 + d)/(1 + d') for |d'| < 1/2 and nonzero a, b, 121 * then b = a*(1 + e) for |e| <= 2|d' - d|. 122 * 123 * Proof. |a - b|/|a| 124 * = |a - a*(1 + d)/(1 + d')|/|a| 125 * = |1 - (1 + d)/(1 + d')| 126 * = |(1 + d' - 1 - d)/(1 + d')| 127 * = |(d' - d)/(1 + d')| 128 * <= 2|d' - d|, by Lemma 1, 129 * 130 * QED. 131 * 132 * Lemma 3. For |d|, |d'| < 1/4, 133 * 134 * |log((1 + d)/(1 + d'))| <= 4|d - d'|. 135 * 136 * Proof. Write 137 * 138 * log((1 + d)/(1 + d')) 139 * = log(1 + (1 + d)/(1 + d') - 1) 140 * = log(1 + (1 + d - 1 - d')/(1 + d') 141 * = log(1 + (d - d')/(1 + d')). 142 * 143 * By Lemma 1, |(d - d')/(1 + d')| < 2|d' - d| < 1, so the Taylor 144 * series of log(1 + x) converges absolutely for (d - d')/(1 + d'), 145 * and thus we have 146 * 147 * |log(1 + (d - d')/(1 + d'))| 148 * = |\sum_{n=1}^\infty ((d - d')/(1 + d'))^n/n| 149 * <= \sum_{n=1}^\infty |(d - d')/(1 + d')|^n/n 150 * <= \sum_{n=1}^\infty |2(d' - d)|^n/n 151 * <= \sum_{n=1}^\infty |2(d' - d)|^n 152 * = 1/(1 - |2(d' - d)|) 153 * <= 4|d' - d|, 154 * 155 * QED. 156 * 157 * Lemma 4. If 1/e <= 1 + x <= e, then 158 * 159 * log(1 + (1 + d) x) = (1 + d') log(1 + x) 160 * 161 * for |d'| < 8|d|. 162 * 163 * Proof. Write 164 * 165 * log(1 + (1 + d) x) 166 * = log(1 + x + x*d) 167 * = log((1 + x) (1 + x + x*d)/(1 + x)) 168 * = log(1 + x) + log((1 + x + x*d)/(1 + x)) 169 * = log(1 + x) (1 + log((1 + x + x*d)/(1 + x))/log(1 + x)). 170 * 171 * The relative error is bounded by 172 * 173 * |log((1 + x + x*d)/(1 + x))/log(1 + x)| 174 * <= 4|x + x*d - x|/|log(1 + x)|, by Lemma 3, 175 * = 4|x*d|/|log(1 + x)| 176 * < 8|d|, 177 * 178 * since in this range 0 < 1 - 1/e < x/log(1 + x) <= e - 1 < 2. QED. 179 */ 180 181 /** 182 * Compute the logistic function: f(x) = 1/(1 + e^{-x}) = e^x/(1 + e^x). 183 * Maps a log-odds-space probability in [-infinity, +infinity] into a 184 * direct-space probability in [0,1]. Inverse of logit. 185 * 186 * Ill-conditioned for large x; the identity logistic(-x) = 1 - 187 * logistic(x) and the function logistichalf(x) = logistic(x) - 1/2 may 188 * help to rearrange a computation. 189 * 190 * This implementation gives relative error bounded by 7 eps. 191 */ 192 STATIC double 193 logistic(double x) 194 { 195 if (x <= log(DBL_EPSILON/2)) { 196 /* 197 * If x <= log(DBL_EPSILON/2) = log(eps), then e^x <= eps. In this case 198 * we will approximate the logistic() function with e^x because the 199 * relative error is less than eps. Here is a calculation of the 200 * relative error between the logistic() function and e^x and a proof 201 * that it's less than eps: 202 * 203 * |e^x - e^x/(1 + e^x)|/|e^x/(1 + e^x)| 204 * <= |1 - 1/(1 + e^x)|*|1 + e^x| 205 * = |e^x/(1 + e^x)|*|1 + e^x| 206 * = |e^x| 207 * <= eps. 208 */ 209 return exp(x); /* return e^x */ 210 } else if (x <= -log(DBL_EPSILON/2)) { 211 /* 212 * e^{-x} > 0, so 1 + e^{-x} > 1, and 0 < 1/(1 + 213 * e^{-x}) < 1; further, since e^{-x} < 1 + e^{-x}, we 214 * also have 0 < 1/(1 + e^{-x}) < 1. Thus, if exp has 215 * relative error d0, + has relative error d1, and / 216 * has relative error d2, then we get 217 * 218 * (1 + d2)/[(1 + (1 + d0) e^{-x})(1 + d1)] 219 * = (1 + d0)/[1 + e^{-x} + d0 e^{-x} 220 * + d1 + d1 e^{-x} + d0 d1 e^{-x}] 221 * = (1 + d0)/[(1 + e^{-x}) 222 * * (1 + d0 e^{-x}/(1 + e^{-x}) 223 * + d1/(1 + e^{-x}) 224 * + d0 d1 e^{-x}/(1 + e^{-x}))]. 225 * = (1 + d0)/[(1 + e^{-x})(1 + d')] 226 * = [1/(1 + e^{-x})] (1 + d0)/(1 + d') 227 * 228 * where 229 * 230 * d' = d0 e^{-x}/(1 + e^{-x}) 231 * + d1/(1 + e^{-x}) 232 * + d0 d1 e^{-x}/(1 + e^{-x}). 233 * 234 * By Lemma 2 this relative error is bounded by 235 * 236 * 2|d0 - d'| 237 * = 2|d0 - d0 e^{-x}/(1 + e^{-x}) 238 * - d1/(1 + e^{-x}) 239 * - d0 d1 e^{-x}/(1 + e^{-x})| 240 * <= 2|d0| + 2|d0 e^{-x}/(1 + e^{-x})| 241 * + 2|d1/(1 + e^{-x})| 242 * + 2|d0 d1 e^{-x}/(1 + e^{-x})| 243 * <= 2|d0| + 2|d0| + 2|d1| + 2|d0 d1| 244 * <= 4|d0| + 2|d1| + 2|d0 d1| 245 * <= 6 eps + 2 eps^2. 246 */ 247 return 1/(1 + exp(-x)); 248 } else { 249 /* 250 * e^{-x} <= eps, so the relative error of 1 from 1/(1 251 * + e^{-x}) is 252 * 253 * |1/(1 + e^{-x}) - 1|/|1/(1 + e^{-x})| 254 * = |e^{-x}/(1 + e^{-x})|/|1/(1 + e^{-x})| 255 * = |e^{-x}| 256 * <= eps. 257 * 258 * This computation avoids an intermediate overflow 259 * exception, although the effect on the result is 260 * harmless. 261 * 262 * XXX Should maybe raise inexact here. 263 */ 264 return 1; 265 } 266 } 267 268 /** 269 * Compute the logit function: log p/(1 - p). Defined on [0,1]. Maps 270 * a direct-space probability in [0,1] to a log-odds-space probability 271 * in [-infinity, +infinity]. Inverse of logistic. 272 * 273 * Ill-conditioned near 1/2 and 1; the identity logit(1 - p) = 274 * -logit(p) and the function logithalf(p0) = logit(1/2 + p0) may help 275 * to rearrange a computation for p in [1/(1 + e), 1 - 1/(1 + e)]. 276 * 277 * This implementation gives relative error bounded by 10 eps. 278 */ 279 STATIC double 280 logit(double p) 281 { 282 283 /* logistic(-1) <= p <= logistic(+1) */ 284 if (1/(1 + exp(1)) <= p && p <= 1/(1 + exp(-1))) { 285 /* 286 * For inputs near 1/2, we want to compute log1p(near 287 * 0) rather than log(near 1), so write this as: 288 * 289 * log(p/(1 - p)) = -log((1 - p)/p) 290 * = -log(1 + (1 - p)/p - 1) 291 * = -log(1 + (1 - p - p)/p) 292 * = -log(1 + (1 - 2p)/p). 293 * 294 * Since p = 2p/2 <= 1 <= 2*2p = 4p, the floating-point 295 * evaluation of 1 - 2p is exact; the only error arises 296 * from division and log1p. First, note that if 297 * logistic(-1) <= p <= logistic(+1), (1 - 2p)/p lies 298 * in the bounds of Lemma 4. 299 * 300 * If division has relative error d0 and log1p has 301 * relative error d1, the outcome is 302 * 303 * -(1 + d1) log(1 + (1 - 2p) (1 + d0)/p) 304 * = -(1 + d1) (1 + d') log(1 + (1 - 2p)/p) 305 * = -(1 + d1 + d' + d1 d') log(1 + (1 - 2p)/p). 306 * 307 * where |d'| < 8|d0| by Lemma 4. The relative error 308 * is then bounded by 309 * 310 * |d1 + d' + d1 d'| 311 * <= |d1| + 8|d0| + 8|d1 d0| 312 * <= 9 eps + 8 eps^2. 313 */ 314 return -log1p((1 - 2*p)/p); 315 } else { 316 /* 317 * For inputs near 0, although 1 - p may be rounded to 318 * 1, it doesn't matter much because the magnitude of 319 * the result is so much larger. For inputs near 1, we 320 * can compute 1 - p exactly, although the precision on 321 * the input is limited so we won't ever get more than 322 * about 700 for the output. 323 * 324 * If - has relative error d0, / has relative error d1, 325 * and log has relative error d2, then 326 * 327 * (1 + d2) log((1 + d0) p/[(1 - p)(1 + d1)]) 328 * = (1 + d2) [log(p/(1 - p)) + log((1 + d0)/(1 + d1))] 329 * = log(p/(1 - p)) + d2 log(p/(1 - p)) 330 * + (1 + d2) log((1 + d0)/(1 + d1)) 331 * = log(p/(1 - p))*[1 + d2 + 332 * + (1 + d2) log((1 + d0)/(1 + d1))/log(p/(1 - p))] 333 * 334 * Since 0 <= p < logistic(-1) or logistic(+1) < p <= 335 * 1, we have |log(p/(1 - p))| > 1. Hence this error 336 * is bounded by 337 * 338 * |d2 + (1 + d2) log((1 + d0)/(1 + d1))/log(p/(1 - p))| 339 * <= |d2| + |(1 + d2) log((1 + d0)/(1 + d1)) 340 * / log(p/(1 - p))| 341 * <= |d2| + |(1 + d2) log((1 + d0)/(1 + d1))| 342 * <= |d2| + 4|(1 + d2) (d0 - d1)|, by Lemma 3, 343 * <= |d2| + 4|d0 - d1 + d2 d0 - d1 d0| 344 * <= |d2| + 4|d0| + 4|d1| + 4|d2 d0| + 4|d1 d0| 345 * <= 9 eps + 8 eps^2. 346 */ 347 return log(p/(1 - p)); 348 } 349 } 350 351 /** 352 * Compute the logit function, translated in input by 1/2: logithalf(p) 353 * = logit(1/2 + p). Defined on [-1/2, 1/2]. Inverse of logistichalf. 354 * 355 * Ill-conditioned near +/-1/2. If |p0| > 1/2 - 1/(1 + e), it may be 356 * better to compute 1/2 + p0 or -1/2 - p0 and to use logit instead. 357 * This implementation gives relative error bounded by 34 eps. 358 */ 359 STATIC double 360 logithalf(double p0) 361 { 362 363 if (fabs(p0) <= 0.5 - 1/(1 + exp(1))) { 364 /* 365 * logit(1/2 + p0) 366 * = log((1/2 + p0)/(1 - (1/2 + p0))) 367 * = log((1/2 + p0)/(1/2 - p0)) 368 * = log(1 + (1/2 + p0)/(1/2 - p0) - 1) 369 * = log(1 + (1/2 + p0 - (1/2 - p0))/(1/2 - p0)) 370 * = log(1 + (1/2 + p0 - 1/2 + p0)/(1/2 - p0)) 371 * = log(1 + 2 p0/(1/2 - p0)) 372 * 373 * If the error of subtraction is d0, the error of 374 * division is d1, and the error of log1p is d2, then 375 * what we compute is 376 * 377 * (1 + d2) log(1 + (1 + d1) 2 p0/[(1 + d0) (1/2 - p0)]) 378 * = (1 + d2) log(1 + (1 + d') 2 p0/(1/2 - p0)) 379 * = (1 + d2) (1 + d'') log(1 + 2 p0/(1/2 - p0)) 380 * = (1 + d2 + d'' + d2 d'') log(1 + 2 p0/(1/2 - p0)), 381 * 382 * where |d'| < 2|d0 - d1| <= 4 eps by Lemma 2, and 383 * |d''| < 8|d'| < 32 eps by Lemma 4 since 384 * 385 * 1/e <= 1 + 2*p0/(1/2 - p0) <= e 386 * 387 * when |p0| <= 1/2 - 1/(1 + e). Hence the relative 388 * error is bounded by 389 * 390 * |d2 + d'' + d2 d''| 391 * <= |d2| + |d''| + |d2 d''| 392 * <= |d1| + 32 |d0| + 32 |d1 d0| 393 * <= 33 eps + 32 eps^2. 394 */ 395 return log1p(2*p0/(0.5 - p0)); 396 } else { 397 /* 398 * We have a choice of computing logit(1/2 + p0) or 399 * -logit(1 - (1/2 + p0)) = -logit(1/2 - p0). It 400 * doesn't matter which way we do this: either way, 401 * since 1/2 p0 <= 1/2 <= 2 p0, the sum and difference 402 * are computed exactly. So let's do the one that 403 * skips the final negation. 404 * 405 * The result is 406 * 407 * (1 + d1) log((1 + d0) (1/2 + p0)/[(1 + d2) (1/2 - p0)]) 408 * = (1 + d1) (1 + log((1 + d0)/(1 + d2)) 409 * / log((1/2 + p0)/(1/2 - p0))) 410 * * log((1/2 + p0)/(1/2 - p0)) 411 * = (1 + d') log((1/2 + p0)/(1/2 - p0)) 412 * = (1 + d') logit(1/2 + p0) 413 * 414 * where 415 * 416 * d' = d1 + log((1 + d0)/(1 + d2))/logit(1/2 + p0) 417 * + d1 log((1 + d0)/(1 + d2))/logit(1/2 + p0). 418 * 419 * For |p| > 1/2 - 1/(1 + e), logit(1/2 + p0) > 1. 420 * Provided |d0|, |d2| < 1/4, by Lemma 3 we have 421 * 422 * |log((1 + d0)/(1 + d2))| <= 4|d0 - d2|. 423 * 424 * Hence the relative error is bounded by 425 * 426 * |d'| <= |d1| + 4|d0 - d2| + 4|d1| |d0 - d2| 427 * <= |d1| + 4|d0| + 4|d2| + 4|d1 d0| + 4|d1 d2| 428 * <= 9 eps + 8 eps^2. 429 */ 430 return log((0.5 + p0)/(0.5 - p0)); 431 } 432 } 433 434 /* 435 * The following random_uniform_01 is tailored for IEEE 754 binary64 436 * floating-point or smaller. It can be adapted to larger 437 * floating-point formats like i387 80-bit or IEEE 754 binary128, but 438 * it may require sampling more bits. 439 */ 440 CTASSERT(FLT_RADIX == 2); 441 CTASSERT(-DBL_MIN_EXP <= 1021); 442 CTASSERT(DBL_MANT_DIG <= 53); 443 444 /** 445 * Draw a floating-point number in [0, 1] with uniform distribution. 446 * 447 * Note that the probability of returning 0 is less than 2^-1074, so 448 * callers need not check for it. However, callers that cannot handle 449 * rounding to 1 must deal with that, because it occurs with 450 * probability 2^-54, which is small but nonnegligible. 451 */ 452 STATIC double 453 random_uniform_01(void) 454 { 455 uint32_t z, x, hi, lo; 456 double s; 457 458 /* 459 * Draw an exponent, geometrically distributed, but give up if 460 * we get a run of more than 1088 zeros, which really means the 461 * system is broken. 462 */ 463 z = 0; 464 while ((x = crypto_fast_rng_get_u32(get_thread_fast_rng())) == 0) { 465 if (z >= 1088) 466 /* Your bit sampler is broken. Go home. */ 467 return 0; 468 z += 32; 469 } 470 z += clz32(x); 471 472 /* 473 * Pick 32-bit halves of an odd normalized significand. 474 * Picking it odd breaks ties in the subsequent rounding, which 475 * occur only with measure zero in the uniform distribution on 476 * [0, 1]. 477 */ 478 hi = crypto_fast_rng_get_u32(get_thread_fast_rng()) | UINT32_C(0x80000000); 479 lo = crypto_fast_rng_get_u32(get_thread_fast_rng()) | UINT32_C(0x00000001); 480 481 /* Round to nearest scaled significand in [2^63, 2^64]. */ 482 s = hi*(double)4294967296 + lo; 483 484 /* Rescale into [1/2, 1] and apply exponent in one swell foop. */ 485 return s * ldexp(1, -(64 + z)); 486 } 487 488 /*******************************************************************/ 489 490 /* Functions for specific probability distributions start here: */ 491 492 /* 493 * Logistic(mu, sigma) distribution, supported on (-infinity,+infinity) 494 * 495 * This is the uniform distribution on [0,1] mapped into log-odds 496 * space, scaled by sigma and translated by mu. 497 * 498 * pdf(x) = e^{-(x - mu)/sigma} sigma (1 + e^{-(x - mu)/sigma})^2 499 * cdf(x) = 1/(1 + e^{-(x - mu)/sigma}) = logistic((x - mu)/sigma) 500 * sf(x) = 1 - cdf(x) = 1 - logistic((x - mu)/sigma = logistic(-(x - mu)/sigma) 501 * icdf(p) = mu + sigma log p/(1 - p) = mu + sigma logit(p) 502 * isf(p) = mu + sigma log (1 - p)/p = mu - sigma logit(p) 503 */ 504 505 /** 506 * Compute the CDF of the Logistic(mu, sigma) distribution: the 507 * logistic function. Well-conditioned for negative inputs and small 508 * positive inputs; ill-conditioned for large positive inputs. 509 */ 510 STATIC double 511 cdf_logistic(double x, double mu, double sigma) 512 { 513 return logistic((x - mu)/sigma); 514 } 515 516 /** 517 * Compute the SF of the Logistic(mu, sigma) distribution: the logistic 518 * function reflected over the y axis. Well-conditioned for positive 519 * inputs and small negative inputs; ill-conditioned for large negative 520 * inputs. 521 */ 522 STATIC double 523 sf_logistic(double x, double mu, double sigma) 524 { 525 return logistic(-(x - mu)/sigma); 526 } 527 528 /** 529 * Compute the inverse of the CDF of the Logistic(mu, sigma) 530 * distribution: the logit function. Well-conditioned near 0; 531 * ill-conditioned near 1/2 and 1. 532 */ 533 STATIC double 534 icdf_logistic(double p, double mu, double sigma) 535 { 536 return mu + sigma*logit(p); 537 } 538 539 /** 540 * Compute the inverse of the SF of the Logistic(mu, sigma) 541 * distribution: the -logit function. Well-conditioned near 0; 542 * ill-conditioned near 1/2 and 1. 543 */ 544 STATIC double 545 isf_logistic(double p, double mu, double sigma) 546 { 547 return mu - sigma*logit(p); 548 } 549 550 /* 551 * LogLogistic(alpha, beta) distribution, supported on (0, +infinity). 552 * 553 * This is the uniform distribution on [0,1] mapped into odds space, 554 * scaled by positive alpha and shaped by positive beta. 555 * 556 * Equivalent to computing exp of a Logistic(log alpha, 1/beta) sample. 557 * (Name arises because the pdf has LogLogistic(x; alpha, beta) = 558 * Logistic(log x; log alpha, 1/beta) and mathematicians got their 559 * covariance contravariant.) 560 * 561 * pdf(x) = (beta/alpha) (x/alpha)^{beta - 1}/(1 + (x/alpha)^beta)^2 562 * = (1/e^mu sigma) (x/e^mu)^{1/sigma - 1} / 563 * (1 + (x/e^mu)^{1/sigma})^2 564 * cdf(x) = 1/(1 + (x/alpha)^-beta) = 1/(1 + (x/e^mu)^{-1/sigma}) 565 * = 1/(1 + (e^{log x}/e^mu)^{-1/sigma}) 566 * = 1/(1 + (e^{log x - mu})^{-1/sigma}) 567 * = 1/(1 + e^{-(log x - mu)/sigma}) 568 * = logistic((log x - mu)/sigma) 569 * = logistic((log x - log alpha)/(1/beta)) 570 * sf(x) = 1 - 1/(1 + (x/alpha)^-beta) 571 * = (x/alpha)^-beta/(1 + (x/alpha)^-beta) 572 * = 1/((x/alpha)^beta + 1) 573 * = 1/(1 + (x/alpha)^beta) 574 * icdf(p) = alpha (p/(1 - p))^{1/beta} 575 * = alpha e^{logit(p)/beta} 576 * = e^{mu + sigma logit(p)} 577 * isf(p) = alpha ((1 - p)/p)^{1/beta} 578 * = alpha e^{-logit(p)/beta} 579 * = e^{mu - sigma logit(p)} 580 */ 581 582 /** 583 * Compute the CDF of the LogLogistic(alpha, beta) distribution. 584 * Well-conditioned for all x and alpha, and the condition number 585 * 586 * -beta/[1 + (x/alpha)^{-beta}] 587 * 588 * grows linearly with beta. 589 * 590 * Loosely, the relative error of this implementation is bounded by 591 * 592 * 4 eps + 2 eps^2 + O(beta eps), 593 * 594 * so don't bother trying this for beta anywhere near as large as 595 * 1/eps, around which point it levels off at 1. 596 */ 597 STATIC double 598 cdf_log_logistic(double x, double alpha, double beta) 599 { 600 /* 601 * Let d0 be the error of x/alpha; d1, of pow; d2, of +; and 602 * d3, of the final quotient. The exponentiation gives 603 * 604 * ((1 + d0) x/alpha)^{-beta} 605 * = (x/alpha)^{-beta} (1 + d0)^{-beta} 606 * = (x/alpha)^{-beta} (1 + (1 + d0)^{-beta} - 1) 607 * = (x/alpha)^{-beta} (1 + d') 608 * 609 * where d' = (1 + d0)^{-beta} - 1. If y = (x/alpha)^{-beta}, 610 * the denominator is 611 * 612 * (1 + d2) (1 + (1 + d1) (1 + d') y) 613 * = (1 + d2) (1 + y + (d1 + d' + d1 d') y) 614 * = 1 + y + (1 + d2) (d1 + d' + d1 d') y 615 * = (1 + y) (1 + (1 + d2) (d1 + d' + d1 d') y/(1 + y)) 616 * = (1 + y) (1 + d''), 617 * 618 * where d'' = (1 + d2) (d1 + d' + d1 d') y/(1 + y). The 619 * final result is 620 * 621 * (1 + d3) / [(1 + d2) (1 + d'') (1 + y)] 622 * = (1 + d''') / (1 + y) 623 * 624 * for |d'''| <= 2|d3 - d''| by Lemma 2 as long as |d''| < 1/2 625 * (which may not be the case for very large beta). This 626 * relative error is therefore bounded by 627 * 628 * |d'''| 629 * <= 2|d3 - d''| 630 * <= 2|d3| + 2|(1 + d2) (d1 + d' + d1 d') y/(1 + y)| 631 * <= 2|d3| + 2|(1 + d2) (d1 + d' + d1 d')| 632 * = 2|d3| + 2|d1 + d' + d1 d' + d2 d1 + d2 d' + d2 d1 d'| 633 * <= 2|d3| + 2|d1| + 2|d'| + 2|d1 d'| + 2|d2 d1| + 2|d2 d'| 634 * + 2|d2 d1 d'| 635 * <= 4 eps + 2 eps^2 + (2 + 2 eps + 2 eps^2) |d'|. 636 * 637 * Roughly, |d'| = |(1 + d0)^{-beta} - 1| grows like beta eps, 638 * until it levels off at 1. 639 */ 640 return 1/(1 + pow(x/alpha, -beta)); 641 } 642 643 /** 644 * Compute the SF of the LogLogistic(alpha, beta) distribution. 645 * Well-conditioned for all x and alpha, and the condition number 646 * 647 * beta/[1 + (x/alpha)^beta] 648 * 649 * grows linearly with beta. 650 * 651 * Loosely, the relative error of this implementation is bounded by 652 * 653 * 4 eps + 2 eps^2 + O(beta eps) 654 * 655 * so don't bother trying this for beta anywhere near as large as 656 * 1/eps, beyond which point it grows unbounded. 657 */ 658 STATIC double 659 sf_log_logistic(double x, double alpha, double beta) 660 { 661 /* 662 * The error analysis here is essentially the same as in 663 * cdf_log_logistic, except that rather than levelling off at 664 * 1, |(1 + d0)^beta - 1| grows unbounded. 665 */ 666 return 1/(1 + pow(x/alpha, beta)); 667 } 668 669 /** 670 * Compute the inverse of the CDF of the LogLogistic(alpha, beta) 671 * distribution. Ill-conditioned for p near 1 and beta near 0 with 672 * condition number 1/[beta (1 - p)]. 673 */ 674 STATIC double 675 icdf_log_logistic(double p, double alpha, double beta) 676 { 677 return alpha*pow(p/(1 - p), 1/beta); 678 } 679 680 /** 681 * Compute the inverse of the SF of the LogLogistic(alpha, beta) 682 * distribution. Ill-conditioned for p near 1 and for large beta, with 683 * condition number -1/[beta (1 - p)]. 684 */ 685 STATIC double 686 isf_log_logistic(double p, double alpha, double beta) 687 { 688 return alpha*pow((1 - p)/p, 1/beta); 689 } 690 691 /* 692 * Weibull(lambda, k) distribution, supported on (0, +infinity). 693 * 694 * pdf(x) = (k/lambda) (x/lambda)^{k - 1} e^{-(x/lambda)^k} 695 * cdf(x) = 1 - e^{-(x/lambda)^k} 696 * icdf(p) = lambda * (-log (1 - p))^{1/k} 697 * sf(x) = e^{-(x/lambda)^k} 698 * isf(p) = lambda * (-log p)^{1/k} 699 */ 700 701 /** 702 * Compute the CDF of the Weibull(lambda, k) distribution. 703 * Well-conditioned for small x and k, and for large lambda -- 704 * condition number 705 * 706 * -k (x/lambda)^k exp(-(x/lambda)^k)/[exp(-(x/lambda)^k) - 1] 707 * 708 * grows linearly with k, x^k, and lambda^{-k}. 709 */ 710 STATIC double 711 cdf_weibull(double x, double lambda, double k) 712 { 713 return -expm1(-pow(x/lambda, k)); 714 } 715 716 /** 717 * Compute the SF of the Weibull(lambda, k) distribution. 718 * Well-conditioned for small x and k, and for large lambda -- 719 * condition number 720 * 721 * -k (x/lambda)^k 722 * 723 * grows linearly with k, x^k, and lambda^{-k}. 724 */ 725 STATIC double 726 sf_weibull(double x, double lambda, double k) 727 { 728 return exp(-pow(x/lambda, k)); 729 } 730 731 /** 732 * Compute the inverse of the CDF of the Weibull(lambda, k) 733 * distribution. Ill-conditioned for p near 1, and for k near 0; 734 * condition number is 735 * 736 * (p/(1 - p))/(k log(1 - p)). 737 */ 738 STATIC double 739 icdf_weibull(double p, double lambda, double k) 740 { 741 return lambda*pow(-log1p(-p), 1/k); 742 } 743 744 /** 745 * Compute the inverse of the SF of the Weibull(lambda, k) 746 * distribution. Ill-conditioned for p near 0, and for k near 0; 747 * condition number is 748 * 749 * 1/(k log(p)). 750 */ 751 STATIC double 752 isf_weibull(double p, double lambda, double k) 753 { 754 return lambda*pow(-log(p), 1/k); 755 } 756 757 /* 758 * GeneralizedPareto(mu, sigma, xi), supported on (mu, +infinity) for 759 * nonnegative xi, or (mu, mu - sigma/xi) for negative xi. 760 * 761 * Samples: 762 * = mu - sigma log U, if xi = 0; 763 * = mu + sigma (U^{-xi} - 1)/xi = mu + sigma*expm1(-xi log U)/xi, if xi =/= 0, 764 * where U is uniform on (0,1]. 765 * = mu + sigma (e^{xi X} - 1)/xi, 766 * where X has standard exponential distribution. 767 * 768 * pdf(x) = sigma^{-1} (1 + xi (x - mu)/sigma)^{-(1 + 1/xi)} 769 * cdf(x) = 1 - (1 + xi (x - mu)/sigma)^{-1/xi} 770 * = 1 - e^{-log(1 + xi (x - mu)/sigma)/xi} 771 * --> 1 - e^{-(x - mu)/sigma} as xi --> 0 772 * sf(x) = (1 + xi (x - mu)/sigma)^{-1/xi} 773 * --> e^{-(x - mu)/sigma} as xi --> 0 774 * icdf(p) = mu + sigma*(p^{-xi} - 1)/xi 775 * = mu + sigma*expm1(-xi log p)/xi 776 * --> mu + sigma*log p as xi --> 0 777 * isf(p) = mu + sigma*((1 - p)^{xi} - 1)/xi 778 * = mu + sigma*expm1(-xi log1p(-p))/xi 779 * --> mu + sigma*log1p(-p) as xi --> 0 780 */ 781 782 /** 783 * Compute the CDF of the GeneralizedPareto(mu, sigma, xi) 784 * distribution. Well-conditioned everywhere. For standard 785 * distribution (mu=0, sigma=1), condition number 786 * 787 * (x/(1 + x xi)) / ((1 + x xi)^{1/xi} - 1) 788 * 789 * is bounded by 1, attained only at x = 0. 790 */ 791 STATIC double 792 cdf_genpareto(double x, double mu, double sigma, double xi) 793 { 794 double x_0 = (x - mu)/sigma; 795 796 /* 797 * log(1 + xi x_0)/xi 798 * = (-1/xi) \sum_{n=1}^infinity (-xi x_0)^n/n 799 * = (-1/xi) (-xi x_0 + \sum_{n=2}^infinity (-xi x_0)^n/n) 800 * = x_0 - (1/xi) \sum_{n=2}^infinity (-xi x_0)^n/n 801 * = x_0 - x_0 \sum_{n=2}^infinity (-xi x_0)^{n-1}/n 802 * = x_0 (1 - d), 803 * 804 * where d = \sum_{n=2}^infinity (-xi x_0)^{n-1}/n. If |xi| < 805 * eps/4|x_0|, then 806 * 807 * |d| <= \sum_{n=2}^infinity (eps/4)^{n-1}/n 808 * <= \sum_{n=2}^infinity (eps/4)^{n-1} 809 * = \sum_{n=1}^infinity (eps/4)^n 810 * = (eps/4) \sum_{n=0}^infinity (eps/4)^n 811 * = (eps/4)/(1 - eps/4) 812 * < eps/2 813 * 814 * for any 0 < eps < 2. Thus, the relative error of x_0 from 815 * log(1 + xi x_0)/xi is bounded by eps. 816 */ 817 if (fabs(xi) < 1e-17/x_0) 818 return -expm1(-x_0); 819 else 820 return -expm1(-log1p(xi*x_0)/xi); 821 } 822 823 /** 824 * Compute the SF of the GeneralizedPareto(mu, sigma, xi) distribution. 825 * For standard distribution (mu=0, sigma=1), ill-conditioned for xi 826 * near 0; condition number 827 * 828 * -x (1 + x xi)^{(-1 - xi)/xi}/(1 + x xi)^{-1/xi} 829 * = -x (1 + x xi)^{-1/xi - 1}/(1 + x xi)^{-1/xi} 830 * = -(x/(1 + x xi)) (1 + x xi)^{-1/xi}/(1 + x xi)^{-1/xi} 831 * = -x/(1 + x xi) 832 * 833 * is bounded by 1/xi. 834 */ 835 STATIC double 836 sf_genpareto(double x, double mu, double sigma, double xi) 837 { 838 double x_0 = (x - mu)/sigma; 839 840 if (fabs(xi) < 1e-17/x_0) 841 return exp(-x_0); 842 else 843 return exp(-log1p(xi*x_0)/xi); 844 } 845 846 /** 847 * Compute the inverse of the CDF of the GeneralizedPareto(mu, sigma, 848 * xi) distribution. Ill-conditioned for p near 1; condition number is 849 * 850 * xi (p/(1 - p))/(1 - (1 - p)^xi) 851 */ 852 STATIC double 853 icdf_genpareto(double p, double mu, double sigma, double xi) 854 { 855 /* 856 * To compute f(xi) = (U^{-xi} - 1)/xi = (e^{-xi log U} - 1)/xi 857 * for xi near zero (note f(xi) --> -log U as xi --> 0), write 858 * the absolutely convergent Taylor expansion 859 * 860 * f(xi) = (1/xi)*(-xi log U + \sum_{n=2}^infinity (-xi log U)^n/n! 861 * = -log U + (1/xi)*\sum_{n=2}^infinity (-xi log U)^n/n! 862 * = -log U + \sum_{n=2}^infinity xi^{n-1} (-log U)^n/n! 863 * = -log U - log U \sum_{n=2}^infinity (-xi log U)^{n-1}/n! 864 * = -log U (1 + \sum_{n=2}^infinity (-xi log U)^{n-1}/n!). 865 * 866 * Let d = \sum_{n=2}^infinity (-xi log U)^{n-1}/n!. What do we 867 * lose if we discard it and use -log U as an approximation to 868 * f(xi)? If |xi| < eps/-4log U, then 869 * 870 * |d| <= \sum_{n=2}^infinity |xi log U|^{n-1}/n! 871 * <= \sum_{n=2}^infinity (eps/4)^{n-1}/n! 872 * <= \sum_{n=1}^infinity (eps/4)^n 873 * = (eps/4) \sum_{n=0}^infinity (eps/4)^n 874 * = (eps/4)/(1 - eps/4) 875 * < eps/2, 876 * 877 * for any 0 < eps < 2. Hence, as long as |xi| < eps/-2log U, 878 * f(xi) = -log U (1 + d) for |d| <= eps/2. |d| is the 879 * relative error of f(xi) from -log U; from this bound, the 880 * relative error of -log U from f(xi) is at most (eps/2)/(1 - 881 * eps/2) = eps/2 + (eps/2)^2 + (eps/2)^3 + ... < eps for 0 < 882 * eps < 1. Since -log U < 1000 for all U in (0, 1] in 883 * binary64 floating-point, we can safely cut xi off at 1e-20 < 884 * eps/4000 and attain <1ulp error from series truncation. 885 */ 886 if (fabs(xi) <= 1e-20) 887 return mu - sigma*log1p(-p); 888 else 889 return mu + sigma*expm1(-xi*log1p(-p))/xi; 890 } 891 892 /** 893 * Compute the inverse of the SF of the GeneralizedPareto(mu, sigma, 894 * xi) distribution. Ill-conditioned for p near 1; condition number is 895 * 896 * -xi/(1 - p^{-xi}) 897 */ 898 STATIC double 899 isf_genpareto(double p, double mu, double sigma, double xi) 900 { 901 if (fabs(xi) <= 1e-20) 902 return mu - sigma*log(p); 903 else 904 return mu + sigma*expm1(-xi*log(p))/xi; 905 } 906 907 /*******************************************************************/ 908 909 /** 910 * Deterministic samplers, parametrized by uniform integer and (0,1] 911 * samples. No guarantees are made about _which_ mapping from the 912 * integer and (0,1] samples these use; all that is guaranteed is the 913 * distribution of the outputs conditioned on a uniform distribution on 914 * the inputs. The automatic tests in test_prob_distr.c double-check 915 * the particular mappings we use. 916 * 917 * Beware: Unlike random_uniform_01(), these are not guaranteed to be 918 * supported on all possible outputs. See Ilya Mironov, `On the 919 * Significance of the Least Significant Bits for Differential 920 * Privacy', for an example of what can go wrong if you try to use 921 * these to conceal information from an adversary but you expose the 922 * specific full-precision floating-point values. 923 * 924 * Note: None of these samplers use rejection sampling; they are all 925 * essentially inverse-CDF transforms with tweaks. If you were to add, 926 * say, a Gamma sampler with the Marsaglia-Tsang method, you would have 927 * to parametrize it by a potentially infinite stream of uniform (and 928 * perhaps normal) samples rather than a fixed number, which doesn't 929 * make for quite as nice automatic testing as for these. 930 */ 931 932 /** 933 * Deterministically sample from the interval [a, b], indexed by a 934 * uniform random floating-point number p0 in (0, 1]. 935 * 936 * Note that even if p0 is nonzero, the result may be equal to a, if 937 * ulp(a)/2 is nonnegligible, e.g. if a = 1. For maximum resolution, 938 * arrange |a| <= |b|. 939 */ 940 STATIC double 941 sample_uniform_interval(double p0, double a, double b) 942 { 943 /* 944 * XXX Prove that the distribution is, in fact, uniform on 945 * [a,b], particularly around p0 = 1, or at least has very 946 * small deviation from uniform, quantified appropriately 947 * (e.g., like in Monahan 1984, or by KL divergence). It 948 * almost certainly does but it would be nice to quantify the 949 * error. 950 */ 951 if ((a <= 0 && 0 <= b) || (b <= 0 && 0 <= a)) { 952 /* 953 * When ab < 0, (1 - t) a + t b is monotonic, since for 954 * a <= b it is a sum of nondecreasing functions of t, 955 * and for b <= a, of nonincreasing functions of t. 956 * Further, clearly at 0 and 1 it attains a and b, 957 * respectively. Hence it is bounded within [a, b]. 958 */ 959 return (1 - p0)*a + p0*b; 960 } else { 961 /* 962 * a + (b - a) t is monotonic -- it is obviously a 963 * nondecreasing function of t for a <= b. Further, it 964 * attains a at 0, and while it may overshoot b at 1, 965 * we have a 966 * 967 * Theorem. If 0 <= t < 1, then the floating-point 968 * evaluation of a + (b - a) t is bounded in [a, b]. 969 * 970 * Lemma 1. If 0 <= t < 1 is a floating-point number, 971 * then for any normal floating-point number x except 972 * the smallest in magnitude, |round(x*t)| < |x|. 973 * 974 * Proof. WLOG, assume x >= 0. Since the rounding 975 * function and t |---> x*t are nondecreasing, their 976 * composition t |---> round(x*t) is also 977 * nondecreasing, so it suffices to consider the 978 * largest floating-point number below 1, in particular 979 * t = 1 - ulp(1)/2. 980 * 981 * Case I: If x is a power of two, then the next 982 * floating-point number below x is x - ulp(x)/2 = x - 983 * x*ulp(1)/2 = x*(1 - ulp(1)/2) = x*t, so, since x*t 984 * is a floating-point number, multiplication is exact, 985 * and thus round(x*t) = x*t < x. 986 * 987 * Case II: If x is not a power of two, then the 988 * greatest lower bound of real numbers rounded to x is 989 * x - ulp(x)/2 = x - ulp(T(x))/2 = x - T(x)*ulp(1)/2, 990 * where T(X) is the largest power of two below x. 991 * Anything below this bound is rounded to a 992 * floating-point number smaller than x, and x*t = x*(1 993 * - ulp(1)/2) = x - x*ulp(1)/2 < x - T(x)*ulp(1)/2 994 * since T(x) < x, so round(x*t) < x*t < x. QED. 995 * 996 * Lemma 2. If x and y are subnormal, then round(x + 997 * y) = x + y. 998 * 999 * Proof. It is a matter of adding the significands, 1000 * since if we treat subnormals as having an implicit 1001 * zero bit before the `binary' point, their exponents 1002 * are all the same. There is at most one carry/borrow 1003 * bit, which can always be accommodated either in a 1004 * subnormal, or, at largest, in the implicit one bit 1005 * of a normal. 1006 * 1007 * Lemma 3. Let x and y be floating-point numbers. If 1008 * round(x - y) is subnormal or zero, then it is equal 1009 * to x - y. 1010 * 1011 * Proof. Case I (equal): round(x - y) = 0 iff x = y; 1012 * hence if round(x - y) = 0, then round(x - y) = 0 = x 1013 * - y. 1014 * 1015 * Case II (subnormal/subnormal): If x and y are both 1016 * subnormal, this follows directly from Lemma 2. 1017 * 1018 * Case IIIa (normal/subnormal): If x is normal and y 1019 * is subnormal, then x and y must share sign, or else 1020 * x - y would be larger than x and thus rounded to 1021 * normal. If s is the smallest normal positive 1022 * floating-point number, |x| < 2s since by 1023 * construction 2s - |y| is normal for all subnormal y. 1024 * This means that x and y must have the same exponent, 1025 * so the difference is the difference of significands, 1026 * which is exact. 1027 * 1028 * Case IIIb (subnormal/normal): Same as case IIIa for 1029 * -(y - x). 1030 * 1031 * Case IV (normal/normal): If x and y are both normal, 1032 * then they must share sign, or else x - y would be 1033 * larger than x and thus rounded to normal. Note that 1034 * |y| < 2|x|, for if |y| >= 2|x|, then |x| - |y| <= 1035 * -|x| but -|x| is normal like x. Also, |x|/2 < |y|: 1036 * if |x|/2 is subnormal, it must hold because y is 1037 * normal; if |x|/2 is normal, then |x|/2 >= s, so 1038 * since |x| - |y| < s, 1039 * 1040 * |x|/2 = |x| - |x|/2 <= |x| - s <= |y|; 1041 * 1042 * that is, |x|/2 < |y| < 2|x|, so by the Sterbenz 1043 * lemma, round(x - y) = x - y. QED. 1044 * 1045 * Proof of theorem. WLOG, assume 0 <= a <= b. Since 1046 * round(a + round(round(b - a)*t) is nondecreasing in 1047 * t and attains a at 0, the lower end of the bound is 1048 * trivial; we must show the upper end of the bound 1049 * strictly. It suffices to show this for the largest 1050 * floating-point number below 1, namely 1 - ulp(1)/2. 1051 * 1052 * Case I: round(b - a) is normal. Then it is at most 1053 * the smallest floating-point number above b - a. By 1054 * Lemma 1, round(round(b - a)*t) < round(b - a). 1055 * Since the inequality is strict, and since 1056 * round(round(b - a)*t) is a floating-point number 1057 * below round(b - a), and since there are no 1058 * floating-point numbers between b - a and round(b - 1059 * a), we must have round(round(b - a)*t) < b - a. 1060 * Then since y |---> round(a + y) is nondecreasing, we 1061 * must have 1062 * 1063 * round(a + round(round(b - a)*t)) 1064 * <= round(a + (b - a)) 1065 * = round(b) = b. 1066 * 1067 * Case II: round(b - a) is subnormal. In this case, 1068 * Lemma 1 falls apart -- we are not guaranteed the 1069 * strict inequality. However, by Lemma 3, the 1070 * difference is exact: round(b - a) = b - a. Thus, 1071 * 1072 * round(a + round(round(b - a)*t)) 1073 * <= round(a + round((b - a)*t)) 1074 * <= round(a + (b - a)) 1075 * = round(b) 1076 * = b, 1077 * 1078 * QED. 1079 */ 1080 1081 /* p0 is restricted to [0,1], but we use >= to silence -Wfloat-equal. */ 1082 if (p0 >= 1) 1083 return b; 1084 return a + (b - a)*p0; 1085 } 1086 } 1087 1088 /** 1089 * Deterministically sample from the standard logistic distribution, 1090 * indexed by a uniform random 32-bit integer s and uniform random 1091 * floating-point numbers t and p0 in (0, 1]. 1092 */ 1093 STATIC double 1094 sample_logistic(uint32_t s, double t, double p0) 1095 { 1096 double sign = (s & 1) ? -1 : +1; 1097 double r; 1098 1099 /* 1100 * We carve up the interval (0, 1) into subregions to compute 1101 * the inverse CDF precisely: 1102 * 1103 * A = (0, 1/(1 + e)] ---> (-infinity, -1] 1104 * B = [1/(1 + e), 1/2] ---> [-1, 0] 1105 * C = [1/2, 1 - 1/(1 + e)] ---> [0, 1] 1106 * D = [1 - 1/(1 + e), 1) ---> [1, +infinity) 1107 * 1108 * Cases D and C are mirror images of cases A and B, 1109 * respectively, so we choose between them by the sign chosen 1110 * by a fair coin toss. We choose between cases A and B by a 1111 * coin toss weighted by 1112 * 1113 * 2/(1 + e) = 1 - [1/2 - 1/(1 + e)]/(1/2): 1114 * 1115 * if it comes up heads, scale p0 into a uniform (0, 1/(1 + e)] 1116 * sample p; if it comes up tails, scale p0 into a uniform (0, 1117 * 1/2 - 1/(1 + e)] sample and compute the inverse CDF of p = 1118 * 1/2 - p0. 1119 */ 1120 if (t <= 2/(1 + exp(1))) { 1121 /* p uniform in (0, 1/(1 + e)], represented by p. */ 1122 p0 /= 1 + exp(1); 1123 r = logit(p0); 1124 } else { 1125 /* 1126 * p uniform in [1/(1 + e), 1/2), actually represented 1127 * by p0 = 1/2 - p uniform in (0, 1/2 - 1/(1 + e)], so 1128 * that p = 1/2 - p. 1129 */ 1130 p0 *= 0.5 - 1/(1 + exp(1)); 1131 r = logithalf(p0); 1132 } 1133 1134 /* 1135 * We have chosen from the negative half of the standard 1136 * logistic distribution, which is symmetric with the positive 1137 * half. Now use the sign to choose uniformly between them. 1138 */ 1139 return sign*r; 1140 } 1141 1142 /** 1143 * Deterministically sample from the logistic distribution scaled by 1144 * sigma and translated by mu. 1145 */ 1146 static double 1147 sample_logistic_locscale(uint32_t s, double t, double p0, double mu, 1148 double sigma) 1149 { 1150 1151 return mu + sigma*sample_logistic(s, t, p0); 1152 } 1153 1154 /** 1155 * Deterministically sample from the standard log-logistic 1156 * distribution, indexed by a uniform random 32-bit integer s and a 1157 * uniform random floating-point number p0 in (0, 1]. 1158 */ 1159 STATIC double 1160 sample_log_logistic(uint32_t s, double p0) 1161 { 1162 1163 /* 1164 * Carve up the interval (0, 1) into (0, 1/2] and [1/2, 1); the 1165 * condition numbers of the icdf and the isf coincide at 1/2. 1166 */ 1167 p0 *= 0.5; 1168 if ((s & 1) == 0) { 1169 /* p = p0 in (0, 1/2] */ 1170 return p0/(1 - p0); 1171 } else { 1172 /* p = 1 - p0 in [1/2, 1) */ 1173 return (1 - p0)/p0; 1174 } 1175 } 1176 1177 /** 1178 * Deterministically sample from the log-logistic distribution with 1179 * scale alpha and shape beta. 1180 */ 1181 static double 1182 sample_log_logistic_scaleshape(uint32_t s, double p0, double alpha, 1183 double beta) 1184 { 1185 double x = sample_log_logistic(s, p0); 1186 1187 return alpha*pow(x, 1/beta); 1188 } 1189 1190 /** 1191 * Deterministically sample from the standard exponential distribution, 1192 * indexed by a uniform random 32-bit integer s and a uniform random 1193 * floating-point number p0 in (0, 1]. 1194 */ 1195 static double 1196 sample_exponential(uint32_t s, double p0) 1197 { 1198 /* 1199 * We would like to evaluate log(p) for p near 0, and log1p(-p) 1200 * for p near 1. Simply carve the interval into (0, 1/2] and 1201 * [1/2, 1) by a fair coin toss. 1202 */ 1203 p0 *= 0.5; 1204 if ((s & 1) == 0) 1205 /* p = p0 in (0, 1/2] */ 1206 return -log(p0); 1207 else 1208 /* p = 1 - p0 in [1/2, 1) */ 1209 return -log1p(-p0); 1210 } 1211 1212 /** 1213 * Deterministically sample from a Weibull distribution with scale 1214 * lambda and shape k -- just an exponential with a shape parameter in 1215 * addition to a scale parameter. (Yes, lambda really is the scale, 1216 * _not_ the rate.) 1217 */ 1218 STATIC double 1219 sample_weibull(uint32_t s, double p0, double lambda, double k) 1220 { 1221 1222 return lambda*pow(sample_exponential(s, p0), 1/k); 1223 } 1224 1225 /** 1226 * Deterministically sample from the generalized Pareto distribution 1227 * with shape xi, indexed by a uniform random 32-bit integer s and a 1228 * uniform random floating-point number p0 in (0, 1]. 1229 */ 1230 STATIC double 1231 sample_genpareto(uint32_t s, double p0, double xi) 1232 { 1233 double x = sample_exponential(s, p0); 1234 1235 /* 1236 * Write f(xi) = (e^{xi x} - 1)/xi for xi near zero as the 1237 * absolutely convergent Taylor series 1238 * 1239 * f(x) = (1/xi) (xi x + \sum_{n=2}^infinity (xi x)^n/n!) 1240 * = x + (1/xi) \sum_{n=2}^infinity (xi x)^n/n! 1241 * = x + \sum_{n=2}^infinity xi^{n-1} x^n/n! 1242 * = x + x \sum_{n=2}^infinity (xi x)^{n-1}/n! 1243 * = x (1 + \sum_{n=2}^infinity (xi x)^{n-1}/n!). 1244 * 1245 * d = \sum_{n=2}^infinity (xi x)^{n-1}/n! is the relative error 1246 * of f(x) from x. If |xi| < eps/4x, then 1247 * 1248 * |d| <= \sum_{n=2}^infinity |xi x|^{n-1}/n! 1249 * <= \sum_{n=2}^infinity (eps/4)^{n-1}/n! 1250 * <= \sum_{n=1}^infinity (eps/4) 1251 * = (eps/4) \sum_{n=0}^infinity (eps/4)^n 1252 * = (eps/4)/(1 - eps/4) 1253 * < eps/2, 1254 * 1255 * for any 0 < eps < 2. Hence, as long as |xi| < eps/2x, f(xi) 1256 * = x (1 + d) for |d| <= eps/2, so x = f(xi) (1 + d') for |d'| 1257 * <= eps. What bound should we use for x? 1258 * 1259 * - If x is exponentially distributed, x > 200 with 1260 * probability below e^{-200} << 2^{-256}, i.e. never. 1261 * 1262 * - If x is computed by -log(U) for U in (0, 1], x is 1263 * guaranteed to be below 1000 in IEEE 754 binary64 1264 * floating-point. 1265 * 1266 * We can safely cut xi off at 1e-20 < eps/4000 and attain an 1267 * error bounded by 0.5 ulp for this expression. 1268 */ 1269 return (fabs(xi) < 1e-20 ? x : expm1(xi*x)/xi); 1270 } 1271 1272 /** 1273 * Deterministically sample from a generalized Pareto distribution with 1274 * shape xi, scaled by sigma and translated by mu. 1275 */ 1276 static double 1277 sample_genpareto_locscale(uint32_t s, double p0, double mu, double sigma, 1278 double xi) 1279 { 1280 1281 return mu + sigma*sample_genpareto(s, p0, xi); 1282 } 1283 1284 /** 1285 * Deterministically sample from the geometric distribution with 1286 * per-trial success probability p. 1287 **/ 1288 // clang-format off 1289 /* 1290 * XXX Quantify the error (KL divergence?) of this 1291 * ceiling-of-exponential sampler from a true geometric distribution, 1292 * which we could get by rejection sampling. Relevant papers: 1293 * 1294 * John F. Monahan, `Accuracy in Random Number Generation', 1295 * Mathematics of Computation 45(172), October 1984, pp. 559--568. 1296 https://pdfs.semanticscholar.org/aca6/74b96da1df77b2224e8cfc5dd6d61a471632.pdf 1297 * Karl Bringmann and Tobias Friedrich, `Exact and Efficient 1298 * Generation of Geometric Random Variates and Random Graphs', in 1299 * Proceedings of the 40th International Colloaquium on Automata, 1300 * Languages, and Programming -- ICALP 2013, Springer LNCS 7965, 1301 * pp.267--278. 1302 * https://doi.org/10.1007/978-3-642-39206-1_23 1303 * https://people.mpi-inf.mpg.de/~kbringma/paper/2013ICALP-1.pdf 1304 */ 1305 // clang-format on 1306 static double 1307 sample_geometric(uint32_t s, double p0, double p) 1308 { 1309 double x = sample_exponential(s, p0); 1310 1311 /* This is actually a check against 1, but we do >= so that the compiler 1312 does not raise a -Wfloat-equal */ 1313 if (p >= 1) 1314 return 1; 1315 1316 return ceil(-x/log1p(-p)); 1317 } 1318 1319 /*******************************************************************/ 1320 1321 /** Public API for probability distributions: 1322 * 1323 * These are wrapper functions on top of the various probability distribution 1324 * operations using the generic <b>dist</b> structure. 1325 1326 * These are the functions that should be used by consumers of this API. 1327 */ 1328 1329 /** Returns the name of the distribution in <b>dist</b>. */ 1330 const char * 1331 dist_name(const struct dist_t *dist) 1332 { 1333 return dist->ops->name; 1334 } 1335 1336 /* Sample a value from <b>dist</b> and return it. */ 1337 double 1338 dist_sample(const struct dist_t *dist) 1339 { 1340 return dist->ops->sample(dist); 1341 } 1342 1343 /** Compute the CDF of <b>dist</b> at <b>x</b>. */ 1344 double 1345 dist_cdf(const struct dist_t *dist, double x) 1346 { 1347 return dist->ops->cdf(dist, x); 1348 } 1349 1350 /** Compute the SF (Survival function) of <b>dist</b> at <b>x</b>. */ 1351 double 1352 dist_sf(const struct dist_t *dist, double x) 1353 { 1354 return dist->ops->sf(dist, x); 1355 } 1356 1357 /** Compute the iCDF (Inverse CDF) of <b>dist</b> at <b>x</b>. */ 1358 double 1359 dist_icdf(const struct dist_t *dist, double p) 1360 { 1361 return dist->ops->icdf(dist, p); 1362 } 1363 1364 /** Compute the iSF (Inverse Survival function) of <b>dist</b> at <b>x</b>. */ 1365 double 1366 dist_isf(const struct dist_t *dist, double p) 1367 { 1368 return dist->ops->isf(dist, p); 1369 } 1370 1371 /** Functions for uniform distribution */ 1372 1373 static double 1374 uniform_sample(const struct dist_t *dist) 1375 { 1376 const struct uniform_t *U = dist_to_const_uniform(dist); 1377 double p0 = random_uniform_01(); 1378 1379 return sample_uniform_interval(p0, U->a, U->b); 1380 } 1381 1382 static double 1383 uniform_cdf(const struct dist_t *dist, double x) 1384 { 1385 const struct uniform_t *U = dist_to_const_uniform(dist); 1386 if (x < U->a) 1387 return 0; 1388 else if (x < U->b) 1389 return (x - U->a)/(U->b - U->a); 1390 else 1391 return 1; 1392 } 1393 1394 static double 1395 uniform_sf(const struct dist_t *dist, double x) 1396 { 1397 const struct uniform_t *U = dist_to_const_uniform(dist); 1398 1399 if (x > U->b) 1400 return 0; 1401 else if (x > U->a) 1402 return (U->b - x)/(U->b - U->a); 1403 else 1404 return 1; 1405 } 1406 1407 static double 1408 uniform_icdf(const struct dist_t *dist, double p) 1409 { 1410 const struct uniform_t *U = dist_to_const_uniform(dist); 1411 double w = U->b - U->a; 1412 1413 return (p < 0.5 ? (U->a + w*p) : (U->b - w*(1 - p))); 1414 } 1415 1416 static double 1417 uniform_isf(const struct dist_t *dist, double p) 1418 { 1419 const struct uniform_t *U = dist_to_const_uniform(dist); 1420 double w = U->b - U->a; 1421 1422 return (p < 0.5 ? (U->b - w*p) : (U->a + w*(1 - p))); 1423 } 1424 1425 const struct dist_ops_t uniform_ops = { 1426 .name = "uniform", 1427 .sample = uniform_sample, 1428 .cdf = uniform_cdf, 1429 .sf = uniform_sf, 1430 .icdf = uniform_icdf, 1431 .isf = uniform_isf, 1432 }; 1433 1434 /*******************************************************************/ 1435 1436 /** Private functions for each probability distribution. */ 1437 1438 /** Functions for logistic distribution: */ 1439 1440 static double 1441 logistic_sample(const struct dist_t *dist) 1442 { 1443 const struct logistic_t *L = dist_to_const_logistic(dist); 1444 uint32_t s = crypto_fast_rng_get_u32(get_thread_fast_rng()); 1445 double t = random_uniform_01(); 1446 double p0 = random_uniform_01(); 1447 1448 return sample_logistic_locscale(s, t, p0, L->mu, L->sigma); 1449 } 1450 1451 static double 1452 logistic_cdf(const struct dist_t *dist, double x) 1453 { 1454 const struct logistic_t *L = dist_to_const_logistic(dist); 1455 return cdf_logistic(x, L->mu, L->sigma); 1456 } 1457 1458 static double 1459 logistic_sf(const struct dist_t *dist, double x) 1460 { 1461 const struct logistic_t *L = dist_to_const_logistic(dist); 1462 return sf_logistic(x, L->mu, L->sigma); 1463 } 1464 1465 static double 1466 logistic_icdf(const struct dist_t *dist, double p) 1467 { 1468 const struct logistic_t *L = dist_to_const_logistic(dist); 1469 return icdf_logistic(p, L->mu, L->sigma); 1470 } 1471 1472 static double 1473 logistic_isf(const struct dist_t *dist, double p) 1474 { 1475 const struct logistic_t *L = dist_to_const_logistic(dist); 1476 return isf_logistic(p, L->mu, L->sigma); 1477 } 1478 1479 const struct dist_ops_t logistic_ops = { 1480 .name = "logistic", 1481 .sample = logistic_sample, 1482 .cdf = logistic_cdf, 1483 .sf = logistic_sf, 1484 .icdf = logistic_icdf, 1485 .isf = logistic_isf, 1486 }; 1487 1488 /** Functions for log-logistic distribution: */ 1489 1490 static double 1491 log_logistic_sample(const struct dist_t *dist) 1492 { 1493 const struct log_logistic_t *LL = dist_to_const_log_logistic(dist); 1494 uint32_t s = crypto_fast_rng_get_u32(get_thread_fast_rng()); 1495 double p0 = random_uniform_01(); 1496 1497 return sample_log_logistic_scaleshape(s, p0, LL->alpha, LL->beta); 1498 } 1499 1500 static double 1501 log_logistic_cdf(const struct dist_t *dist, double x) 1502 { 1503 const struct log_logistic_t *LL = dist_to_const_log_logistic(dist); 1504 return cdf_log_logistic(x, LL->alpha, LL->beta); 1505 } 1506 1507 static double 1508 log_logistic_sf(const struct dist_t *dist, double x) 1509 { 1510 const struct log_logistic_t *LL = dist_to_const_log_logistic(dist); 1511 return sf_log_logistic(x, LL->alpha, LL->beta); 1512 } 1513 1514 static double 1515 log_logistic_icdf(const struct dist_t *dist, double p) 1516 { 1517 const struct log_logistic_t *LL = dist_to_const_log_logistic(dist); 1518 return icdf_log_logistic(p, LL->alpha, LL->beta); 1519 } 1520 1521 static double 1522 log_logistic_isf(const struct dist_t *dist, double p) 1523 { 1524 const struct log_logistic_t *LL = dist_to_const_log_logistic(dist); 1525 return isf_log_logistic(p, LL->alpha, LL->beta); 1526 } 1527 1528 const struct dist_ops_t log_logistic_ops = { 1529 .name = "log logistic", 1530 .sample = log_logistic_sample, 1531 .cdf = log_logistic_cdf, 1532 .sf = log_logistic_sf, 1533 .icdf = log_logistic_icdf, 1534 .isf = log_logistic_isf, 1535 }; 1536 1537 /** Functions for Weibull distribution */ 1538 1539 static double 1540 weibull_sample(const struct dist_t *dist) 1541 { 1542 const struct weibull_t *W = dist_to_const_weibull(dist); 1543 uint32_t s = crypto_fast_rng_get_u32(get_thread_fast_rng()); 1544 double p0 = random_uniform_01(); 1545 1546 return sample_weibull(s, p0, W->lambda, W->k); 1547 } 1548 1549 static double 1550 weibull_cdf(const struct dist_t *dist, double x) 1551 { 1552 const struct weibull_t *W = dist_to_const_weibull(dist); 1553 return cdf_weibull(x, W->lambda, W->k); 1554 } 1555 1556 static double 1557 weibull_sf(const struct dist_t *dist, double x) 1558 { 1559 const struct weibull_t *W = dist_to_const_weibull(dist); 1560 return sf_weibull(x, W->lambda, W->k); 1561 } 1562 1563 static double 1564 weibull_icdf(const struct dist_t *dist, double p) 1565 { 1566 const struct weibull_t *W = dist_to_const_weibull(dist); 1567 return icdf_weibull(p, W->lambda, W->k); 1568 } 1569 1570 static double 1571 weibull_isf(const struct dist_t *dist, double p) 1572 { 1573 const struct weibull_t *W = dist_to_const_weibull(dist); 1574 return isf_weibull(p, W->lambda, W->k); 1575 } 1576 1577 const struct dist_ops_t weibull_ops = { 1578 .name = "Weibull", 1579 .sample = weibull_sample, 1580 .cdf = weibull_cdf, 1581 .sf = weibull_sf, 1582 .icdf = weibull_icdf, 1583 .isf = weibull_isf, 1584 }; 1585 1586 /** Functions for generalized Pareto distributions */ 1587 1588 static double 1589 genpareto_sample(const struct dist_t *dist) 1590 { 1591 const struct genpareto_t *GP = dist_to_const_genpareto(dist); 1592 uint32_t s = crypto_fast_rng_get_u32(get_thread_fast_rng()); 1593 double p0 = random_uniform_01(); 1594 1595 return sample_genpareto_locscale(s, p0, GP->mu, GP->sigma, GP->xi); 1596 } 1597 1598 static double 1599 genpareto_cdf(const struct dist_t *dist, double x) 1600 { 1601 const struct genpareto_t *GP = dist_to_const_genpareto(dist); 1602 return cdf_genpareto(x, GP->mu, GP->sigma, GP->xi); 1603 } 1604 1605 static double 1606 genpareto_sf(const struct dist_t *dist, double x) 1607 { 1608 const struct genpareto_t *GP = dist_to_const_genpareto(dist); 1609 return sf_genpareto(x, GP->mu, GP->sigma, GP->xi); 1610 } 1611 1612 static double 1613 genpareto_icdf(const struct dist_t *dist, double p) 1614 { 1615 const struct genpareto_t *GP = dist_to_const_genpareto(dist); 1616 return icdf_genpareto(p, GP->mu, GP->sigma, GP->xi); 1617 } 1618 1619 static double 1620 genpareto_isf(const struct dist_t *dist, double p) 1621 { 1622 const struct genpareto_t *GP = dist_to_const_genpareto(dist); 1623 return isf_genpareto(p, GP->mu, GP->sigma, GP->xi); 1624 } 1625 1626 const struct dist_ops_t genpareto_ops = { 1627 .name = "generalized Pareto", 1628 .sample = genpareto_sample, 1629 .cdf = genpareto_cdf, 1630 .sf = genpareto_sf, 1631 .icdf = genpareto_icdf, 1632 .isf = genpareto_isf, 1633 }; 1634 1635 /** Functions for geometric distribution on number of trials before success */ 1636 1637 static double 1638 geometric_sample(const struct dist_t *dist) 1639 { 1640 const struct geometric_t *G = dist_to_const_geometric(dist); 1641 uint32_t s = crypto_fast_rng_get_u32(get_thread_fast_rng()); 1642 double p0 = random_uniform_01(); 1643 1644 return sample_geometric(s, p0, G->p); 1645 } 1646 1647 static double 1648 geometric_cdf(const struct dist_t *dist, double x) 1649 { 1650 const struct geometric_t *G = dist_to_const_geometric(dist); 1651 1652 if (x < 1) 1653 return 0; 1654 /* 1 - (1 - p)^floor(x) = 1 - e^{floor(x) log(1 - p)} */ 1655 return -expm1(floor(x)*log1p(-G->p)); 1656 } 1657 1658 static double 1659 geometric_sf(const struct dist_t *dist, double x) 1660 { 1661 const struct geometric_t *G = dist_to_const_geometric(dist); 1662 1663 if (x < 1) 1664 return 0; 1665 /* (1 - p)^floor(x) = e^{ceil(x) log(1 - p)} */ 1666 return exp(floor(x)*log1p(-G->p)); 1667 } 1668 1669 static double 1670 geometric_icdf(const struct dist_t *dist, double p) 1671 { 1672 const struct geometric_t *G = dist_to_const_geometric(dist); 1673 1674 return log1p(-p)/log1p(-G->p); 1675 } 1676 1677 static double 1678 geometric_isf(const struct dist_t *dist, double p) 1679 { 1680 const struct geometric_t *G = dist_to_const_geometric(dist); 1681 1682 return log(p)/log1p(-G->p); 1683 } 1684 1685 const struct dist_ops_t geometric_ops = { 1686 .name = "geometric (1-based)", 1687 .sample = geometric_sample, 1688 .cdf = geometric_cdf, 1689 .sf = geometric_sf, 1690 .icdf = geometric_icdf, 1691 .isf = geometric_isf, 1692 };