eval.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant//===----------------------------------------------------------------------===//
297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant//
397dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant//                     The LLVM Compiler Infrastructure
497dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
797dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant//
897dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant//===----------------------------------------------------------------------===//
997dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant
1097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant// <random>
1197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant
1297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant// template<class RealType = double>
1397dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant// class chi_squared_distribution
1497dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant
1597dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant// template<class _URNG> result_type operator()(_URNG& g);
1697dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant
1797dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant#include <random>
1897dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant#include <cassert>
1997dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant#include <vector>
2097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant#include <numeric>
2197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant
2297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnanttemplate <class T>
2397dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnantinline
2497dc2f35c3d0d797ece43f5598023c6952144f37Howard HinnantT
2597dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnantsqr(T x)
2697dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant{
2797dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    return x * x;
2897dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant}
2997dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant
3097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnantint main()
3197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant{
3297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    {
3397dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef std::chi_squared_distribution<> D;
3497dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef D::param_type P;
3597dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef std::minstd_rand G;
3697dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        G g;
3797dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        D d(0.5);
38df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        const int N = 1000000;
3997dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        std::vector<D::result_type> u;
4097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        for (int i = 0; i < N; ++i)
41df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
42df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            D::result_type v = d(g);
43df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            assert(d.min() < v);
44df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            u.push_back(v);
45df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
46df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
47df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double var = 0;
48df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double skew = 0;
49df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double kurtosis = 0;
5097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        for (int i = 0; i < u.size(); ++i)
51df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
52df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            double d = (u[i] - mean);
53df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            double d2 = sqr(d);
54df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            var += d2;
55df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            skew += d * d2;
56df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            kurtosis += d2 * d2;
57df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
5897dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        var /= u.size();
59df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double dev = std::sqrt(var);
60df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        skew /= u.size() * dev * var;
61df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis /= u.size() * var * var;
62df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis -= 3;
63df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_mean = d.n();
64df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_var = 2 * d.n();
65df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_skew = std::sqrt(8 / d.n());
66df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_kurtosis = 12 / d.n();
67d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((mean - x_mean) / x_mean) < 0.01);
68d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
69d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((skew - x_skew) / x_skew) < 0.01);
70d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
7197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    }
7297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    {
7397dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef std::chi_squared_distribution<> D;
7497dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef D::param_type P;
7597dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef std::minstd_rand G;
7697dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        G g;
7797dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        D d(1);
78df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        const int N = 1000000;
7997dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        std::vector<D::result_type> u;
8097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        for (int i = 0; i < N; ++i)
81df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
82df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            D::result_type v = d(g);
83df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            assert(d.min() < v);
84df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            u.push_back(v);
85df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
86df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
87df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double var = 0;
88df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double skew = 0;
89df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double kurtosis = 0;
9097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        for (int i = 0; i < u.size(); ++i)
91df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
92df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            double d = (u[i] - mean);
93df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            double d2 = sqr(d);
94df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            var += d2;
95df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            skew += d * d2;
96df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            kurtosis += d2 * d2;
97df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
9897dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        var /= u.size();
99df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double dev = std::sqrt(var);
100df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        skew /= u.size() * dev * var;
101df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis /= u.size() * var * var;
102df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis -= 3;
103df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_mean = d.n();
104df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_var = 2 * d.n();
105df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_skew = std::sqrt(8 / d.n());
106df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_kurtosis = 12 / d.n();
107d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((mean - x_mean) / x_mean) < 0.01);
108d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
109d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((skew - x_skew) / x_skew) < 0.01);
110d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
11197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    }
11297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    {
11397dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef std::chi_squared_distribution<> D;
11497dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        typedef D::param_type P;
115df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        typedef std::mt19937 G;
11697dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        G g;
11797dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        D d(2);
118df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        const int N = 1000000;
11997dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        std::vector<D::result_type> u;
12097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        for (int i = 0; i < N; ++i)
121df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
122df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            D::result_type v = d(g);
123df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            assert(d.min() < v);
124df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            u.push_back(v);
125df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
126df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
127df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double var = 0;
128df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double skew = 0;
129df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double kurtosis = 0;
13097dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        for (int i = 0; i < u.size(); ++i)
131df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
132df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            double d = (u[i] - mean);
133df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            double d2 = sqr(d);
134df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            var += d2;
135df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            skew += d * d2;
136df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            kurtosis += d2 * d2;
137df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
13897dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant        var /= u.size();
139df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double dev = std::sqrt(var);
140df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        skew /= u.size() * dev * var;
141df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis /= u.size() * var * var;
142df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis -= 3;
143df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_mean = d.n();
144df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_var = 2 * d.n();
145df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_skew = std::sqrt(8 / d.n());
146df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        double x_kurtosis = 12 / d.n();
147d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((mean - x_mean) / x_mean) < 0.01);
148d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
149d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((skew - x_skew) / x_skew) < 0.01);
150d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
15197dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant    }
15297dc2f35c3d0d797ece43f5598023c6952144f37Howard Hinnant}
153