From 64ebbfc41b778714733312ee303b8a0fcfcf406e Mon Sep 17 00:00:00 2001 From: Jacob Hass Date: Fri, 29 May 2026 11:13:11 -0700 Subject: [PATCH 01/30] Initial implementation with arcsine testing --- test/test_arcsine.cpp | 65 +-------------------- test/test_dist_helpers.hpp | 114 +++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 63 deletions(-) create mode 100644 test/test_dist_helpers.hpp diff --git a/test/test_arcsine.cpp b/test/test_arcsine.cpp index dc2fba919e..9fd1a174d9 100644 --- a/test/test_arcsine.cpp +++ b/test/test_arcsine.cpp @@ -38,6 +38,7 @@ using boost::math::constants::one_div_root_two; #include #include "test_out_of_range.hpp" +#include "test_dist_helpers.hpp" #include using std::cout; @@ -65,21 +66,6 @@ void test_ignore_policy(RealType) RealType nan = std::numeric_limits::quiet_NaN(); using boost::math::policies::policy; - // Types of error whose action can be altered by policies:. - //using boost::math::policies::evaluation_error; - //using boost::math::policies::domain_error; - //using boost::math::policies::overflow_error; - //using boost::math::policies::underflow_error; - //using boost::math::policies::domain_error; - //using boost::math::policies::pole_error; - - //// Actions on error (in enum error_policy_type): - //using boost::math::policies::errno_on_error; - //using boost::math::policies::ignore_error; - //using boost::math::policies::throw_on_error; - //using boost::math::policies::denorm_error; - //using boost::math::policies::pole_error; - //using boost::math::policies::user_error; typedef policy< boost::math::policies::domain_error, @@ -105,39 +91,6 @@ void test_ignore_policy(RealType) //std::cout << "pdf(ignore_error_arcsine(-1, +1), std::numeric_limits::infinity()) = " << pdf(ignore_error_arcsine(-1, +1), std::numeric_limits::infinity()) << std::endl; // Outputs: pdf(ignore_error_arcsine(-1, +1), std::numeric_limits::infinity()) = 1.#QNAN } - // PDF - BOOST_CHECK((boost::math::isnan)(pdf(ignore_error_arcsine(0, 1), std::numeric_limits::infinity()))); // x == infinity - BOOST_CHECK((boost::math::isnan)(pdf(ignore_error_arcsine(-1, 1), std::numeric_limits::infinity()))); // x == infinity - BOOST_CHECK((boost::math::isnan)(pdf(ignore_error_arcsine(0, 1), static_cast (-2)))); // x < xmin - BOOST_CHECK((boost::math::isnan)(pdf(ignore_error_arcsine(-1, 1), static_cast (-2)))); // x < xmin - BOOST_CHECK((boost::math::isnan)(pdf(ignore_error_arcsine(0, 1), static_cast (+2)))); // x > x_max - BOOST_CHECK((boost::math::isnan)(pdf(ignore_error_arcsine(-1, 1), static_cast (+2)))); // x > x_max - - // Logpdf - BOOST_CHECK((boost::math::isnan)(logpdf(ignore_error_arcsine(0, 1), std::numeric_limits::infinity()))); // x == infinity - BOOST_CHECK((boost::math::isnan)(logpdf(ignore_error_arcsine(-1, 1), std::numeric_limits::infinity()))); // x == infinity - BOOST_CHECK((boost::math::isnan)(logpdf(ignore_error_arcsine(0, 1), static_cast (-2)))); // x < xmin - BOOST_CHECK((boost::math::isnan)(logpdf(ignore_error_arcsine(-1, 1), static_cast (-2)))); // x < xmin - BOOST_CHECK((boost::math::isnan)(logpdf(ignore_error_arcsine(0, 1), static_cast (+2)))); // x > x_max - BOOST_CHECK((boost::math::isnan)(logpdf(ignore_error_arcsine(-1, 1), static_cast (+2)))); // x > x_max - - // CDF - BOOST_CHECK((boost::math::isnan)(cdf(ignore_error_arcsine(0, 1), std::numeric_limits::infinity()))); // x == infinity - BOOST_CHECK((boost::math::isnan)(cdf(ignore_error_arcsine(-1, 1), std::numeric_limits::infinity()))); // x == infinity - BOOST_CHECK((boost::math::isnan)(cdf(ignore_error_arcsine(0, 1), static_cast (-2)))); // x < xmin - BOOST_CHECK((boost::math::isnan)(cdf(ignore_error_arcsine(-1, 1), static_cast (-2)))); // x < xmin - BOOST_CHECK((boost::math::isnan)(cdf(ignore_error_arcsine(0, 1), static_cast (+2)))); // x > x_max - BOOST_CHECK((boost::math::isnan)(cdf(ignore_error_arcsine(-1, 1), static_cast (+2)))); // x > x_max - BOOST_CHECK((boost::math::isnan)(cdf(complement(ignore_error_arcsine(0, 1), std::numeric_limits::infinity())))); // x == infinity - BOOST_CHECK((boost::math::isnan)(cdf(complement(ignore_error_arcsine(0, 1), static_cast (-2))))); // x < xmin - - // Quantile - BOOST_CHECK((boost::math::isnan)(quantile(ignore_error_arcsine(0, 1), std::numeric_limits::infinity()))); // p == infinity - BOOST_CHECK((boost::math::isnan)(quantile(ignore_error_arcsine(0, 1), static_cast(-1)))); // p < 0 - BOOST_CHECK((boost::math::isnan)(quantile(ignore_error_arcsine(0, 1), static_cast(2)))); // p > 1 - BOOST_CHECK((boost::math::isnan)(quantile(complement(ignore_error_arcsine(0, 1), std::numeric_limits::infinity())))); // q == infinity - BOOST_CHECK((boost::math::isnan)(quantile(complement(ignore_error_arcsine(0, 1), static_cast(-1))))); // q < 0 - BOOST_CHECK((boost::math::isnan)(quantile(complement(ignore_error_arcsine(0, 1), static_cast(2))))); // q > 1 // Mean BOOST_CHECK((boost::math::isnan)(mean(ignore_error_arcsine(-nan, 0)))); @@ -201,6 +154,7 @@ void test_ignore_policy(RealType) BOOST_CHECK(boost::math::isfinite(mean(ignore_error_arcsine(0, std::numeric_limits::epsilon())))); check_support >(arcsine_distribution(0, 1)); + test_invalid_support(); } // ordinary floats. } // template void test_ignore_policy(RealType) @@ -363,7 +317,6 @@ void test_spots(RealType) BOOST_CHECK_CLOSE_FRACTION(cdf(complement(arcsine_01, 0.95)), static_cast(0.14356629312870627075094188477505571882161519989741L), 8 * tolerance); // 2 for asin BOOST_CHECK_CLOSE_FRACTION(cdf(complement(arcsine_01, 0.999999)), static_cast(1 - 0.99936338012152907551581622632042615133907872213939L), 1000000 * tolerance); // 10000 for asin, 1000000 for acos. - // Quantile. // Check 1st, 2nd and 3rd quartiles. BOOST_CHECK_CLOSE_FRACTION(quantile(arcsine_01, static_cast(0.25L)), static_cast(0.14644660940672624L), tolerance); @@ -471,10 +424,6 @@ void test_spots(RealType) BOOST_CHECK_CLOSE_FRACTION(quantile(as_m2m1, static_cast(0.85643370687129372924905811522494428117838480010259L)), -static_cast(1.05L), 2 * tolerance); // BOOST_CHECK_CLOSE_FRACTION(quantile(as_m2m1, static_cast(0.5L)), -static_cast(1.5L), 2 * tolerance); // BOOST_CHECK_CLOSE_FRACTION(quantile(as_m2m1, static_cast(0.14356629312870627075094188477505571882161519989741L)), -static_cast(1.95L), 4 * tolerance); // - BOOST_CHECK_EQUAL(quantile(as_m2m1, 1), 1); - BOOST_CHECK_EQUAL(quantile(as_m2m1, 0), 0); - BOOST_CHECK_EQUAL(quantile(complement(as_m2m1, 1)), 0); - BOOST_CHECK_EQUAL(quantile(complement(as_m2m1, 0)), 1); BOOST_CHECK_CLOSE_FRACTION(quantile(complement(as_m2m1, static_cast(0.14356629312870627075094188477505571882161519989741L))), -static_cast(1.05L), 2 * tolerance); // BOOST_CHECK_CLOSE_FRACTION(quantile(as_m2m1, static_cast(0.5L)), -static_cast(1.5L), 2 * tolerance); // @@ -541,16 +490,6 @@ void test_spots(RealType) BOOST_CHECK_THROW(arcsine_distribution(+1, -1), std::domain_error); // max < min. BOOST_CHECK_THROW(arcsine_distribution(+1, 0), std::domain_error); // max < min. - arcsine_distribution<> dist; - BOOST_CHECK_THROW(pdf(dist, -1), std::domain_error); - BOOST_CHECK_THROW(logpdf(dist, -1), std::domain_error); - BOOST_CHECK_THROW(cdf(dist, -1), std::domain_error); - BOOST_CHECK_THROW(cdf(complement(dist, -1)), std::domain_error); - BOOST_CHECK_THROW(quantile(dist, -1), std::domain_error); - BOOST_CHECK_THROW(quantile(complement(dist, -1)), std::domain_error); - BOOST_CHECK_THROW(quantile(dist, -1), std::domain_error); - BOOST_CHECK_THROW(quantile(complement(dist, -1)), std::domain_error); - // Various combinations of bad constructor and member function parameters. BOOST_CHECK_THROW(pdf(boost::math::arcsine_distribution(0, 1), -1), std::domain_error); BOOST_CHECK_THROW(pdf(boost::math::arcsine_distribution(-1, 1), +2), std::domain_error); diff --git a/test/test_dist_helpers.hpp b/test/test_dist_helpers.hpp new file mode 100644 index 0000000000..38e16c1d56 --- /dev/null +++ b/test/test_dist_helpers.hpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include +#include + +template