📄 test_nc_t.cpp
字号:
// test_nc_t.cpp// Copyright John Maddock 2008.// 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)#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 <boost/math/concepts/real_concept.hpp> // for real_concept#include <boost/math/distributions/non_central_t.hpp> // for chi_squared_distribution#include <boost/test/included/test_exec_monitor.hpp> // for test_main#include <boost/test/floating_point_comparison.hpp> // for BOOST_CHECK_CLOSE#include "functor.hpp"#include "handle_test_result.hpp"#include <iostream>using std::cout;using std::endl;#include <limits>using std::numeric_limits;#define BOOST_CHECK_CLOSE_EX(a, b, prec, i) \ {\ unsigned int failures = boost::unit_test::results_collector.results( boost::unit_test::framework::current_test_case().p_id ).p_assertions_failed;\ BOOST_CHECK_CLOSE(a, b, prec); \ if(failures != boost::unit_test::results_collector.results( boost::unit_test::framework::current_test_case().p_id ).p_assertions_failed)\ {\ std::cerr << "Failure was at row " << i << std::endl;\ std::cerr << std::setprecision(35); \ std::cerr << "{ " << data[i][0] << " , " << data[i][1] << " , " << data[i][2];\ std::cerr << " , " << data[i][3] << " , " << data[i][4] << " } " << std::endl;\ }\ }#define BOOST_CHECK_EX(a, i) \ {\ unsigned int failures = boost::unit_test::results_collector.results( boost::unit_test::framework::current_test_case().p_id ).p_assertions_failed;\ BOOST_CHECK(a); \ if(failures != boost::unit_test::results_collector.results( boost::unit_test::framework::current_test_case().p_id ).p_assertions_failed)\ {\ std::cerr << "Failure was at row " << i << std::endl;\ std::cerr << std::setprecision(35); \ std::cerr << "{ " << data[i][0] << " , " << data[i][1] << " , " << data[i][2];\ std::cerr << " , " << data[i][3] << " , " << data[i][4] << " } " << std::endl;\ }\ }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<double, boost::math::policies::policy<> >() == boost::math::policies::digits<long double, boost::math::policies::policy<> >()) { 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: // 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) "[^|]*", // 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;}template <class RealType>RealType naive_pdf(RealType v, RealType delta, RealType x){}template <class RealType>RealType naive_mean(RealType v, RealType delta){ using boost::math::tgamma; return delta * sqrt(v / 2) * tgamma((v-1)/2) / tgamma(v/2);}float naive_mean(float v, float delta){ return (float)naive_mean((double)v, (double)delta);}template <class RealType>RealType naive_variance(RealType v, RealType delta){ using boost::math::tgamma; RealType r = tgamma((v-1)/2) / tgamma(v/2); r *= r; r *= -delta * delta * v / 2; r += (1 + delta * delta) * v / (v - 2); return r;}float naive_variance(float v, float delta){ return (float)naive_variance((double)v, (double)delta);}template <class RealType>RealType naive_skewness(RealType v, RealType delta){ using boost::math::tgamma; RealType tgr = tgamma((v-1)/2) / tgamma(v / 2); RealType r = delta * sqrt(v) * tgamma((v-1)/2) * (v * (-3 + delta * delta + 2 * v) / ((-3 + v) * (-2 + v)) - 2 * ((1 + delta * delta) * v / (-2 + v) - delta * delta * v * tgr * tgr / 2)); r /= boost::math::constants::root_two<RealType>() * pow(((1+delta*delta) * v / (-2+v) - delta*delta*v*tgr*tgr/2), RealType(1.5f)) * tgamma(v/2); return r;}float naive_skewness(float v, float delta){ return (float)naive_skewness((double)v, (double)delta);}template <class RealType>RealType naive_kurtosis_excess(RealType v, RealType delta){ using boost::math::tgamma; RealType tgr = tgamma((v-1)/2) / tgamma(v / 2); RealType r = -delta * delta * v * tgr * tgr / 2; r *= v * (delta * delta * (1 + v) + 3 * (-5 + 3 * v)) / ((-3 + v)*(-2+v)) - 3 * ((1 + delta * delta) * v / (-2 + v) - delta * delta * v * tgr * tgr / 2); r += (3 + 6 * delta * delta + delta * delta * delta * delta)* v * v / ((-4+v) * (-2+v)); r /= (1+delta*delta)*v / (-2+v) - delta*delta*v *tgr*tgr/2; r /= (1+delta*delta)*v / (-2+v) - delta*delta*v *tgr*tgr/2; return r;}float naive_kurtosis_excess(float v, float delta){ return (float)naive_kurtosis_excess((double)v, (double)delta);}template <class RealType>void test_spot( RealType df, // Degrees of freedom RealType ncp, // non-centrality param RealType t, // T statistic RealType P, // CDF RealType Q, // Complement of CDF RealType tol) // Test tolerance{ boost::math::non_central_t_distribution<RealType> dist(df, ncp); BOOST_CHECK_CLOSE( cdf(dist, t), P, tol); try{ BOOST_CHECK_CLOSE( mean(dist), naive_mean(df, ncp), tol); BOOST_CHECK_CLOSE( variance(dist), naive_variance(df, ncp), tol); BOOST_CHECK_CLOSE( skewness(dist), naive_skewness(df, ncp), tol * 10); BOOST_CHECK_CLOSE( kurtosis_excess(dist), naive_kurtosis_excess(df, ncp), tol * 50); BOOST_CHECK_CLOSE( kurtosis(dist), 3 + naive_kurtosis_excess(df, ncp), tol * 50); } catch(const std::domain_error&) { } /* BOOST_CHECK_CLOSE( pdf(dist, t), naive_pdf(dist.degrees_of_freedom(), ncp, t), tol * 50); */ if((P < 0.99) && (Q < 0.99)) { // // We can only check this if P is not too close to 1, // so that we can guarentee Q is reasonably free of error: // BOOST_CHECK_CLOSE( cdf(complement(dist, t)), Q, tol); BOOST_CHECK_CLOSE( quantile(dist, P), t, tol * 10); BOOST_CHECK_CLOSE( quantile(complement(dist, Q)), t, tol * 10); /* BOOST_CHECK_CLOSE( dist.find_degrees_of_freedom(ncp, t, P), df, tol * 10); BOOST_CHECK_CLOSE( dist.find_degrees_of_freedom(boost::math::complement(ncp, t, Q)), df, tol * 10); BOOST_CHECK_CLOSE( dist.find_non_centrality(df, t, P), ncp, tol * 10); BOOST_CHECK_CLOSE( dist.find_non_centrality(boost::math::complement(df, t, Q)), ncp, tol * 10); */ }}template <class RealType> // Any floating-point type RealType.void test_spots(RealType){ // // Approx limit of test data is 12 digits expressed here as a persentage: // RealType tolerance = (std::max)( boost::math::tools::epsilon<RealType>(), (RealType)5e-12f) * 100; // // At float precision we need to up the tolerance, since // the input values are rounded off to inexact quantities // the results get thrown off by a noticeable amount. // if(boost::math::tools::digits<RealType>() < 50) tolerance *= 50; if(boost::is_floating_point<RealType>::value != 1) tolerance *= 20; // real_concept special functions are less accurate cout << "Tolerance = " << tolerance << "%." << endl; // // Test data is taken from: // // Computing discrete mixtures of continuous // distributions: noncentral chisquare, noncentral t // and the distribution of the square of the sample // multiple correlation coeficient.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -