]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.extreme/eval.pass.cpp
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / test / std / numerics / rand / rand.dis / rand.dist.pois / rand.dist.pois.extreme / eval.pass.cpp
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // REQUIRES: long_tests
11
12 // <random>
13
14 // template<class RealType = double>
15 // class extreme_value_distribution
16
17 // template<class _URNG> result_type operator()(_URNG& g);
18
19 #include <random>
20 #include <cassert>
21 #include <vector>
22 #include <numeric>
23
24 template <class T>
25 inline
26 T
27 sqr(T x)
28 {
29     return x * x;
30 }
31
32 void
33 test1()
34 {
35     typedef std::extreme_value_distribution<> D;
36     typedef D::param_type P;
37     typedef std::mt19937 G;
38     G g;
39     D d(0.5, 2);
40     const int N = 1000000;
41     std::vector<D::result_type> u;
42     for (int i = 0; i < N; ++i)
43     {
44         D::result_type v = d(g);
45         u.push_back(v);
46     }
47     double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
48     double var = 0;
49     double skew = 0;
50     double kurtosis = 0;
51     for (unsigned i = 0; i < u.size(); ++i)
52     {
53         double dbl = (u[i] - mean);
54         double d2 = sqr(dbl);
55         var += d2;
56         skew += dbl * d2;
57         kurtosis += d2 * d2;
58     }
59     var /= u.size();
60     double dev = std::sqrt(var);
61     skew /= u.size() * dev * var;
62     kurtosis /= u.size() * var * var;
63     kurtosis -= 3;
64     double x_mean = d.a() + d.b() * 0.577215665;
65     double x_var = sqr(d.b()) * 1.644934067;
66     double x_skew = 1.139547;
67     double x_kurtosis = 12./5;
68     assert(std::abs((mean - x_mean) / x_mean) < 0.01);
69     assert(std::abs((var - x_var) / x_var) < 0.01);
70     assert(std::abs((skew - x_skew) / x_skew) < 0.01);
71     assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
72 }
73
74 void
75 test2()
76 {
77     typedef std::extreme_value_distribution<> D;
78     typedef D::param_type P;
79     typedef std::mt19937 G;
80     G g;
81     D d(1, 2);
82     const int N = 1000000;
83     std::vector<D::result_type> u;
84     for (int i = 0; i < N; ++i)
85     {
86         D::result_type v = d(g);
87         u.push_back(v);
88     }
89     double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
90     double var = 0;
91     double skew = 0;
92     double kurtosis = 0;
93     for (unsigned i = 0; i < u.size(); ++i)
94     {
95         double dbl = (u[i] - mean);
96         double d2 = sqr(dbl);
97         var += d2;
98         skew += dbl * d2;
99         kurtosis += d2 * d2;
100     }
101     var /= u.size();
102     double dev = std::sqrt(var);
103     skew /= u.size() * dev * var;
104     kurtosis /= u.size() * var * var;
105     kurtosis -= 3;
106     double x_mean = d.a() + d.b() * 0.577215665;
107     double x_var = sqr(d.b()) * 1.644934067;
108     double x_skew = 1.139547;
109     double x_kurtosis = 12./5;
110     assert(std::abs((mean - x_mean) / x_mean) < 0.01);
111     assert(std::abs((var - x_var) / x_var) < 0.01);
112     assert(std::abs((skew - x_skew) / x_skew) < 0.01);
113     assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
114 }
115
116 void
117 test3()
118 {
119     typedef std::extreme_value_distribution<> D;
120     typedef D::param_type P;
121     typedef std::mt19937 G;
122     G g;
123     D d(1.5, 3);
124     const int N = 1000000;
125     std::vector<D::result_type> u;
126     for (int i = 0; i < N; ++i)
127     {
128         D::result_type v = d(g);
129         u.push_back(v);
130     }
131     double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
132     double var = 0;
133     double skew = 0;
134     double kurtosis = 0;
135     for (unsigned i = 0; i < u.size(); ++i)
136     {
137         double dbl = (u[i] - mean);
138         double d2 = sqr(dbl);
139         var += d2;
140         skew += dbl * d2;
141         kurtosis += d2 * d2;
142     }
143     var /= u.size();
144     double dev = std::sqrt(var);
145     skew /= u.size() * dev * var;
146     kurtosis /= u.size() * var * var;
147     kurtosis -= 3;
148     double x_mean = d.a() + d.b() * 0.577215665;
149     double x_var = sqr(d.b()) * 1.644934067;
150     double x_skew = 1.139547;
151     double x_kurtosis = 12./5;
152     assert(std::abs((mean - x_mean) / x_mean) < 0.01);
153     assert(std::abs((var - x_var) / x_var) < 0.01);
154     assert(std::abs((skew - x_skew) / x_skew) < 0.01);
155     assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
156 }
157
158 void
159 test4()
160 {
161     typedef std::extreme_value_distribution<> D;
162     typedef D::param_type P;
163     typedef std::mt19937 G;
164     G g;
165     D d(3, 4);
166     const int N = 1000000;
167     std::vector<D::result_type> u;
168     for (int i = 0; i < N; ++i)
169     {
170         D::result_type v = d(g);
171         u.push_back(v);
172     }
173     double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
174     double var = 0;
175     double skew = 0;
176     double kurtosis = 0;
177     for (unsigned i = 0; i < u.size(); ++i)
178     {
179         double dbl = (u[i] - mean);
180         double d2 = sqr(dbl);
181         var += d2;
182         skew += dbl * d2;
183         kurtosis += d2 * d2;
184     }
185     var /= u.size();
186     double dev = std::sqrt(var);
187     skew /= u.size() * dev * var;
188     kurtosis /= u.size() * var * var;
189     kurtosis -= 3;
190     double x_mean = d.a() + d.b() * 0.577215665;
191     double x_var = sqr(d.b()) * 1.644934067;
192     double x_skew = 1.139547;
193     double x_kurtosis = 12./5;
194     assert(std::abs((mean - x_mean) / x_mean) < 0.01);
195     assert(std::abs((var - x_var) / x_var) < 0.01);
196     assert(std::abs((skew - x_skew) / x_skew) < 0.01);
197     assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
198 }
199
200 int main()
201 {
202     test1();
203     test2();
204     test3();
205     test4();
206 }