935 lines
35 KiB
C++
935 lines
35 KiB
C++
|
|
// Copyright John Maddock 2007.
|
||
|
|
// Use, modification and distribution are subject to the
|
||
|
|
// Boost Software License, Version 1.0. (See accompanying file
|
||
|
|
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
|
|
||
|
|
#include "required_defines.hpp"
|
||
|
|
|
||
|
|
#include "performance_measure.hpp"
|
||
|
|
|
||
|
|
#include <boost/math/distributions.hpp>
|
||
|
|
|
||
|
|
double probabilities[] = {
|
||
|
|
1e-5,
|
||
|
|
1e-4,
|
||
|
|
1e-3,
|
||
|
|
1e-2,
|
||
|
|
0.05,
|
||
|
|
0.1,
|
||
|
|
0.2,
|
||
|
|
0.3,
|
||
|
|
0.4,
|
||
|
|
0.5,
|
||
|
|
0.6,
|
||
|
|
0.7,
|
||
|
|
0.8,
|
||
|
|
0.9,
|
||
|
|
0.95,
|
||
|
|
1-1e-5,
|
||
|
|
1-1e-4,
|
||
|
|
1-1e-3,
|
||
|
|
1-1e-2
|
||
|
|
};
|
||
|
|
|
||
|
|
int int_values[] = {
|
||
|
|
1,
|
||
|
|
2,
|
||
|
|
3,
|
||
|
|
5,
|
||
|
|
10,
|
||
|
|
20,
|
||
|
|
50,
|
||
|
|
100,
|
||
|
|
1000,
|
||
|
|
10000,
|
||
|
|
100000
|
||
|
|
};
|
||
|
|
|
||
|
|
int small_int_values[] = {
|
||
|
|
1,
|
||
|
|
2,
|
||
|
|
3,
|
||
|
|
5,
|
||
|
|
10,
|
||
|
|
15,
|
||
|
|
20,
|
||
|
|
30,
|
||
|
|
50,
|
||
|
|
100,
|
||
|
|
150
|
||
|
|
};
|
||
|
|
|
||
|
|
double real_values[] = {
|
||
|
|
1e-5,
|
||
|
|
1e-4,
|
||
|
|
1e-2,
|
||
|
|
1e-1,
|
||
|
|
1,
|
||
|
|
10,
|
||
|
|
100,
|
||
|
|
1000,
|
||
|
|
10000,
|
||
|
|
100000
|
||
|
|
};
|
||
|
|
|
||
|
|
#define BOOST_MATH_DISTRIBUTION3_TEST(name, param1_table, param2_table, param3_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" BOOST_STRINGIZE(name) "-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
result += cdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j], param3_table[k]), random_variable_table[l]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_pdf_, name), "dist-" BOOST_STRINGIZE(name) "-pdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
result += pdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j], param3_table[k]), random_variable_table[l]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" BOOST_STRINGIZE(name) "-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
result += quantile(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j], param3_table[k]), probability_table[l]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_DISTRIBUTION2_TEST(name, param1_table, param2_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" BOOST_STRINGIZE(name) "-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += cdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j]), random_variable_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_pdf_, name), "dist-" BOOST_STRINGIZE(name) "-pdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += pdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j]), random_variable_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" BOOST_STRINGIZE(name) "-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += quantile(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j]), probability_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_DISTRIBUTION1_TEST(name, param1_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" BOOST_STRINGIZE(name) "-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += cdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i]), random_variable_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_pdf_, name), "dist-" BOOST_STRINGIZE(name) "-pdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += pdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i]), random_variable_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" BOOST_STRINGIZE(name) "-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += quantile(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i]), probability_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(beta, probabilities, probabilities, probabilities, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(binomial, int_values, probabilities, int_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(cauchy, int_values, real_values, int_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION1_TEST(chi_squared, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION1_TEST(exponential, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(fisher_f, int_values, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(gamma, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION3_TEST(hypergeometric, small_int_values, small_int_values, small_int_values, small_int_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(logistic, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(lognormal, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(negative_binomial, int_values, probabilities, int_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(normal, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION1_TEST(poisson, real_values, int_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION1_TEST(students_t, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(weibull, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(non_central_chi_squared, int_values, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION3_TEST(non_central_beta, int_values, int_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION3_TEST(non_central_f, int_values, int_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_DISTRIBUTION2_TEST(non_central_t, int_values, small_int_values, real_values, probabilities)
|
||
|
|
|
||
|
|
#ifdef TEST_R
|
||
|
|
|
||
|
|
#define MATHLIB_STANDALONE 1
|
||
|
|
|
||
|
|
extern "C" {
|
||
|
|
#include "Rmath.h"
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_R_DISTRIBUTION3_TEST(name, param1_table, param2_table, param3_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" #name "-R-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
result += p##name (random_variable_table[l], param1_table[i], param2_table[j], param3_table[k], 1, 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_pdf_, name), "dist-" #name "-R-pdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
result += d##name (random_variable_table[l], param1_table[i], param2_table[j], param3_table[k], 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" #name "-R-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
result += q##name (probability_table[l], param1_table[i], param2_table[j], param3_table[k], 1, 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_R_DISTRIBUTION2_TEST(name, param1_table, param2_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" #name "-R-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += p##name (random_variable_table[k], param1_table[i], param2_table[j], 1, 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_pdf_, name), "dist-" #name "-R-pdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += d##name (random_variable_table[k], param1_table[i], param2_table[j], 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" #name "-R-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += q##name (probability_table[k], param1_table[i], param2_table[j], 1, 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_R_DISTRIBUTION1_TEST(name, param1_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" #name "-R-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += p##name (random_variable_table[k], param1_table[i], 1, 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_pdf_, name), "dist-" #name "-R-pdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += d##name (random_variable_table[k], param1_table[i], 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" #name "-R-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += q##name (probability_table[k], param1_table[i], 1, 0);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
double qhypergeo(double r, double n, double N, double p, int i, int j)
|
||
|
|
{
|
||
|
|
if(r > N)
|
||
|
|
return std::numeric_limits<double>::quiet_NaN();
|
||
|
|
double nr = r;
|
||
|
|
double nb = N - r;
|
||
|
|
return qhyper(nr, nb, n, p, i, j);
|
||
|
|
}
|
||
|
|
|
||
|
|
double phypergeo(double r, double n, double N, double k, int i, int j)
|
||
|
|
{
|
||
|
|
if((r > N) || (k > n) || (k > r))
|
||
|
|
return std::numeric_limits<double>::quiet_NaN();
|
||
|
|
double nr = r;
|
||
|
|
double nb = N - r;
|
||
|
|
return phyper(nr, nb, n, k, i, j);
|
||
|
|
}
|
||
|
|
|
||
|
|
double dhypergeo(double r, double n, double N, double k, int i)
|
||
|
|
{
|
||
|
|
if((r > N) || (k > n) || (k > r))
|
||
|
|
return std::numeric_limits<double>::quiet_NaN();
|
||
|
|
double nr = r;
|
||
|
|
double nb = N - r;
|
||
|
|
return dhyper(nr, nb, n, k, i);
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(beta, probabilities, probabilities, probabilities, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(binom, int_values, probabilities, int_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(cauchy, int_values, real_values, int_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION1_TEST(chisq, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION1_TEST(exp, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(f, int_values, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(gamma, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION3_TEST(hypergeo, small_int_values, small_int_values, small_int_values, small_int_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(logis, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(lnorm, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(nbinom, int_values, probabilities, int_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(norm, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION1_TEST(pois, real_values, int_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION1_TEST(t, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(weibull, real_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(nchisq, int_values, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION3_TEST(nf, int_values, int_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION3_TEST(nbeta, int_values, int_values, real_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_R_DISTRIBUTION2_TEST(nt, int_values, small_int_values, real_values, probabilities)
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef TEST_CEPHES
|
||
|
|
|
||
|
|
extern "C"{
|
||
|
|
|
||
|
|
double bdtr(int k, int n, double p);
|
||
|
|
double bdtri(int k, int n, double p);
|
||
|
|
|
||
|
|
double chdtr(double df, double x);
|
||
|
|
double chdtri(double df, double p);
|
||
|
|
|
||
|
|
double fdtr(int k, int n, double p);
|
||
|
|
double fdtri(int k, int n, double p);
|
||
|
|
|
||
|
|
double nbdtr(int k, int n, double p);
|
||
|
|
double nbdtri(int k, int n, double p);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_CEPHES_DISTRIBUTION2_TEST(name, param1_table, param2_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" #name "-cephes-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += name##dtr (param1_table[i], param2_table[j], random_variable_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" #name "-cephes-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += name##dtri (param1_table[i], param2_table[j], probability_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_CEPHES_DISTRIBUTION1_TEST(name, param1_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist, name), "dist-" #name "-cephes-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += name##dtr (param1_table[i], random_variable_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dist_quant, name), "dist-" #name "-cephes-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
result += name##dtri (param1_table[i], probability_table[k]);\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}
|
||
|
|
// Cephes inverse doesn't actually calculate the quantile!!!
|
||
|
|
// BOOST_MATH_CEPHES_DISTRIBUTION2_TEST(b, int_values, int_values, probabilities, probabilities)
|
||
|
|
BOOST_MATH_CEPHES_DISTRIBUTION1_TEST(ch, int_values, real_values, probabilities)
|
||
|
|
BOOST_MATH_CEPHES_DISTRIBUTION2_TEST(f, int_values, int_values, real_values, probabilities)
|
||
|
|
// Cephes inverse doesn't calculate the quantile!!!
|
||
|
|
// BOOST_MATH_CEPHES_DISTRIBUTION2_TEST(nb, int_values, int_values, probabilities, probabilities)
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef TEST_DCDFLIB
|
||
|
|
#include <dcdflib.h>
|
||
|
|
|
||
|
|
void cdfbeta( int *which, double *p, double *q, double *x, double *a, double *b, int *status, double *bound)
|
||
|
|
{
|
||
|
|
double y = 1 - *x;
|
||
|
|
cdfbet(which, p, q, x, &y, a, b, status, bound);
|
||
|
|
}
|
||
|
|
|
||
|
|
void cdfbinomial( int *which, double *p, double *q, double *x, double *a, double *b, int *status, double *bound)
|
||
|
|
{
|
||
|
|
double y = 1 - *x;
|
||
|
|
double cb = 1 - *b;
|
||
|
|
cdfbet(which, p, q, x, a, b, &cb, status, bound);
|
||
|
|
}
|
||
|
|
|
||
|
|
void cdfnegative_binomial( int *which, double *p, double *q, double *x, double *a, double *b, int *status, double *bound)
|
||
|
|
{
|
||
|
|
double y = 1 - *x;
|
||
|
|
double cb = 1 - *b;
|
||
|
|
cdfnbn(which, p, q, x, a, b, &cb, status, bound);
|
||
|
|
}
|
||
|
|
|
||
|
|
void cdfchi_squared( int *which, double *p, double *q, double *x, double *a, int *status, double *bound)
|
||
|
|
{
|
||
|
|
cdfchi(which, p, q, x, a, status, bound);
|
||
|
|
}
|
||
|
|
|
||
|
|
void cdfnon_central_chi_squared( int *which, double *p, double *q, double *x, double *a, double *b, int *status, double *bound)
|
||
|
|
{
|
||
|
|
cdfchn(which, p, q, x, a, b, status, bound);
|
||
|
|
}
|
||
|
|
|
||
|
|
namespace boost{ namespace math{
|
||
|
|
|
||
|
|
template <class T = double> struct f_distribution : public fisher_f_distribution<T>
|
||
|
|
{ f_distribution(T a, T b) : fisher_f_distribution<T>(a, b) {} };
|
||
|
|
template <class T = double>
|
||
|
|
struct fnc_distribution : public non_central_f_distribution<T>
|
||
|
|
{ fnc_distribution(T a, T b, T c) : non_central_f_distribution<T>(a, b, c) {} };
|
||
|
|
template <class T = double> struct gam_distribution : public gamma_distribution<T>
|
||
|
|
{ gam_distribution(T a, T b) : gamma_distribution<T>(a, b) {} };
|
||
|
|
template <class T = double> struct nor_distribution : public normal_distribution<T>
|
||
|
|
{ nor_distribution(T a, T b) : normal_distribution<T>(a, b) {} };
|
||
|
|
template <class T = double> struct poi_distribution : public poisson_distribution<T>
|
||
|
|
{ poi_distribution(T a) : poisson_distribution<T>(a) {} };
|
||
|
|
template <class T = double> struct t_distribution : public students_t_distribution<T>
|
||
|
|
{ t_distribution(T a) : students_t_distribution<T>(a) {} };
|
||
|
|
|
||
|
|
template <class T>
|
||
|
|
T cdf(const f_distribution<T>& d, const T& r){ return cdf(static_cast<fisher_f_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T quantile(const f_distribution<T>& d, const T& r){ return quantile(static_cast<fisher_f_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T cdf(const fnc_distribution<T>& d, const T& r){ return cdf(static_cast<non_central_f_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T quantile(const fnc_distribution<T>& d, const T& r){ return quantile(static_cast<non_central_f_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T cdf(const gam_distribution<T>& d, const T& r){ return cdf(static_cast<gamma_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T quantile(const gam_distribution<T>& d, const T& r){ return quantile(static_cast<gamma_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T cdf(const nor_distribution<T>& d, const T& r){ return cdf(static_cast<normal_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T quantile(const nor_distribution<T>& d, const T& r){ return quantile(static_cast<normal_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T cdf(const poi_distribution<T>& d, const T& r){ return cdf(static_cast<poisson_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T quantile(const poi_distribution<T>& d, const T& r){ return quantile(static_cast<poisson_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T cdf(const t_distribution<T>& d, const T& r){ return cdf(static_cast<students_t_distribution<T> >(d), r); }
|
||
|
|
template <class T>
|
||
|
|
T quantile(const t_distribution<T>& d, const T& r){ return quantile(static_cast<students_t_distribution<T> >(d), r); }
|
||
|
|
|
||
|
|
}}
|
||
|
|
|
||
|
|
bool check_near(double a, double b)
|
||
|
|
{
|
||
|
|
bool r = ((fabs(a) <= 1e-7) || (fabs(b) <= 1e-7)) ? (fabs(a-b) < 1e-7) : fabs((a - b) / a) < 1e-5;
|
||
|
|
return r;
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_DCD_DISTRIBUTION3_TEST(name, param1_table, param2_table, param3_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dcd_dist, name), "dist-" BOOST_STRINGIZE(name) "-dcd-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
int which = 1;\
|
||
|
|
double p; double q; \
|
||
|
|
double rv = random_variable_table[l];\
|
||
|
|
double a = param1_table[i];\
|
||
|
|
double b = param2_table[j];\
|
||
|
|
double c = param3_table[k];\
|
||
|
|
int status = 0;\
|
||
|
|
double bound = 0;\
|
||
|
|
BOOST_JOIN(cdf, name)(&which, &p, &q, &rv, &a, &b, &c, &status, &bound);\
|
||
|
|
result += p;\
|
||
|
|
BOOST_ASSERT(\
|
||
|
|
(status != 0) || check_near(p, \
|
||
|
|
cdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j], param3_table[k]), random_variable_table[l])\
|
||
|
|
));\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dcd_dist_quant, name), "dist-" BOOST_STRINGIZE(name) "-dcd-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(param3_table)/sizeof(param3_table[0]);\
|
||
|
|
unsigned d_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
for(unsigned l = 0; l < d_size; ++l)\
|
||
|
|
{\
|
||
|
|
int which = 2;\
|
||
|
|
double p = probability_table[l];\
|
||
|
|
double q = 1 - p; \
|
||
|
|
double rv;\
|
||
|
|
double a = param1_table[i];\
|
||
|
|
double b = param2_table[j];\
|
||
|
|
double c = param3_table[k];\
|
||
|
|
int status = 0;\
|
||
|
|
double bound = 0;\
|
||
|
|
BOOST_JOIN(cdf, name)(&which, &p, &q, &rv, &a, &b, &c, &status, &bound);\
|
||
|
|
result += rv;\
|
||
|
|
BOOST_ASSERT((status != 0) || (p > 0.99) || check_near(rv, quantile(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j], param3_table[k]), probability_table[l])));\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size * d_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_DCD_DISTRIBUTION2_TEST(name, param1_table, param2_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dcd_dist, name), "dist-" BOOST_STRINGIZE(name) "-dcd-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
int which = 1;\
|
||
|
|
double p; double q; \
|
||
|
|
double rv = random_variable_table[k];\
|
||
|
|
double a = param1_table[i];\
|
||
|
|
double b = param2_table[j];\
|
||
|
|
int status = 0;\
|
||
|
|
double bound = 0;\
|
||
|
|
BOOST_JOIN(cdf, name)(&which, &p, &q, &rv, &a, &b, &status, &bound);\
|
||
|
|
result += p;\
|
||
|
|
BOOST_ASSERT((status != 0) || check_near(p, cdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j]), random_variable_table[k])));\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dcd_dist_quant, name), "dist-" BOOST_STRINGIZE(name) "-dcd-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned b_size = sizeof(param2_table)/sizeof(param2_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned j = 0; j < b_size; ++j)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
int which = 2;\
|
||
|
|
double p = probability_table[k];\
|
||
|
|
double q = 1 - p; \
|
||
|
|
double rv;\
|
||
|
|
double a = param1_table[i];\
|
||
|
|
double b = param2_table[j];\
|
||
|
|
int status = 0;\
|
||
|
|
double bound = 0;\
|
||
|
|
BOOST_JOIN(cdf, name)(&which, &p, &q, &rv, &a, &b, &status, &bound);\
|
||
|
|
result += rv;\
|
||
|
|
BOOST_ASSERT((status != 0) || (p > 0.99) || check_near(rv, quantile(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i], param2_table[j]), probability_table[k])));\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * b_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
#define BOOST_MATH_DCD_DISTRIBUTION1_TEST(name, param1_table, random_variable_table, probability_table) \
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dcd_dist, name), "dist-" BOOST_STRINGIZE(name) "-dcd-cdf")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(random_variable_table)/sizeof(random_variable_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
int which = 1;\
|
||
|
|
double p; double q; \
|
||
|
|
double rv = random_variable_table[k];\
|
||
|
|
double a = param1_table[i];\
|
||
|
|
int status = 0;\
|
||
|
|
double bound = 0;\
|
||
|
|
BOOST_JOIN(cdf, name)(&which, &p, &q, &rv, &a, &status, &bound);\
|
||
|
|
result += p;\
|
||
|
|
BOOST_ASSERT((status != 0) || check_near(p, cdf(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i]), random_variable_table[k])));\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}\
|
||
|
|
BOOST_MATH_PERFORMANCE_TEST(BOOST_JOIN(dcd_dist_quant, name), "dist-" BOOST_STRINGIZE(name) "-dcd-quantile")\
|
||
|
|
{\
|
||
|
|
double result = 0;\
|
||
|
|
unsigned a_size = sizeof(param1_table)/sizeof(param1_table[0]);\
|
||
|
|
unsigned c_size = sizeof(probability_table)/sizeof(probability_table[0]);\
|
||
|
|
\
|
||
|
|
for(unsigned i = 0; i < a_size; ++i)\
|
||
|
|
{\
|
||
|
|
for(unsigned k = 0; k < c_size; ++k)\
|
||
|
|
{\
|
||
|
|
int which = 2;\
|
||
|
|
double p = probability_table[k];\
|
||
|
|
double q = 1 - p; \
|
||
|
|
double rv;\
|
||
|
|
double a = param1_table[i];\
|
||
|
|
int status = 0;\
|
||
|
|
double bound = 0;\
|
||
|
|
BOOST_JOIN(cdf, name)(&which, &p, &q, &rv, &a, &status, &bound);\
|
||
|
|
result += rv;\
|
||
|
|
BOOST_ASSERT((status != 0) || (p > 0.99) || check_near(rv, quantile(boost::math:: BOOST_JOIN(name, _distribution) <>(param1_table[i]), probability_table[k])));\
|
||
|
|
}\
|
||
|
|
}\
|
||
|
|
\
|
||
|
|
consume_result(result);\
|
||
|
|
set_call_count(a_size * c_size);\
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(beta, probabilities, probabilities, probabilities, probabilities) // ??
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(binomial, int_values, probabilities, int_values, probabilities) // OK ish
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION1_TEST(chi_squared, int_values, real_values, probabilities) // OK
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(non_central_chi_squared, int_values, int_values, real_values, probabilities) // Error rates quite high for DCD version?
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(f, int_values, int_values, real_values, probabilities) // OK
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION3_TEST(fnc, int_values, int_values, real_values, real_values, probabilities) // Error rates quite high for DCD version?
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(gam, real_values, real_values, real_values, probabilities) // ??
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(negative_binomial, int_values, probabilities, int_values, probabilities) // OK
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION2_TEST(nor, real_values, real_values, real_values, probabilities) // OK
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION1_TEST(poi, real_values, int_values, probabilities) // OK
|
||
|
|
BOOST_MATH_DCD_DISTRIBUTION1_TEST(t, int_values, real_values, probabilities) // OK
|
||
|
|
|
||
|
|
#endif
|