From f80d7b8254ff9185417f2aaa6e1796a48cf944a8 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen <4643818-rmlarsen1@users.noreply.gitlab.com> Date: Sun, 8 Mar 2026 16:00:04 -0700 Subject: [PATCH] Fix three more flaky tests: igamma, tensor_random, matrix_power libeigen/eigen!2268 Co-authored-by: Rasmus Munk Larsen --- .../SpecialFunctions/SpecialFunctionsImpl.h | 8 +++++- unsupported/test/cxx11_tensor_random.cpp | 27 ++++++++++++++++--- unsupported/test/matrix_power.cpp | 8 +++--- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h index 8e88b9dd9..83eada37f 100644 --- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h +++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h @@ -1165,7 +1165,13 @@ struct igamma_generic_impl { } } - return igamma_series_impl::run(a, x); + Scalar ret = igamma_series_impl::run(a, x); + if (mode == VALUE) { + // Clamp to [0,1] since accumulated series terms can slightly exceed 1.0 + // due to floating-point rounding for extreme arguments. + return numext::mini(one, numext::maxi(zero, ret)); + } + return ret; } }; diff --git a/unsupported/test/cxx11_tensor_random.cpp b/unsupported/test/cxx11_tensor_random.cpp index b1dc6e4c1..db370a6a8 100644 --- a/unsupported/test/cxx11_tensor_random.cpp +++ b/unsupported/test/cxx11_tensor_random.cpp @@ -18,8 +18,19 @@ static void test_default() { // Fixme: we should check that the generated numbers follow a uniform // distribution instead. - for (int i = 1; i < 6; ++i) { - VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); + // For low-precision types (half, bfloat16), the RNG has limited distinct + // values (e.g. 128 for bfloat16), so adjacent collisions are statistically + // inevitable. Only verify that not all values are identical. + if (sizeof(Scalar) <= 2) { + bool has_distinct = false; + for (int i = 1; i < 6 && !has_distinct; ++i) { + if (vec(i) != vec(i - 1)) has_distinct = true; + } + VERIFY(has_distinct); + } else { + for (int i = 1; i < 6; ++i) { + VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); + } } } @@ -30,8 +41,16 @@ static void test_normal() { // Fixme: we should check that the generated numbers follow a gaussian // distribution instead. - for (int i = 1; i < 6; ++i) { - VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); + if (sizeof(Scalar) <= 2) { + bool has_distinct = false; + for (int i = 1; i < 6 && !has_distinct; ++i) { + if (vec(i) != vec(i - 1)) has_distinct = true; + } + VERIFY(has_distinct); + } else { + for (int i = 1; i < 6; ++i) { + VERIFY_IS_NOT_EQUAL(vec(i), vec(i - 1)); + } } } diff --git a/unsupported/test/matrix_power.cpp b/unsupported/test/matrix_power.cpp index e17d35ae6..7b449bc9e 100644 --- a/unsupported/test/matrix_power.cpp +++ b/unsupported/test/matrix_power.cpp @@ -152,7 +152,7 @@ EIGEN_DECLARE_TEST(matrix_power) { CALL_SUBTEST_1(test2dHyperbolicRotation(1e-5f)); CALL_SUBTEST_9(test2dHyperbolicRotation(1e-14L)); - CALL_SUBTEST_10(test3dRotation(1e-13)); + CALL_SUBTEST_10(test3dRotation(2e-13)); CALL_SUBTEST_11(test3dRotation(1e-5f)); CALL_SUBTEST_12(test3dRotation(1e-13L)); @@ -165,7 +165,7 @@ EIGEN_DECLARE_TEST(matrix_power) { CALL_SUBTEST_8(testGeneral(Matrix4f(), 1e-4f)); CALL_SUBTEST_6(testGeneral(MatrixXf(2, 2), 1e-3f)); // see bug 614 CALL_SUBTEST_9(testGeneral(MatrixXe(7, 7), 1e-12L)); - CALL_SUBTEST_10(testGeneral(Matrix3d(), 1e-13)); + CALL_SUBTEST_10(testGeneral(Matrix3d(), 2e-13)); CALL_SUBTEST_11(testGeneral(Matrix3f(), 1e-4f)); CALL_SUBTEST_12(testGeneral(Matrix3e(), 1e-13L)); @@ -178,7 +178,7 @@ EIGEN_DECLARE_TEST(matrix_power) { CALL_SUBTEST_8(testSingular(Matrix4f(), 1e-4f)); CALL_SUBTEST_6(testSingular(MatrixXf(2, 2), 1e-3f)); CALL_SUBTEST_9(testSingular(MatrixXe(7, 7), 1e-12L)); - CALL_SUBTEST_10(testSingular(Matrix3d(), 1e-13)); + CALL_SUBTEST_10(testSingular(Matrix3d(), 2e-13)); CALL_SUBTEST_11(testSingular(Matrix3f(), 1e-4f)); CALL_SUBTEST_12(testSingular(Matrix3e(), 1e-13L)); @@ -191,7 +191,7 @@ EIGEN_DECLARE_TEST(matrix_power) { CALL_SUBTEST_8(testLogThenExp(Matrix4f(), 1e-4f)); CALL_SUBTEST_6(testLogThenExp(MatrixXf(2, 2), 1e-3f)); CALL_SUBTEST_9(testLogThenExp(MatrixXe(7, 7), 1e-12L)); - CALL_SUBTEST_10(testLogThenExp(Matrix3d(), 1e-13)); + CALL_SUBTEST_10(testLogThenExp(Matrix3d(), 2e-13)); CALL_SUBTEST_11(testLogThenExp(Matrix3f(), 1e-4f)); CALL_SUBTEST_12(testLogThenExp(Matrix3e(), 1e-13L)); }