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 // <random>
11 
12 // template<class RealType = double>
13 // class extreme_value_distribution
14 
15 // template<class _URNG> result_type operator()(_URNG& g);
16 
17 #include <random>
18 #include <cassert>
19 #include <vector>
20 #include <numeric>
21 
22 template <class T>
23 inline
24 T
25 sqr(T x)
26 {
27     return x * x;
28 }
29 
30 int main()
31 {
32     {
33         typedef std::extreme_value_distribution<> D;
34         typedef D::param_type P;
35         typedef std::mt19937 G;
36         G g;
37         D d(0.5, 2);
38         const int N = 1000000;
39         std::vector<D::result_type> u;
40         for (int i = 0; i < N; ++i)
41         {
42             D::result_type v = d(g);
43             u.push_back(v);
44         }
45         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
46         double var = 0;
47         double skew = 0;
48         double kurtosis = 0;
49         for (int i = 0; i < u.size(); ++i)
50         {
51             double d = (u[i] - mean);
52             double d2 = sqr(d);
53             var += d2;
54             skew += d * d2;
55             kurtosis += d2 * d2;
56         }
57         var /= u.size();
58         double dev = std::sqrt(var);
59         skew /= u.size() * dev * var;
60         kurtosis /= u.size() * var * var;
61         kurtosis -= 3;
62         double x_mean = d.a() + d.b() * 0.577215665;
63         double x_var = sqr(d.b()) * 1.644934067;
64         double x_skew = 1.139547;
65         double x_kurtosis = 12./5;
66         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
67         assert(std::abs((var - x_var) / x_var) < 0.01);
68         assert(std::abs((skew - x_skew) / x_skew) < 0.01);
69         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
70     }
71     {
72         typedef std::extreme_value_distribution<> D;
73         typedef D::param_type P;
74         typedef std::mt19937 G;
75         G g;
76         D d(1, 2);
77         const int N = 1000000;
78         std::vector<D::result_type> u;
79         for (int i = 0; i < N; ++i)
80         {
81             D::result_type v = d(g);
82             u.push_back(v);
83         }
84         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
85         double var = 0;
86         double skew = 0;
87         double kurtosis = 0;
88         for (int i = 0; i < u.size(); ++i)
89         {
90             double d = (u[i] - mean);
91             double d2 = sqr(d);
92             var += d2;
93             skew += d * d2;
94             kurtosis += d2 * d2;
95         }
96         var /= u.size();
97         double dev = std::sqrt(var);
98         skew /= u.size() * dev * var;
99         kurtosis /= u.size() * var * var;
100         kurtosis -= 3;
101         double x_mean = d.a() + d.b() * 0.577215665;
102         double x_var = sqr(d.b()) * 1.644934067;
103         double x_skew = 1.139547;
104         double x_kurtosis = 12./5;
105         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
106         assert(std::abs((var - x_var) / x_var) < 0.01);
107         assert(std::abs((skew - x_skew) / x_skew) < 0.01);
108         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
109     }
110     {
111         typedef std::extreme_value_distribution<> D;
112         typedef D::param_type P;
113         typedef std::mt19937 G;
114         G g;
115         D d(1.5, 3);
116         const int N = 1000000;
117         std::vector<D::result_type> u;
118         for (int i = 0; i < N; ++i)
119         {
120             D::result_type v = d(g);
121             u.push_back(v);
122         }
123         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
124         double var = 0;
125         double skew = 0;
126         double kurtosis = 0;
127         for (int i = 0; i < u.size(); ++i)
128         {
129             double d = (u[i] - mean);
130             double d2 = sqr(d);
131             var += d2;
132             skew += d * d2;
133             kurtosis += d2 * d2;
134         }
135         var /= u.size();
136         double dev = std::sqrt(var);
137         skew /= u.size() * dev * var;
138         kurtosis /= u.size() * var * var;
139         kurtosis -= 3;
140         double x_mean = d.a() + d.b() * 0.577215665;
141         double x_var = sqr(d.b()) * 1.644934067;
142         double x_skew = 1.139547;
143         double x_kurtosis = 12./5;
144         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
145         assert(std::abs((var - x_var) / x_var) < 0.01);
146         assert(std::abs((skew - x_skew) / x_skew) < 0.01);
147         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
148     }
149     {
150         typedef std::extreme_value_distribution<> D;
151         typedef D::param_type P;
152         typedef std::mt19937 G;
153         G g;
154         D d(3, 4);
155         const int N = 1000000;
156         std::vector<D::result_type> u;
157         for (int i = 0; i < N; ++i)
158         {
159             D::result_type v = d(g);
160             u.push_back(v);
161         }
162         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
163         double var = 0;
164         double skew = 0;
165         double kurtosis = 0;
166         for (int i = 0; i < u.size(); ++i)
167         {
168             double d = (u[i] - mean);
169             double d2 = sqr(d);
170             var += d2;
171             skew += d * d2;
172             kurtosis += d2 * d2;
173         }
174         var /= u.size();
175         double dev = std::sqrt(var);
176         skew /= u.size() * dev * var;
177         kurtosis /= u.size() * var * var;
178         kurtosis -= 3;
179         double x_mean = d.a() + d.b() * 0.577215665;
180         double x_var = sqr(d.b()) * 1.644934067;
181         double x_skew = 1.139547;
182         double x_kurtosis = 12./5;
183         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
184         assert(std::abs((var - x_var) / x_var) < 0.01);
185         assert(std::abs((skew - x_skew) / x_skew) < 0.01);
186         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
187     }
188 }
189