1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // REQUIRES: long_tests
11 // This test is super slow, in particular with msan or tsan. In order to avoid timeouts and to
12 // spend less time waiting for this particular test to complete we compile with optimizations.
13 // ADDITIONAL_COMPILE_FLAGS(msan): -O1
14 // ADDITIONAL_COMPILE_FLAGS(tsan): -O1
16 // FIXME: This and other tests fail under GCC with optimizations enabled.
17 // More investigation is needed, but it appears that GCC is performing more constant folding.
21 // template<class IntType = int>
22 // class negative_binomial_distribution
24 // template<class _URNG> result_type operator()(_URNG& g);
32 #include "test_macros.h"
41 typedef std::negative_binomial_distribution
<T
> D
;
42 typedef std::minstd_rand G
;
45 const int N
= 1000000;
46 std::vector
<typename
D::result_type
> u
;
47 for (int i
= 0; i
< N
; ++i
)
49 typename
D::result_type v
= d(g
);
50 assert(d
.min() <= v
&& v
<= d
.max());
53 double mean
= std::accumulate(u
.begin(), u
.end(),
54 double(0)) / u
.size();
58 for (unsigned i
= 0; i
< u
.size(); ++i
)
60 double dbl
= (u
[i
] - mean
);
67 double dev
= std::sqrt(var
);
68 skew
/= u
.size() * dev
* var
;
69 kurtosis
/= u
.size() * var
* var
;
71 double x_mean
= d
.k() * (1 - d
.p()) / d
.p();
72 double x_var
= x_mean
/ d
.p();
73 double x_skew
= (2 - d
.p()) / std::sqrt(d
.k() * (1 - d
.p()));
74 double x_kurtosis
= 6. / d
.k() + sqr(d
.p()) / (d
.k() * (1 - d
.p()));
75 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
76 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
77 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.01);
78 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.03);
83 typedef std::negative_binomial_distribution
<T
> D
;
84 typedef std::mt19937 G
;
87 const int N
= 1000000;
88 std::vector
<typename
D::result_type
> u
;
89 for (int i
= 0; i
< N
; ++i
)
91 typename
D::result_type v
= d(g
);
92 assert(d
.min() <= v
&& v
<= d
.max());
95 double mean
= std::accumulate(u
.begin(), u
.end(),
96 double(0)) / u
.size();
100 for (unsigned i
= 0; i
< u
.size(); ++i
)
102 double dbl
= (u
[i
] - mean
);
103 double d2
= sqr(dbl
);
109 double dev
= std::sqrt(var
);
110 skew
/= u
.size() * dev
* var
;
111 kurtosis
/= u
.size() * var
* var
;
113 double x_mean
= d
.k() * (1 - d
.p()) / d
.p();
114 double x_var
= x_mean
/ d
.p();
115 double x_skew
= (2 - d
.p()) / std::sqrt(d
.k() * (1 - d
.p()));
116 double x_kurtosis
= 6. / d
.k() + sqr(d
.p()) / (d
.k() * (1 - d
.p()));
117 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
118 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
119 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.02);
120 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.1);
125 typedef std::negative_binomial_distribution
<T
> D
;
126 typedef std::mt19937 G
;
129 const int N
= 1000000;
130 std::vector
<typename
D::result_type
> u
;
131 for (int i
= 0; i
< N
; ++i
)
133 typename
D::result_type v
= d(g
);
134 assert(d
.min() <= v
&& v
<= d
.max());
137 double mean
= std::accumulate(u
.begin(), u
.end(),
138 double(0)) / u
.size();
142 for (unsigned i
= 0; i
< u
.size(); ++i
)
144 double dbl
= (u
[i
] - mean
);
145 double d2
= sqr(dbl
);
151 double dev
= std::sqrt(var
);
152 skew
/= u
.size() * dev
* var
;
153 kurtosis
/= u
.size() * var
* var
;
155 double x_mean
= d
.k() * (1 - d
.p()) / d
.p();
156 double x_var
= x_mean
/ d
.p();
157 double x_skew
= (2 - d
.p()) / std::sqrt(d
.k() * (1 - d
.p()));
158 double x_kurtosis
= 6. / d
.k() + sqr(d
.p()) / (d
.k() * (1 - d
.p()));
159 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
160 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
161 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.02);
162 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.08);
167 typedef std::negative_binomial_distribution
<T
> D
;
168 typedef std::mt19937 G
;
172 std::vector
<typename
D::result_type
> u
;
173 for (int i
= 0; i
< N
; ++i
)
175 typename
D::result_type v
= d(g
);
176 assert(d
.min() <= v
&& v
<= d
.max());
179 double mean
= std::accumulate(u
.begin(), u
.end(),
180 double(0)) / u
.size();
184 for (unsigned i
= 0; i
< u
.size(); ++i
)
186 double dbl
= (u
[i
] - mean
);
187 double d2
= sqr(dbl
);
193 double dev
= std::sqrt(var
);
194 skew
/= u
.size() * dev
* var
;
195 kurtosis
/= u
.size() * var
* var
;
197 double x_mean
= d
.k() * (1 - d
.p()) / d
.p();
198 double x_var
= x_mean
/ d
.p();
199 double x_skew
= (2 - d
.p()) / std::sqrt(d
.k() * (1 - d
.p()));
200 double x_kurtosis
= 6. / d
.k() + sqr(d
.p()) / (d
.k() * (1 - d
.p()));
201 assert(mean
== x_mean
);
202 assert(var
== x_var
);
203 // assert(skew == x_skew);
204 (void)skew
; (void)x_skew
;
205 // assert(kurtosis == x_kurtosis);
206 (void)kurtosis
; (void)x_kurtosis
;
211 typedef std::negative_binomial_distribution
<T
> D
;
212 typedef std::mt19937 G
;
215 const int N
= 1000000;
216 std::vector
<typename
D::result_type
> u
;
217 for (int i
= 0; i
< N
; ++i
)
219 typename
D::result_type v
= d(g
);
220 assert(d
.min() <= v
&& v
<= d
.max());
223 double mean
= std::accumulate(u
.begin(), u
.end(),
224 double(0)) / u
.size();
228 for (unsigned i
= 0; i
< u
.size(); ++i
)
230 double dbl
= (u
[i
] - mean
);
231 double d2
= sqr(dbl
);
237 double dev
= std::sqrt(var
);
238 skew
/= u
.size() * dev
* var
;
239 kurtosis
/= u
.size() * var
* var
;
241 double x_mean
= d
.k() * (1 - d
.p()) / d
.p();
242 double x_var
= x_mean
/ d
.p();
243 double x_skew
= (2 - d
.p()) / std::sqrt(d
.k() * (1 - d
.p()));
244 double x_kurtosis
= 6. / d
.k() + sqr(d
.p()) / (d
.k() * (1 - d
.p()));
245 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
246 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
247 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.02);
248 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.3);
253 typedef std::negative_binomial_distribution
<T
> D
;
254 typedef std::mt19937 G
;
257 const int N
= 1000000;
258 std::vector
<typename
D::result_type
> u
;
259 for (int i
= 0; i
< N
; ++i
)
261 typename
D::result_type v
= d(g
);
262 assert(d
.min() <= v
&& v
<= d
.max());
265 double mean
= std::accumulate(u
.begin(), u
.end(),
266 double(0)) / u
.size();
270 for (unsigned i
= 0; i
< u
.size(); ++i
)
272 double dbl
= (u
[i
] - mean
);
273 double d2
= sqr(dbl
);
279 double dev
= std::sqrt(var
);
280 skew
/= u
.size() * dev
* var
;
281 kurtosis
/= u
.size() * var
* var
;
283 double x_mean
= d
.k() * (1 - d
.p()) / d
.p();
284 double x_var
= x_mean
/ d
.p();
285 double x_skew
= (2 - d
.p()) / std::sqrt(d
.k() * (1 - d
.p()));
286 double x_kurtosis
= 6. / d
.k() + sqr(d
.p()) / (d
.k() * (1 - d
.p()));
287 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
288 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
289 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.01);
290 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.03);
303 int main(int, char**) {
309 tests
<unsigned short>();
310 tests
<unsigned int>();
311 tests
<unsigned long>();
312 tests
<unsigned long long>();
314 #if defined(_LIBCPP_VERSION) // extension
315 // TODO: std::negative_binomial_distribution currently doesn't work reliably with small types.
318 #if !defined(TEST_HAS_NO_INT128)
320 tests
<__uint128_t
>();