From 5bbc9cea93ef29cee2b8ffb2084d4ebca32600ba Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Wed, 31 Mar 2021 21:09:19 +0000 Subject: Add an info() method to the SVDBase class to make it possible to tell the user that the computation failed, possibly due to invalid input. Make Jacobi and divide-and-conquer fail fast and return info() == InvalidInput if the matrix contains NaN or +/-Inf. --- test/svd_common.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/svd_common.h b/test/svd_common.h index 5c0f2a0e4..bd62edcc8 100644 --- a/test/svd_common.h +++ b/test/svd_common.h @@ -298,7 +298,8 @@ EIGEN_DONT_INLINE Scalar zero() { return Scalar(0); } // workaround aggressive optimization in ICC template EIGEN_DONT_INLINE T sub(T a, T b) { return a - b; } -// all this function does is verify we don't iterate infinitely on nan/inf values +// This function verifies we don't iterate infinitely on nan/inf values, +// and that info() returns InvalidInput. template void svd_inf_nan() { @@ -307,18 +308,22 @@ void svd_inf_nan() Scalar some_inf = Scalar(1) / zero(); VERIFY(sub(some_inf, some_inf) != sub(some_inf, some_inf)); svd.compute(MatrixType::Constant(10,10,some_inf), ComputeFullU | ComputeFullV); + VERIFY(svd.info() == InvalidInput); Scalar nan = std::numeric_limits::quiet_NaN(); VERIFY(nan != nan); svd.compute(MatrixType::Constant(10,10,nan), ComputeFullU | ComputeFullV); + VERIFY(svd.info() == InvalidInput); MatrixType m = MatrixType::Zero(10,10); m(internal::random(0,9), internal::random(0,9)) = some_inf; svd.compute(m, ComputeFullU | ComputeFullV); + VERIFY(svd.info() == InvalidInput); m = MatrixType::Zero(10,10); m(internal::random(0,9), internal::random(0,9)) = nan; svd.compute(m, ComputeFullU | ComputeFullV); + VERIFY(svd.info() == InvalidInput); // regression test for bug 791 m.resize(3,3); @@ -326,6 +331,7 @@ void svd_inf_nan() 0, -0.5, 0, nan, 0, 0; svd.compute(m, ComputeFullU | ComputeFullV); + VERIFY(svd.info() == InvalidInput); m.resize(4,4); m << 1, 0, 0, 0, @@ -333,6 +339,7 @@ void svd_inf_nan() 1, 0, 1, nan, 0, nan, nan, 0; svd.compute(m, ComputeFullU | ComputeFullV); + VERIFY(svd.info() == InvalidInput); } // Regression test for bug 286: JacobiSVD loops indefinitely with some -- cgit v1.2.3