Skip to content

Commit 45a9997

Browse files
author
Howard Hinnant
committed
Beefed up the tests for all of the distributions to include checks against the expected skewness and kurtosis
llvm-svn: 103910
1 parent e6ae81b commit 45a9997

File tree

22 files changed

+2182
-297
lines changed

22 files changed

+2182
-297
lines changed

libcxx/include/random

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3434,9 +3434,7 @@ public:
34343434
void param(const param_type& __p) {__p_ = __p;}
34353435

34363436
result_type min() const {return 0;}
3437-
result_type max() const
3438-
{return -std::log(1-std::nextafter(result_type(1), result_type(-1))) /
3439-
__p_.lambda();}
3437+
result_type max() const {return numeric_limits<result_type>::infinity();}
34403438

34413439
friend bool operator==(const exponential_distribution& __x,
34423440
const exponential_distribution& __y)

libcxx/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bernoulli/eval.pass.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,29 @@ int main()
4040
double mean = std::accumulate(u.begin(), u.end(),
4141
double(0)) / u.size();
4242
double var = 0;
43+
double skew = 0;
44+
double kurtosis = 0;
4345
for (int i = 0; i < u.size(); ++i)
44-
var += sqr(u[i] - mean);
46+
{
47+
double d = (u[i] - mean);
48+
double d2 = sqr(d);
49+
var += d2;
50+
skew += d * d2;
51+
kurtosis += d2 * d2;
52+
}
4553
var /= u.size();
54+
double dev = std::sqrt(var);
55+
skew /= u.size() * dev * var;
56+
kurtosis /= u.size() * var * var;
57+
kurtosis -= 3;
4658
double x_mean = d.p();
4759
double x_var = d.p()*(1-d.p());
60+
double x_skew = (1 - 2 * d.p())/std::sqrt(x_var);
61+
double x_kurtosis = (6 * sqr(d.p()) - 6 * d.p() + 1)/x_var;
4862
assert(std::abs(mean - x_mean) / x_mean < 0.01);
4963
assert(std::abs(var - x_var) / x_var < 0.01);
64+
assert(std::abs(skew - x_skew) / x_skew < 0.01);
65+
assert(std::abs(kurtosis - x_kurtosis) / x_kurtosis < 0.01);
5066
}
5167
{
5268
typedef std::bernoulli_distribution D;
@@ -60,12 +76,28 @@ int main()
6076
double mean = std::accumulate(u.begin(), u.end(),
6177
double(0)) / u.size();
6278
double var = 0;
79+
double skew = 0;
80+
double kurtosis = 0;
6381
for (int i = 0; i < u.size(); ++i)
64-
var += sqr(u[i] - mean);
82+
{
83+
double d = (u[i] - mean);
84+
double d2 = sqr(d);
85+
var += d2;
86+
skew += d * d2;
87+
kurtosis += d2 * d2;
88+
}
6589
var /= u.size();
90+
double dev = std::sqrt(var);
91+
skew /= u.size() * dev * var;
92+
kurtosis /= u.size() * var * var;
93+
kurtosis -= 3;
6694
double x_mean = d.p();
6795
double x_var = d.p()*(1-d.p());
96+
double x_skew = (1 - 2 * d.p())/std::sqrt(x_var);
97+
double x_kurtosis = (6 * sqr(d.p()) - 6 * d.p() + 1)/x_var;
6898
assert(std::abs(mean - x_mean) / x_mean < 0.01);
6999
assert(std::abs(var - x_var) / x_var < 0.01);
100+
assert(std::abs(skew - x_skew) / x_skew < 0.01);
101+
assert(std::abs(kurtosis - x_kurtosis) / x_kurtosis < 0.01);
70102
}
71103
}

libcxx/test/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bernoulli/eval_param.pass.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,29 @@ int main()
4242
double mean = std::accumulate(u.begin(), u.end(),
4343
double(0)) / u.size();
4444
double var = 0;
45+
double skew = 0;
46+
double kurtosis = 0;
4547
for (int i = 0; i < u.size(); ++i)
46-
var += sqr(u[i] - mean);
48+
{
49+
double d = (u[i] - mean);
50+
double d2 = sqr(d);
51+
var += d2;
52+
skew += d * d2;
53+
kurtosis += d2 * d2;
54+
}
4755
var /= u.size();
56+
double dev = std::sqrt(var);
57+
skew /= u.size() * dev * var;
58+
kurtosis /= u.size() * var * var;
59+
kurtosis -= 3;
4860
double x_mean = p.p();
4961
double x_var = p.p()*(1-p.p());
62+
double x_skew = (1 - 2 * p.p())/std::sqrt(x_var);
63+
double x_kurtosis = (6 * sqr(p.p()) - 6 * p.p() + 1)/x_var;
5064
assert(std::abs(mean - x_mean) / x_mean < 0.01);
5165
assert(std::abs(var - x_var) / x_var < 0.01);
66+
assert(std::abs(skew - x_skew) / x_skew < 0.01);
67+
assert(std::abs(kurtosis - x_kurtosis) / x_kurtosis < 0.01);
5268
}
5369
{
5470
typedef std::bernoulli_distribution D;
@@ -64,12 +80,28 @@ int main()
6480
double mean = std::accumulate(u.begin(), u.end(),
6581
double(0)) / u.size();
6682
double var = 0;
83+
double skew = 0;
84+
double kurtosis = 0;
6785
for (int i = 0; i < u.size(); ++i)
68-
var += sqr(u[i] - mean);
86+
{
87+
double d = (u[i] - mean);
88+
double d2 = sqr(d);
89+
var += d2;
90+
skew += d * d2;
91+
kurtosis += d2 * d2;
92+
}
6993
var /= u.size();
94+
double dev = std::sqrt(var);
95+
skew /= u.size() * dev * var;
96+
kurtosis /= u.size() * var * var;
97+
kurtosis -= 3;
7098
double x_mean = p.p();
7199
double x_var = p.p()*(1-p.p());
100+
double x_skew = (1 - 2 * p.p())/std::sqrt(x_var);
101+
double x_kurtosis = (6 * sqr(p.p()) - 6 * p.p() + 1)/x_var;
72102
assert(std::abs(mean - x_mean) / x_mean < 0.01);
73103
assert(std::abs(var - x_var) / x_var < 0.01);
104+
assert(std::abs(skew - x_skew) / x_skew < 0.01);
105+
assert(std::abs(kurtosis - x_kurtosis) / x_kurtosis < 0.01);
74106
}
75107
}

0 commit comments

Comments
 (0)