From 2e83cbbba98da3a3f645133352a996b3f6daaed0 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Tue, 16 Mar 2021 17:02:50 +0000 Subject: Add NaN propagation options to minCoeff/maxCoeff visitors. --- test/visitor.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 3 deletions(-) (limited to 'test') diff --git a/test/visitor.cpp b/test/visitor.cpp index de938fc95..20fb2c3ed 100644 --- a/test/visitor.cpp +++ b/test/visitor.cpp @@ -56,9 +56,44 @@ template void matrixVisitor(const MatrixType& p) VERIFY_IS_APPROX(maxc, m.maxCoeff()); eigen_maxc = (m.adjoint()*m).maxCoeff(&eigen_maxrow,&eigen_maxcol); - eigen_maxc = (m.adjoint()*m).eval().maxCoeff(&maxrow,&maxcol); - VERIFY(maxrow == eigen_maxrow); - VERIFY(maxcol == eigen_maxcol); + Index maxrow2=0,maxcol2=0; + eigen_maxc = (m.adjoint()*m).eval().maxCoeff(&maxrow2,&maxcol2); + VERIFY(maxrow2 == eigen_maxrow); + VERIFY(maxcol2 == eigen_maxcol); + + if (!NumTraits::IsInteger && m.size() > 2) { + // Test NaN propagation by replacing an element with NaN. + bool stop = false; + for (Index j = 0; j < cols && !stop; ++j) { + for (Index i = 0; i < rows && !stop; ++i) { + if (!(j == mincol && i == minrow) && + !(j == maxcol && i == maxrow)) { + m(i,j) = NumTraits::quiet_NaN(); + stop = true; + break; + } + } + } + + eigen_minc = m.template minCoeff(&eigen_minrow, &eigen_mincol); + eigen_maxc = m.template maxCoeff(&eigen_maxrow, &eigen_maxcol); + VERIFY(minrow == eigen_minrow); + VERIFY(maxrow == eigen_maxrow); + VERIFY(mincol == eigen_mincol); + VERIFY(maxcol == eigen_maxcol); + VERIFY_IS_APPROX(minc, eigen_minc); + VERIFY_IS_APPROX(maxc, eigen_maxc); + VERIFY_IS_APPROX(minc, m.template minCoeff()); + VERIFY_IS_APPROX(maxc, m.template maxCoeff()); + + eigen_minc = m.template minCoeff(&eigen_minrow, &eigen_mincol); + eigen_maxc = m.template maxCoeff(&eigen_maxrow, &eigen_maxcol); + VERIFY(minrow != eigen_minrow || mincol != eigen_mincol); + VERIFY(maxrow != eigen_maxrow || maxcol != eigen_maxcol); + VERIFY((numext::isnan)(eigen_minc)); + VERIFY((numext::isnan)(eigen_maxc)); + } + } template void vectorVisitor(const VectorType& w) @@ -111,6 +146,31 @@ template void vectorVisitor(const VectorType& w) v2.maxCoeff(&eigen_maxidx); VERIFY(eigen_minidx == (std::min)(idx0,idx1)); VERIFY(eigen_maxidx == (std::min)(idx0,idx2)); + + if (!NumTraits::IsInteger && size > 2) { + // Test NaN propagation by replacing an element with NaN. + for (Index i = 0; i < size; ++i) { + if (i != minidx && i != maxidx) { + v(i) = NumTraits::quiet_NaN(); + break; + } + } + eigen_minc = v.template minCoeff(&eigen_minidx); + eigen_maxc = v.template maxCoeff(&eigen_maxidx); + VERIFY(minidx == eigen_minidx); + VERIFY(maxidx == eigen_maxidx); + VERIFY_IS_APPROX(minc, eigen_minc); + VERIFY_IS_APPROX(maxc, eigen_maxc); + VERIFY_IS_APPROX(minc, v.template minCoeff()); + VERIFY_IS_APPROX(maxc, v.template maxCoeff()); + + eigen_minc = v.template minCoeff(&eigen_minidx); + eigen_maxc = v.template maxCoeff(&eigen_maxidx); + VERIFY(minidx != eigen_minidx); + VERIFY(maxidx != eigen_maxidx); + VERIFY((numext::isnan)(eigen_minc)); + VERIFY((numext::isnan)(eigen_maxc)); + } } EIGEN_DECLARE_TEST(visitor) -- cgit v1.2.3