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