// test_nc_t.cpp // Copyright John Maddock 2008, 2012. // Copyright Paul A. Bristow 2012. // 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 // Need to include lib/math/test in path. #ifdef _MSC_VER #pragma warning (disable:4127 4512) #endif #if !defined(TEST_FLOAT) && !defined(TEST_DOUBLE) && !defined(TEST_LDOUBLE) && !defined(TEST_REAL_CONCEPT) # define TEST_FLOAT # define TEST_DOUBLE # define TEST_LDOUBLE # define TEST_REAL_CONCEPT #endif #include #include // for real_concept #include // for chi_squared_distribution. #include // for normal distribution (for comparison). #define BOOST_TEST_MAIN #include // for test_main #include #include #include // for BOOST_CHECK_CLOSE #include "functor.hpp" #include "handle_test_result.hpp" #include "table_type.hpp" #include "test_nc_t.hpp" #include #include using std::cout; using std::endl; #include using std::numeric_limits; void expected_results() { // // Define the max and mean errors expected for // various compilers and platforms. // const char* largest_type; #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS if(boost::math::policies::digits >() == boost::math::policies::digits >()) { largest_type = "(long\\s+)?double|real_concept"; } else { largest_type = "long double|real_concept"; } #else largest_type = "(long\\s+)?double|real_concept"; #endif // // Catch all cases come last: // if(std::numeric_limits::digits > 54) { add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib "[^|]*", // platform largest_type, // test type(s) "[^|]*large[^|]*", // test data group "[^|]*", 2000000, 200000); // test function add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib "[^|]*", // platform "double", // test type(s) "[^|]*large[^|]*", // test data group "[^|]*", 500, 100); // test function } add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib "[^|]*", // platform "real_concept", // test type(s) "[^|]*", // test data group "[^|]*", 300000, 100000); // test function add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib "[^|]*", // platform largest_type, // test type(s) "[^|]*large[^|]*", // test data group "[^|]*", 1500, 300); // test function add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib "[^|]*", // platform largest_type, // test type(s) "[^|]*small[^|]*", // test data group "[^|]*", 400, 100); // test function add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib ".*Solaris.*", // platform largest_type, // test type(s) "[^|]*", // test data group "[^|]*", 400, 100); // test function add_expected_result( "[^|]*", // compiler "[^|]*", // stdlib "[^|]*", // platform largest_type, // test type(s) "[^|]*", // test data group "[^|]*", 250, 50); // test function // // Finish off by printing out the compiler/stdlib/platform names, // we do this to make it easier to mark up expected error rates. // std::cout << "Tests run with " << BOOST_COMPILER << ", " << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; } BOOST_AUTO_TEST_CASE( test_main ) { BOOST_MATH_CONTROL_FP; // Basic sanity-check spot values. expected_results(); // (Parameter value, arbitrarily zero, only communicates the floating point type). #ifdef TEST_FLOAT test_spots(0.0F); // Test float. #endif #ifdef TEST_DOUBLE test_spots(0.0); // Test double. #endif #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS #ifdef TEST_LDOUBLE test_spots(0.0L); // Test long double. #endif #ifndef BOOST_MATH_NO_REAL_CONCEPT_TESTS #ifdef TEST_REAL_CONCEPT test_spots(boost::math::concepts::real_concept(0.)); // Test real concept. #endif #endif #endif #ifdef TEST_FLOAT test_accuracy(0.0F, "float"); // Test float. test_big_df(0.F); // float #endif #ifdef TEST_DOUBLE test_accuracy(0.0, "double"); // Test double. test_big_df(0.); // double test_ignore_policy(0.0); #endif #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS #ifdef TEST_LDOUBLE test_accuracy(0.0L, "long double"); // Test long double. #endif #ifndef BOOST_MATH_NO_REAL_CONCEPT_TESTS #ifdef TEST_REAL_CONCEPT test_accuracy(boost::math::concepts::real_concept(0.), "real_concept"); // Test real concept. #endif #endif #endif /* */ } // BOOST_AUTO_TEST_CASE( test_main ) /* Output: Description: Autorun "J:\Cpp\MathToolkit\test\Math_test\Debug\test_nc_t.exe" Running 1 test case... Tests run with Microsoft Visual C++ version 10.0, Dinkumware standard library version 520, Win32 Tolerance = 0.000596046%. Tolerance = 5e-010%. Tolerance = 5e-010%. Tolerance = 1e-008%. Testing: Non Central T CDF Max = 0 RMS Mean=0 CCDF Max = 0 RMS Mean=0 Testing: float quantile sanity check, with tests Non Central T Testing: Non Central T (small non-centrality) CDF Max = 0 RMS Mean=0 CCDF Max = 0 RMS Mean=0 Testing: float quantile sanity check, with tests Non Central T (small non-centrality) Testing: Non Central T (large parameters) CDF Max = 0 RMS Mean=0 CCDF Max = 0 RMS Mean=0 Testing: float quantile sanity check, with tests Non Central T (large parameters) Testing: Non Central T CDF Max = 137.7 RMS Mean=31.5 worst case at row: 181 { 188.01481628417969, -282.022216796875, -298.02532958984375, 0.1552789395983287, 0.84472106040167128 } CCDF Max = 150.4 RMS Mean=32.32 worst case at row: 184 { 191.43339538574219, 765.73358154296875, 820.14422607421875, 0.89943076553533785, 0.10056923446466212 } Testing: double quantile sanity check, with tests Non Central T Testing: Non Central T (small non-centrality) CDF Max = 3.605 RMS Mean=1.031 worst case at row: 42 { 7376104448, 7.3761043495323975e-007, -1.3614851236343384, 0.086680099352107118, 0.91331990064789292 } CCDF Max = 5.207 RMS Mean=1.432 worst case at row: 38 { 1524088576, 1.5240885886669275e-007, 1.3784774541854858, 0.91597201432644526, 0.084027985673554725 } Testing: double quantile sanity check, with tests Non Central T (small non-centrality) Testing: Non Central T (large parameters) CDF Max = 286.4 RMS Mean=62.79 worst case at row: 24 { 1.3091821180254421e+019, 1309.18212890625, 1308.01171875, 0.12091797523015677, 0.87908202476984321 } CCDF Max = 226.9 RMS Mean=50.41 worst case at row: 23 { 7.9217674231144776e+018, 792.1767578125, 793.54827880859375, 0.91489369852628, 0.085106301473719961 } Testing: double quantile sanity check, with tests Non Central T (large parameters) Testing: Non Central T CDF Max = 137.7 RMS Mean=31.5 worst case at row: 181 { 188.01481628417969, -282.022216796875, -298.02532958984375, 0.1552789395983287, 0.84472106040167128 } CCDF Max = 150.4 RMS Mean=32.32 worst case at row: 184 { 191.43339538574219, 765.73358154296875, 820.14422607421875, 0.89943076553533785, 0.10056923446466212 } Testing: long double quantile sanity check, with tests Non Central T Testing: Non Central T (small non-centrality) CDF Max = 3.605 RMS Mean=1.031 worst case at row: 42 { 7376104448, 7.3761043495323975e-007, -1.3614851236343384, 0.086680099352107118, 0.91331990064789292 } CCDF Max = 5.207 RMS Mean=1.432 worst case at row: 38 { 1524088576, 1.5240885886669275e-007, 1.3784774541854858, 0.91597201432644526, 0.084027985673554725 } Testing: long double quantile sanity check, with tests Non Central T (small non-centrality) Testing: Non Central T (large parameters) CDF Max = 286.4 RMS Mean=62.79 worst case at row: 24 { 1.3091821180254421e+019, 1309.18212890625, 1308.01171875, 0.12091797523015677, 0.87908202476984321 } CCDF Max = 226.9 RMS Mean=50.41 worst case at row: 23 { 7.9217674231144776e+018, 792.1767578125, 793.54827880859375, 0.91489369852628, 0.085106301473719961 } Testing: long double quantile sanity check, with tests Non Central T (large parameters) Testing: Non Central T CDF Max = 2.816e+005 RMS Mean=2.029e+004 worst case at row: 185 { 191.50137329101562, -957.5068359375, -1035.4078369140625, 0.072545502958829097, 0.92745449704117089 } CCDF Max = 1.304e+005 RMS Mean=1.529e+004 worst case at row: 184 { 191.43339538574219, 765.73358154296875, 820.14422607421875, 0.89943076553533785, 0.10056923446466212 } cdf(n10, 11) = 0.84134471416473389 0.15865525603294373 cdf(n10, 9) = 0.15865525603294373 0.84134471416473389 cdf(maxdf10, 11) = 0.84134477376937866 0.15865525603294373 cdf(infdf10, 11) = 0.84134477376937866 0.15865525603294373 cdf(n10, 11) = 0.84134474606854293 0.15865525393145707 cdf(n10, 9) = 0.15865525393145707 0.84134474606854293 cdf(maxdf10, 11) = 0.84134474606854293 0.15865525393145707 cdf(infdf10, 11) = 0.84134474606854293 0.15865525393145707 *** No errors detected Description: Autorun "J:\Cpp\MathToolkit\test\Math_test\Debug\test_nc_t.exe" Running 1 test case... Tests run with Microsoft Visual C++ version 10.0, Dinkumware standard library version 520, Win32 Tolerance = 0.000596046%. Tolerance = 5e-010%. Tolerance = 5e-010%. Tolerance = 1e-008%. Testing: Non Central T CDF Max = 0 RMS Mean=0 CCDF Max = 0 RMS Mean=0 Testing: float quantile sanity check, with tests Non Central T Testing: Non Central T (small non-centrality) CDF Max = 0 RMS Mean=0 CCDF Max = 0 RMS Mean=0 Testing: float quantile sanity check, with tests Non Central T (small non-centrality) Testing: Non Central T (large parameters) CDF Max = 0 RMS Mean=0 CCDF Max = 0 RMS Mean=0 Testing: float quantile sanity check, with tests Non Central T (large parameters) Testing: Non Central T CDF Max = 137.7 RMS Mean=31.5 worst case at row: 181 { 188.01481628417969, -282.022216796875, -298.02532958984375, 0.1552789395983287, 0.84472106040167128 } CCDF Max = 150.4 RMS Mean=32.32 worst case at row: 184 { 191.43339538574219, 765.73358154296875, 820.14422607421875, 0.89943076553533785, 0.10056923446466212 } Testing: double quantile sanity check, with tests Non Central T Testing: Non Central T (small non-centrality) CDF Max = 3.605 RMS Mean=1.031 worst case at row: 42 { 7376104448, 7.3761043495323975e-007, -1.3614851236343384, 0.086680099352107118, 0.91331990064789292 } CCDF Max = 5.207 RMS Mean=1.432 worst case at row: 38 { 1524088576, 1.5240885886669275e-007, 1.3784774541854858, 0.91597201432644526, 0.084027985673554725 } Testing: double quantile sanity check, with tests Non Central T (small non-centrality) Testing: Non Central T (large parameters) CDF Max = 286.4 RMS Mean=62.79 worst case at row: 24 { 1.3091821180254421e+019, 1309.18212890625, 1308.01171875, 0.12091797523015677, 0.87908202476984321 } CCDF Max = 226.9 RMS Mean=50.41 worst case at row: 23 { 7.9217674231144776e+018, 792.1767578125, 793.54827880859375, 0.91489369852628, 0.085106301473719961 } Testing: double quantile sanity check, with tests Non Central T (large parameters) Testing: Non Central T CDF Max = 137.7 RMS Mean=31.5 worst case at row: 181 { 188.01481628417969, -282.022216796875, -298.02532958984375, 0.1552789395983287, 0.84472106040167128 } CCDF Max = 150.4 RMS Mean=32.32 worst case at row: 184 { 191.43339538574219, 765.73358154296875, 820.14422607421875, 0.89943076553533785, 0.10056923446466212 } Testing: long double quantile sanity check, with tests Non Central T Testing: Non Central T (small non-centrality) CDF Max = 3.605 RMS Mean=1.031 worst case at row: 42 { 7376104448, 7.3761043495323975e-007, -1.3614851236343384, 0.086680099352107118, 0.91331990064789292 } CCDF Max = 5.207 RMS Mean=1.432 worst case at row: 38 { 1524088576, 1.5240885886669275e-007, 1.3784774541854858, 0.91597201432644526, 0.084027985673554725 } Testing: long double quantile sanity check, with tests Non Central T (small non-centrality) Testing: Non Central T (large parameters) CDF Max = 286.4 RMS Mean=62.79 worst case at row: 24 { 1.3091821180254421e+019, 1309.18212890625, 1308.01171875, 0.12091797523015677, 0.87908202476984321 } CCDF Max = 226.9 RMS Mean=50.41 worst case at row: 23 { 7.9217674231144776e+018, 792.1767578125, 793.54827880859375, 0.91489369852628, 0.085106301473719961 } Testing: long double quantile sanity check, with tests Non Central T (large parameters) Testing: Non Central T CDF Max = 2.816e+005 RMS Mean=2.029e+004 worst case at row: 185 { 191.50137329101562, -957.5068359375, -1035.4078369140625, 0.072545502958829097, 0.92745449704117089 } CCDF Max = 1.304e+005 RMS Mean=1.529e+004 worst case at row: 184 { 191.43339538574219, 765.73358154296875, 820.14422607421875, 0.89943076553533785, 0.10056923446466212 } *** No errors detected */ /* Temporary stuff from student's t version. // Calculate 1 / eps, the point where student's t should change to normal distribution. RealType limit = 1 / boost::math::tools::epsilon(); using namespace boost::math::policies; typedef policy > accurate_policy; // 17 = max_digits10 where available. limit = 1 / policies::get_epsilon(); BOOST_CHECK_CLOSE_FRACTION(limit, static_cast(1) / std::numeric_limits::epsilon(), tolerance); // Default policy to get full accuracy. // std::cout << "Switch over to normal if df > " << limit << std::endl; // float Switch over to normal if df > 8.38861e+006 // double Switch over to normal if df > 4.5036e+015 // Can't test real_concept - doesn't converge. boost::math::normal_distribution n01(0, 1); // boost::math::normal_distribution n10(10, 1); // non_central_t_distribution nct(boost::math::tools::max_value(), 0); // Well over the switchover point, non_central_t_distribution nct2(limit /5, 0); // Just below the switchover point, non_central_t_distribution nct3(limit /100, 0); // Well below the switchover point, non_central_t_distribution nct4(limit, 10); // Well below the switchover point, and 10 non-centrality. // PDF BOOST_CHECK_CLOSE_FRACTION(pdf(nct, 0), pdf(n01, 0.), tolerance); // normal and non-central t should be nearly equal. BOOST_CHECK_CLOSE_FRACTION(pdf(nct2, 0), pdf(n01, 0.), tolerance); // should be very close to normal. BOOST_CHECK_CLOSE_FRACTION(pdf(nct3, 0), pdf(n01, 0.), tolerance * 10); // should be close to normal. // BOOST_CHECK_CLOSE_FRACTION(pdf(nct4, 10), pdf(n10, 0.), tolerance * 100); // should be fairly close to normal tolerance. RealType delta = 10; // non-centrality. RealType nu = static_cast(limit); // df boost::math::normal_distribution nl(delta, 1); // Normal distribution that nct tends to for big df. non_central_t_distribution nct5(nu, delta); // RealType x = delta; // BOOST_CHECK_CLOSE_FRACTION(pdf(nct5, x), pdf(nl, x), tolerance * 10 ); // nu = 1e15 // BOOST_CHECK_CLOSE_FRACTION(pdf(nct5, x), pdf(nl, x), tolerance * 1000 ); // nu = 1e14 // BOOST_CHECK_CLOSE_FRACTION(pdf(nct5, x), pdf(nl, x), tolerance * 10000 ); // nu = 1e13 // BOOST_CHECK_CLOSE_FRACTION(pdf(nct5, x), pdf(nl, x), tolerance * 100000 ); // nu = 1e12 BOOST_CHECK_CLOSE_FRACTION(pdf(nct5, x), pdf(nl, x), tolerance * 5 ); // nu = 1/eps // Increasing the non-centrality delta increases the difference too because increases asymmetry. // For example, with non-centrality = 100, need tolerance * 500 // CDF BOOST_CHECK_CLOSE_FRACTION(cdf(nct, 0), cdf(n01, 0.), tolerance); // should be exactly equal. BOOST_CHECK_CLOSE_FRACTION(cdf(nct2, 0), cdf(n01, 0.), tolerance); // should be very close to normal. BOOST_CHECK_CLOSE_FRACTION(cdf(complement(n10, 11)), 1 - cdf(n10, 11), tolerance); // // cdf(n10, 10) = 0.841345 0.158655 BOOST_CHECK_CLOSE_FRACTION(cdf(complement(n10, 9)), 1 - cdf(n10, 9), tolerance); // std::cout.precision(17); std::cout << "cdf(n10, 11) = " << cdf(n10, 11) << ' ' << cdf(complement(n10, 11)) << endl; std::cout << "cdf(n10, 9) = " << cdf(n10, 9) << ' ' << cdf(complement(n10, 9)) << endl; std::cout << std::numeric_limits::max_digits10 << std::endl; std::cout.precision(17); using boost::math::tools::max_value; double eps = std::numeric_limits::epsilon(); // Use policies so that if policy requests lower precision, // then get the normal distribution approximation earlier. //limit = static_cast(1) / limit; // 1/eps double delta = 1e2; double df = delta / (4 * eps); std::cout << df << std::endl; // df = 1.125899906842624e+018 { boost::math::non_central_t_distribution dist(df, delta); std::cout <<"mean " << mean(dist) << std::endl; // mean 1000 std::cout <<"variance " << variance(dist) << std::endl; // variance 1 std::cout <<"skewness " << skewness(dist) << std::endl; // skewness 8.8817841970012523e-010 std::cout <<"kurtosis_excess " << kurtosis_excess(dist) << std::endl; // kurtosis_excess 3.0001220703125 //1.125899906842624e+017 //mean 100 //variance 1 //skewness 8.8817841970012523e-012 //kurtosis_excess 3 } */