1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // REQUIRES: long_tests
14 // template<class IntType = int>
15 // class binomial_distribution
17 // template<class _URNG> result_type operator()(_URNG& g);
35 typedef std::binomial_distribution<> D;
36 typedef std::mt19937_64 G;
39 const int N = 1000000;
40 std::vector<D::result_type> u;
41 for (int i = 0; i < N; ++i)
43 D::result_type v = d(g);
44 assert(d.min() <= v && v <= d.max());
47 double mean = std::accumulate(u.begin(), u.end(),
48 double(0)) / u.size();
52 for (unsigned i = 0; i < u.size(); ++i)
54 double dbl = (u[i] - mean);
61 double dev = std::sqrt(var);
62 skew /= u.size() * dev * var;
63 kurtosis /= u.size() * var * var;
65 double x_mean = d.t() * d.p();
66 double x_var = x_mean*(1-d.p());
67 double x_skew = (1-2*d.p()) / std::sqrt(x_var);
68 double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
69 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
70 assert(std::abs((var - x_var) / x_var) < 0.01);
71 assert(std::abs((skew - x_skew) / x_skew) < 0.01);
72 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.04);
78 typedef std::binomial_distribution<> D;
79 typedef std::mt19937 G;
83 std::vector<D::result_type> u;
84 for (int i = 0; i < N; ++i)
86 D::result_type v = d(g);
87 assert(d.min() <= v && v <= d.max());
90 double mean = std::accumulate(u.begin(), u.end(),
91 double(0)) / u.size();
95 for (unsigned i = 0; i < u.size(); ++i)
97 double dbl = (u[i] - mean);
104 double dev = std::sqrt(var);
105 skew /= u.size() * dev * var;
106 kurtosis /= u.size() * var * var;
108 double x_mean = d.t() * d.p();
109 double x_var = x_mean*(1-d.p());
110 double x_skew = (1-2*d.p()) / std::sqrt(x_var);
111 double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
112 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
113 assert(std::abs((var - x_var) / x_var) < 0.01);
114 assert(std::abs((skew - x_skew) / x_skew) < 0.01);
115 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
121 typedef std::binomial_distribution<> D;
122 typedef std::mt19937 G;
125 const int N = 100000;
126 std::vector<D::result_type> u;
127 for (int i = 0; i < N; ++i)
129 D::result_type v = d(g);
130 assert(d.min() <= v && v <= d.max());
133 double mean = std::accumulate(u.begin(), u.end(),
134 double(0)) / u.size();
138 for (unsigned i = 0; i < u.size(); ++i)
140 double dbl = (u[i] - mean);
141 double d2 = sqr(dbl);
147 double dev = std::sqrt(var);
148 skew /= u.size() * dev * var;
149 kurtosis /= u.size() * var * var;
151 double x_mean = d.t() * d.p();
152 double x_var = x_mean*(1-d.p());
153 double x_skew = (1-2*d.p()) / std::sqrt(x_var);
154 double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
155 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
156 assert(std::abs((var - x_var) / x_var) < 0.01);
157 assert(std::abs((skew - x_skew) / x_skew) < 0.03);
158 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.3);
164 typedef std::binomial_distribution<> D;
165 typedef std::mt19937 G;
168 const int N = 100000;
169 std::vector<D::result_type> u;
170 for (int i = 0; i < N; ++i)
172 D::result_type v = d(g);
173 assert(d.min() <= v && v <= d.max());
176 double mean = std::accumulate(u.begin(), u.end(),
177 double(0)) / u.size();
181 for (unsigned i = 0; i < u.size(); ++i)
183 double dbl = (u[i] - mean);
184 double d2 = sqr(dbl);
190 //double dev = std::sqrt(var);
192 // skew computes to 0./0. == nan
193 // kurtosis computes to 0./0. == nan
196 // These tests are commented out because UBSan warns about division by 0
197 // skew /= u.size() * dev * var;
198 // kurtosis /= u.size() * var * var;
200 double x_mean = d.t() * d.p();
201 double x_var = x_mean*(1-d.p());
202 // double x_skew = (1-2*d.p()) / std::sqrt(x_var);
203 // double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
204 assert(mean == x_mean);
205 assert(var == x_var);
206 // assert(skew == x_skew);
207 // assert(kurtosis == x_kurtosis);
213 typedef std::binomial_distribution<> D;
214 typedef std::mt19937 G;
217 const int N = 100000;
218 std::vector<D::result_type> u;
219 for (int i = 0; i < N; ++i)
221 D::result_type v = d(g);
222 assert(d.min() <= v && v <= d.max());
225 double mean = std::accumulate(u.begin(), u.end(),
226 double(0)) / u.size();
230 for (unsigned i = 0; i < u.size(); ++i)
232 double dbl = (u[i] - mean);
233 double d2 = sqr(dbl);
239 // double dev = std::sqrt(var);
241 // skew computes to 0./0. == nan
242 // kurtosis computes to 0./0. == nan
245 // These tests are commented out because UBSan warns about division by 0
246 // skew /= u.size() * dev * var;
247 // kurtosis /= u.size() * var * var;
249 double x_mean = d.t() * d.p();
250 double x_var = x_mean*(1-d.p());
251 // double x_skew = (1-2*d.p()) / std::sqrt(x_var);
252 // double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
253 assert(mean == x_mean);
254 assert(var == x_var);
255 // assert(skew == x_skew);
256 // assert(kurtosis == x_kurtosis);
262 typedef std::binomial_distribution<> D;
263 typedef std::mt19937 G;
266 const int N = 100000;
267 std::vector<D::result_type> u;
268 for (int i = 0; i < N; ++i)
270 D::result_type v = d(g);
271 assert(d.min() <= v && v <= d.max());
274 double mean = std::accumulate(u.begin(), u.end(),
275 double(0)) / u.size();
279 for (unsigned i = 0; i < u.size(); ++i)
281 double dbl = (u[i] - mean);
282 double d2 = sqr(dbl);
288 double dev = std::sqrt(var);
289 skew /= u.size() * dev * var;
290 kurtosis /= u.size() * var * var;
292 double x_mean = d.t() * d.p();
293 double x_var = x_mean*(1-d.p());
294 double x_skew = (1-2*d.p()) / std::sqrt(x_var);
295 double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
296 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
297 assert(std::abs((var - x_var) / x_var) < 0.01);
298 assert(std::abs(skew - x_skew) < 0.01);
299 assert(std::abs(kurtosis - x_kurtosis) < 0.01);
305 typedef std::binomial_distribution<> D;
306 typedef std::mt19937 G;
309 const int N = 100000;
310 std::vector<D::result_type> u;
311 for (int i = 0; i < N; ++i)
313 D::result_type v = d(g);
314 assert(d.min() <= v && v <= d.max());
317 double mean = std::accumulate(u.begin(), u.end(),
318 double(0)) / u.size();
322 for (unsigned i = 0; i < u.size(); ++i)
324 double dbl = (u[i] - mean);
325 double d2 = sqr(dbl);
331 double dev = std::sqrt(var);
332 skew /= u.size() * dev * var;
333 kurtosis /= u.size() * var * var;
335 double x_mean = d.t() * d.p();
336 double x_var = x_mean*(1-d.p());
337 double x_skew = (1-2*d.p()) / std::sqrt(x_var);
338 double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
339 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
340 assert(std::abs((var - x_var) / x_var) < 0.01);
341 assert(std::abs(skew - x_skew) < 0.01);
342 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
348 const int N = 100000;
352 std::binomial_distribution<> dist1(5, 0.1);
353 std::binomial_distribution<unsigned> dist2(5, 0.1);
355 for(int i = 0; i < N; ++i) {
356 int r1 = dist1(gen1);
357 unsigned r2 = dist2(gen2);
359 assert(static_cast<unsigned>(r1) == r2);
366 typedef std::binomial_distribution<> D;
367 typedef std::mt19937 G;
370 const int N = 100000;
371 std::vector<D::result_type> u;
372 for (int i = 0; i < N; ++i)
374 D::result_type v = d(g);
375 assert(d.min() <= v && v <= d.max());
378 double mean = std::accumulate(u.begin(), u.end(),
379 double(0)) / u.size();
383 for (unsigned i = 0; i < u.size(); ++i)
385 double dbl = (u[i] - mean);
386 double d2 = sqr(dbl);
392 // double dev = std::sqrt(var);
394 // skew computes to 0./0. == nan
395 // kurtosis computes to 0./0. == nan
398 // These tests are commented out because UBSan warns about division by 0
399 // skew /= u.size() * dev * var;
400 // kurtosis /= u.size() * var * var;
402 double x_mean = d.t() * d.p();
403 double x_var = x_mean*(1-d.p());
404 // double x_skew = (1-2*d.p()) / std::sqrt(x_var);
405 // double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
406 assert(mean == x_mean);
407 assert(var == x_var);
408 // assert(skew == x_skew);
409 // assert(kurtosis == x_kurtosis);
415 typedef std::binomial_distribution<> D;
416 typedef std::mt19937 G;
419 const int N = 100000;
420 std::vector<D::result_type> u;
421 for (int i = 0; i < N; ++i)
423 D::result_type v = d(g);
424 assert(d.min() <= v && v <= d.max());
427 double mean = std::accumulate(u.begin(), u.end(),
428 double(0)) / u.size();
432 for (unsigned i = 0; i < u.size(); ++i)
434 double dbl = (u[i] - mean);
435 double d2 = sqr(dbl);
441 // double dev = std::sqrt(var);
443 // skew computes to 0./0. == nan
444 // kurtosis computes to 0./0. == nan
447 // These tests are commented out because UBSan warns about division by 0
448 // skew /= u.size() * dev * var;
449 // kurtosis /= u.size() * var * var;
451 double x_mean = d.t() * d.p();
452 double x_var = x_mean*(1-d.p());
453 // double x_skew = (1-2*d.p()) / std::sqrt(x_var);
454 // double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
455 assert(mean == x_mean);
456 assert(var == x_var);
457 // assert(skew == x_skew);
458 // assert(kurtosis == x_kurtosis);
464 typedef std::binomial_distribution<> D;
465 typedef std::mt19937 G;
468 const int N = 100000;
469 std::vector<D::result_type> u;
470 for (int i = 0; i < N; ++i)
472 D::result_type v = d(g);
473 assert(d.min() <= v && v <= d.max());
476 double mean = std::accumulate(u.begin(), u.end(),
477 double(0)) / u.size();
481 for (unsigned i = 0; i < u.size(); ++i)
483 double dbl = (u[i] - mean);
484 double d2 = sqr(dbl);
490 // double dev = std::sqrt(var);
492 // skew computes to 0./0. == nan
493 // kurtosis computes to 0./0. == nan
496 // These tests are commented out because UBSan warns about division by 0
497 // skew /= u.size() * dev * var;
498 // kurtosis /= u.size() * var * var;
500 double x_mean = d.t() * d.p();
501 double x_var = x_mean*(1-d.p());
502 // double x_skew = (1-2*d.p()) / std::sqrt(x_var);
503 // double x_kurtosis = (1-6*d.p()*(1-d.p())) / x_var;
504 assert(mean == x_mean);
505 assert(var == x_var);
506 // assert(skew == x_skew);
507 // assert(kurtosis == x_kurtosis);