[MIR][NFC] Use `std::move` to avoid copying (#125930)
[llvm-project.git] / libcxx / test / std / numerics / rand / rand.dist / rand.dist.norm / rand.dist.norm.chisq / eval.pass.cpp
blob8a92a6ea7f63c9bdaa8eaf9d626af859fc28ea83
1 //===----------------------------------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // REQUIRES: long_tests
11 // <random>
13 // template<class RealType = double>
14 // class chi_squared_distribution
16 // template<class _URNG> result_type operator()(_URNG& g);
18 #include <random>
19 #include <cassert>
20 #include <cmath>
21 #include <cstddef>
22 #include <numeric>
23 #include <vector>
25 #include "test_macros.h"
27 template <class T>
28 inline
30 sqr(T x)
32 return x * x;
35 int main(int, char**)
38 typedef std::chi_squared_distribution<> D;
39 typedef std::minstd_rand G;
40 G g;
41 D d(0.5);
42 const int N = 1000000;
43 std::vector<D::result_type> u;
44 for (int i = 0; i < N; ++i)
46 D::result_type v = d(g);
47 assert(d.min() < v);
48 u.push_back(v);
50 double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
51 double var = 0;
52 double skew = 0;
53 double kurtosis = 0;
54 for (std::size_t i = 0; i < u.size(); ++i)
56 double dbl = (u[i] - mean);
57 double d2 = sqr(dbl);
58 var += d2;
59 skew += dbl * d2;
60 kurtosis += d2 * d2;
62 var /= u.size();
63 double dev = std::sqrt(var);
64 skew /= u.size() * dev * var;
65 kurtosis /= u.size() * var * var;
66 kurtosis -= 3;
67 double x_mean = d.n();
68 double x_var = 2 * d.n();
69 double x_skew = std::sqrt(8 / d.n());
70 double x_kurtosis = 12 / d.n();
71 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
72 assert(std::abs((var - x_var) / x_var) < 0.01);
73 assert(std::abs((skew - x_skew) / x_skew) < 0.01);
74 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.04);
77 typedef std::chi_squared_distribution<> D;
78 typedef std::minstd_rand G;
79 G g;
80 D d(1);
81 const int N = 1000000;
82 std::vector<D::result_type> u;
83 for (int i = 0; i < N; ++i)
85 D::result_type v = d(g);
86 assert(d.min() < v);
87 u.push_back(v);
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 (std::size_t i = 0; i < u.size(); ++i)
95 double dbl = (u[i] - mean);
96 double d2 = sqr(dbl);
97 var += d2;
98 skew += dbl * d2;
99 kurtosis += d2 * d2;
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.n();
107 double x_var = 2 * d.n();
108 double x_skew = std::sqrt(8 / d.n());
109 double x_kurtosis = 12 / d.n();
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.03);
116 typedef std::chi_squared_distribution<> D;
117 typedef std::mt19937 G;
118 G g;
119 D d(2);
120 const int N = 1000000;
121 std::vector<D::result_type> u;
122 for (int i = 0; i < N; ++i)
124 D::result_type v = d(g);
125 assert(d.min() < v);
126 u.push_back(v);
128 double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
129 double var = 0;
130 double skew = 0;
131 double kurtosis = 0;
132 for (std::size_t i = 0; i < u.size(); ++i)
134 double dbl = (u[i] - mean);
135 double d2 = sqr(dbl);
136 var += d2;
137 skew += dbl * d2;
138 kurtosis += d2 * d2;
140 var /= u.size();
141 double dev = std::sqrt(var);
142 skew /= u.size() * dev * var;
143 kurtosis /= u.size() * var * var;
144 kurtosis -= 3;
145 double x_mean = d.n();
146 double x_var = 2 * d.n();
147 double x_skew = std::sqrt(8 / d.n());
148 double x_kurtosis = 12 / d.n();
149 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
150 assert(std::abs((var - x_var) / x_var) < 0.01);
151 assert(std::abs((skew - x_skew) / x_skew) < 0.01);
152 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.03);
155 return 0;