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//===----------------------------------------------------------------------===// 9d9144e8d1783617b279146f397a6ab3defefefc4Jonathan Roelofs// 10d9144e8d1783617b279146f397a6ab3defefefc4Jonathan Roelofs// REQUIRES: long_tests 11c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant 12c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant// <random> 13c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant 14c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant// template<class RealType = double> 15c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant// class extreme_value_distribution 16c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant 17c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant// template<class _URNG> result_type operator()(_URNG& g); 18c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant 19c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant#include <random> 20c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant#include <cassert> 21c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant#include <vector> 22c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant#include <numeric> 23c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant 24c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnanttemplate <class T> 25c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnantinline 26c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard HinnantT 27c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnantsqr(T x) 28c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant{ 29c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant return x * x; 30c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant} 31c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant 3214fe08bcb729f076d889de4e38955051bc041923Eric Fiseliervoid 3314fe08bcb729f076d889de4e38955051bc041923Eric Fiseliertest1() 3414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier{ 3514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::extreme_value_distribution<> D; 3614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::mt19937 G; 3714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier G g; 3814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D d(0.5, 2); 3914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier const int N = 1000000; 4014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier std::vector<D::result_type> u; 4114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier for (int i = 0; i < N; ++i) 4214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier { 4314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D::result_type v = d(g); 4414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier u.push_back(v); 4514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier } 4614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size(); 4714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double var = 0; 4814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double skew = 0; 4914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double kurtosis = 0; 50a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier for (unsigned i = 0; i < u.size(); ++i) 5114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier { 5214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dbl = (u[i] - mean); 5314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double d2 = sqr(dbl); 5414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var += d2; 5514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew += dbl * d2; 5614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis += d2 * d2; 5714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier } 5814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var /= u.size(); 5914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dev = std::sqrt(var); 6014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew /= u.size() * dev * var; 6114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis /= u.size() * var * var; 6214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis -= 3; 6314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_mean = d.a() + d.b() * 0.577215665; 6414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_var = sqr(d.b()) * 1.644934067; 6514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_skew = 1.139547; 6614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_kurtosis = 12./5; 6714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((mean - x_mean) / x_mean) < 0.01); 6814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((var - x_var) / x_var) < 0.01); 6914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((skew - x_skew) / x_skew) < 0.01); 7014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01); 7114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier} 7214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier 7314fe08bcb729f076d889de4e38955051bc041923Eric Fiseliervoid 7414fe08bcb729f076d889de4e38955051bc041923Eric Fiseliertest2() 7514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier{ 7614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::extreme_value_distribution<> D; 7714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::mt19937 G; 7814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier G g; 7914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D d(1, 2); 8014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier const int N = 1000000; 8114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier std::vector<D::result_type> u; 8214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier for (int i = 0; i < N; ++i) 8314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier { 8414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D::result_type v = d(g); 8514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier u.push_back(v); 8614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier } 8714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size(); 8814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double var = 0; 8914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double skew = 0; 9014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double kurtosis = 0; 91a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier for (unsigned i = 0; i < u.size(); ++i) 9214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier { 9314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dbl = (u[i] - mean); 9414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double d2 = sqr(dbl); 9514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var += d2; 9614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew += dbl * d2; 9714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis += d2 * d2; 9814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier } 9914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var /= u.size(); 10014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dev = std::sqrt(var); 10114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew /= u.size() * dev * var; 10214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis /= u.size() * var * var; 10314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis -= 3; 10414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_mean = d.a() + d.b() * 0.577215665; 10514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_var = sqr(d.b()) * 1.644934067; 10614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_skew = 1.139547; 10714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_kurtosis = 12./5; 10814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((mean - x_mean) / x_mean) < 0.01); 10914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((var - x_var) / x_var) < 0.01); 11014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((skew - x_skew) / x_skew) < 0.01); 11114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01); 11214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier} 11314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier 11414fe08bcb729f076d889de4e38955051bc041923Eric Fiseliervoid 11514fe08bcb729f076d889de4e38955051bc041923Eric Fiseliertest3() 116c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant{ 11714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::extreme_value_distribution<> D; 11814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::mt19937 G; 11914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier G g; 12014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D d(1.5, 3); 12114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier const int N = 1000000; 12214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier std::vector<D::result_type> u; 12314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier for (int i = 0; i < N; ++i) 124c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant { 12514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D::result_type v = d(g); 12614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier u.push_back(v); 127c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant } 12814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size(); 12914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double var = 0; 13014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double skew = 0; 13114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double kurtosis = 0; 132a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier for (unsigned i = 0; i < u.size(); ++i) 133c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant { 13414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dbl = (u[i] - mean); 13514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double d2 = sqr(dbl); 13614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var += d2; 13714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew += dbl * d2; 13814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis += d2 * d2; 139c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant } 14014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var /= u.size(); 14114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dev = std::sqrt(var); 14214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew /= u.size() * dev * var; 14314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis /= u.size() * var * var; 14414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis -= 3; 14514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_mean = d.a() + d.b() * 0.577215665; 14614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_var = sqr(d.b()) * 1.644934067; 14714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_skew = 1.139547; 14814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_kurtosis = 12./5; 14914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((mean - x_mean) / x_mean) < 0.01); 15014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((var - x_var) / x_var) < 0.01); 15114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((skew - x_skew) / x_skew) < 0.01); 15214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01); 15314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier} 15414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier 15514fe08bcb729f076d889de4e38955051bc041923Eric Fiseliervoid 15614fe08bcb729f076d889de4e38955051bc041923Eric Fiseliertest4() 15714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier{ 15814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::extreme_value_distribution<> D; 15914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier typedef std::mt19937 G; 16014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier G g; 16114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D d(3, 4); 16214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier const int N = 1000000; 16314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier std::vector<D::result_type> u; 16414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier for (int i = 0; i < N; ++i) 165c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant { 16614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier D::result_type v = d(g); 16714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier u.push_back(v); 168c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant } 16914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size(); 17014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double var = 0; 17114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double skew = 0; 17214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double kurtosis = 0; 173a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier for (unsigned i = 0; i < u.size(); ++i) 174c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant { 17514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dbl = (u[i] - mean); 17614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double d2 = sqr(dbl); 17714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var += d2; 17814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew += dbl * d2; 17914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis += d2 * d2; 180c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant } 18114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier var /= u.size(); 18214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double dev = std::sqrt(var); 18314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier skew /= u.size() * dev * var; 18414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis /= u.size() * var * var; 18514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier kurtosis -= 3; 18614fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_mean = d.a() + d.b() * 0.577215665; 18714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_var = sqr(d.b()) * 1.644934067; 18814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_skew = 1.139547; 18914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier double x_kurtosis = 12./5; 19014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((mean - x_mean) / x_mean) < 0.01); 19114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((var - x_var) / x_var) < 0.01); 19214fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((skew - x_skew) / x_skew) < 0.01); 19314fe08bcb729f076d889de4e38955051bc041923Eric Fiselier assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01); 19414fe08bcb729f076d889de4e38955051bc041923Eric Fiselier} 19514fe08bcb729f076d889de4e38955051bc041923Eric Fiselier 19614fe08bcb729f076d889de4e38955051bc041923Eric Fiselierint main() 19714fe08bcb729f076d889de4e38955051bc041923Eric Fiselier{ 19814fe08bcb729f076d889de4e38955051bc041923Eric Fiselier test1(); 19914fe08bcb729f076d889de4e38955051bc041923Eric Fiselier test2(); 20014fe08bcb729f076d889de4e38955051bc041923Eric Fiselier test3(); 20114fe08bcb729f076d889de4e38955051bc041923Eric Fiselier test4(); 202c2b0dc7e336a8d1282a0f1c7a83576af71a18373Howard Hinnant} 203