From 5fcc096bf51968ba8b4956aa053329fdfd2c8009 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Thu, 22 Jan 2026 23:02:17 +0300 Subject: [PATCH 1/3] Remove dependencies on Boost.StaticAssert. Boost.StaticAssert has been merged into Boost.Config, so remove the dependency. --- CMakeLists.txt | 1 - build.jam | 1 - test/CMakeLists.txt | 8 ++++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 71e3bb9e3..b789eb22a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,6 @@ else() Boost::lexical_cast Boost::predef Boost::random - Boost::static_assert Boost::throw_exception ) diff --git a/build.jam b/build.jam index fb244e511..8be6e64f9 100644 --- a/build.jam +++ b/build.jam @@ -14,7 +14,6 @@ constant boost_dependencies : /boost/lexical_cast//boost_lexical_cast /boost/predef//boost_predef /boost/random//boost_random - /boost/static_assert//boost_static_assert /boost/throw_exception//boost_throw_exception ; project /boost/math diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2d9145043..4715cf379 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,7 +16,7 @@ if(HAVE_BOOST_TEST) enable_testing() - boost_test_jamfile(FILE cuda_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::static_assert Boost::throw_exception Boost::unit_test_framework ${CUDA_LIBRARIES} INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS} ) + boost_test_jamfile(FILE cuda_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::throw_exception Boost::unit_test_framework ${CUDA_LIBRARIES} INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS} ) elseif (BOOST_MATH_ENABLE_NVRTC) @@ -29,9 +29,9 @@ if(HAVE_BOOST_TEST) set(CUDA_nvrtc_LIBRARY /usr/local/cuda/lib64/libnvrtc.so) if (BOOST_MATH_NVRTC_CI_RUN) - boost_test_jamfile(FILE nvrtc_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::static_assert Boost::throw_exception ${CUDA_nvrtc_LIBRARY} ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY} COMPILE_DEFINITIONS BOOST_MATH_NVRTC_CI_RUN=1 INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS} ) + boost_test_jamfile(FILE nvrtc_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::throw_exception ${CUDA_nvrtc_LIBRARY} ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY} COMPILE_DEFINITIONS BOOST_MATH_NVRTC_CI_RUN=1 INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS} ) else () - boost_test_jamfile(FILE nvrtc_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::static_assert Boost::throw_exception ${CUDA_nvrtc_LIBRARY} ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY} INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS} ) + boost_test_jamfile(FILE nvrtc_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::throw_exception ${CUDA_nvrtc_LIBRARY} ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY} INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS} ) endif() elseif (BOOST_MATH_ENABLE_SYCL) @@ -43,7 +43,7 @@ if(HAVE_BOOST_TEST) enable_testing() - boost_test_jamfile(FILE sycl_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::static_assert Boost::throw_exception Boost::unit_test_framework sycl COMPILE_DEFINITIONS BOOST_MATH_ENABLE_SYCL=1 COMPILE_OPTIONS -fsycl ) + boost_test_jamfile(FILE sycl_jamfile LINK_LIBRARIES Boost::math Boost::assert Boost::concept_check Boost::config Boost::core Boost::integer Boost::lexical_cast Boost::multiprecision Boost::predef Boost::random Boost::throw_exception Boost::unit_test_framework sycl COMPILE_DEFINITIONS BOOST_MATH_ENABLE_SYCL=1 COMPILE_OPTIONS -fsycl ) else() boost_test(SOURCES check_cmake_version.cpp ARGUMENTS ${PROJECT_VERSION} LINK_LIBRARIES Boost::core Boost::config) From 1dacef374628535ac579e7ce8ab32a1970c25498 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Fri, 30 Jan 2026 12:27:29 +0000 Subject: [PATCH 2/3] Try and tighten up test case. --- test/test_nc_f.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_nc_f.cpp b/test/test_nc_f.cpp index 6e8da36e9..4d96f9c22 100644 --- a/test/test_nc_f.cpp +++ b/test/test_nc_f.cpp @@ -336,7 +336,7 @@ void test_spots(RealType, const char* name = nullptr) for (RealType x : x_vals) { RealType P = cdf(dist_no_centrality, x); - BOOST_CHECK(dist.find_non_centrality(x, a, b, P) < tolerance); + BOOST_CHECK_LE(dist.find_non_centrality(x, a, b, P), boost::math::tools::min_value() * 10); } // Case when P=1 or P=0 BOOST_MATH_CHECK_THROW(dist.find_non_centrality(x, a, b, 1), std::domain_error); From a011dc7c76265968399cfaff9e7c731d72f686e4 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Sun, 1 Feb 2026 17:47:53 +0000 Subject: [PATCH 3/3] Update tolerance for zero non-centrality. Add sanity checks for non-centrality finder. --- .../math/distributions/non_central_f.hpp | 2 +- test/test_nc_f.cpp | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/boost/math/distributions/non_central_f.hpp b/include/boost/math/distributions/non_central_f.hpp index a6df68b8f..0fd33e6da 100644 --- a/include/boost/math/distributions/non_central_f.hpp +++ b/include/boost/math/distributions/non_central_f.hpp @@ -63,7 +63,7 @@ namespace boost // order p * eps (note not q * eps, since q is calculated as 1-p). // Also note that p_q_precision is passed down from our caller as the // epsilon of the original called values, and not after possible promotion. - if (f(tools::min_value()) <= 3 * p_q_precision * p){ + if (f(tools::min_value()) <= 20 * p_q_precision * p){ return 0; } diff --git a/test/test_nc_f.cpp b/test/test_nc_f.cpp index 4d96f9c22..5a1cd4da6 100644 --- a/test/test_nc_f.cpp +++ b/test/test_nc_f.cpp @@ -344,6 +344,31 @@ void test_spots(RealType, const char* name = nullptr) // Case when Q=1 or Q=0 BOOST_MATH_CHECK_THROW(dist.find_non_centrality(boost::math::complement(x, a, b, 1)), std::domain_error); BOOST_MATH_CHECK_THROW(dist.find_non_centrality(boost::math::complement(x, a, b, 0)), std::domain_error); + // + // Test non centrality finder over a grid of values: + // + RealType values[] = { 1.25, 3.5, 6.75, 8.25 }; + for (RealType v1 : values) + { + for (RealType v2 : values) + { + for (RealType nc : values) + { + for (RealType x : values) + { + boost::math::non_central_f_distribution ref(v1, v2, nc); + RealType P = cdf(ref, x); + RealType Q = cdf(complement(ref, x)); + + RealType nc1 = ref.find_non_centrality(x, v1, v2, P); + RealType nc2 = ref.find_non_centrality(boost::math::complement(x, v1, v2, Q)); + + BOOST_CHECK_CLOSE(nc1, nc, 2 * tolerance); + BOOST_CHECK_CLOSE(nc2, nc, tolerance); + } + } + } + } } // template void test_spots(RealType) BOOST_AUTO_TEST_CASE( test_main )