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