eval.pass.cpp revision f417abe6837f1b3a0aaaf9a0e0f4e9dde414829d
1f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant//===----------------------------------------------------------------------===//
2f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant//
3f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant//                     The LLVM Compiler Infrastructure
4f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant//
5f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant// This file is distributed under the University of Illinois Open Source
6f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant// License. See LICENSE.TXT for details.
7f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant//
8f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant//===----------------------------------------------------------------------===//
9f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant
10f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant// <random>
11f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant
12f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant// template<class RealType = double>
13f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant// class gamma_distribution
14f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant
15f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant// template<class _URNG> result_type operator()(_URNG& g);
16f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant
17f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant#include <random>
18f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant#include <cassert>
19f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant#include <vector>
20f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant#include <numeric>
21f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant
22f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnanttemplate <class T>
23f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnantinline
24f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward HinnantT
25f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnantsqr(T x)
26f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant{
27f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    return x * x;
28f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant}
29f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant
30f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnantint main()
31f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant{
32f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    {
33f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef std::gamma_distribution<> D;
34f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef D::param_type P;
35f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef std::minstd_rand G;
36f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        G g;
37f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D d(0.5, 2);
38f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        const int N = 100000;
39f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        std::vector<D::result_type> u;
40f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        for (int i = 0; i < N; ++i)
41f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant            u.push_back(d(g));
42f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type mean = std::accumulate(u.begin(), u.end(),
43f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant                                              D::result_type(0)) / u.size();
44f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type var = 0;
45f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        for (int i = 0; i < u.size(); ++i)
46f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant            var += sqr(u[i] - mean);
47f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        var /= u.size();
48f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type x_mean = d.alpha() * d.beta();
49f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type x_var = d.alpha() * sqr(d.beta());
50f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        assert(std::abs(mean - x_mean) / x_mean < 0.02);
51f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        assert(std::abs(var - x_var) / x_var < 0.02);
52f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    }
53f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    {
54f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef std::gamma_distribution<> D;
55f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef D::param_type P;
56f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef std::minstd_rand G;
57f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        G g;
58f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D d(1, .5);
59f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        const int N = 100000;
60f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        std::vector<D::result_type> u;
61f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        for (int i = 0; i < N; ++i)
62f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant            u.push_back(d(g));
63f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type mean = std::accumulate(u.begin(), u.end(),
64f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant                                              D::result_type(0)) / u.size();
65f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type var = 0;
66f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        for (int i = 0; i < u.size(); ++i)
67f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant            var += sqr(u[i] - mean);
68f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        var /= u.size();
69f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type x_mean = d.alpha() * d.beta();
70f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type x_var = d.alpha() * sqr(d.beta());
71f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        assert(std::abs(mean - x_mean) / x_mean < 0.02);
72f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        assert(std::abs(var - x_var) / x_var < 0.02);
73f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    }
74f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    {
75f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef std::gamma_distribution<> D;
76f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef D::param_type P;
77f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        typedef std::minstd_rand G;
78f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        G g;
79f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D d(2, 3);
80f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        const int N = 100000;
81f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        std::vector<D::result_type> u;
82f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        for (int i = 0; i < N; ++i)
83f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant            u.push_back(d(g));
84f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type mean = std::accumulate(u.begin(), u.end(),
85f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant                                              D::result_type(0)) / u.size();
86f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type var = 0;
87f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        for (int i = 0; i < u.size(); ++i)
88f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant            var += sqr(u[i] - mean);
89f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        var /= u.size();
90f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type x_mean = d.alpha() * d.beta();
91f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        D::result_type x_var = d.alpha() * sqr(d.beta());
92f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        assert(std::abs(mean - x_mean) / x_mean < 0.02);
93f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant        assert(std::abs(var - x_var) / x_var < 0.02);
94f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant    }
95f417abe6837f1b3a0aaaf9a0e0f4e9dde414829dHoward Hinnant}
96