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