From 8e6dc2c81d478ae1c1699ec69eb02cc42a84ffbf Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Wed, 10 Oct 2018 13:23:52 -0700 Subject: [PATCH] Fix bug in partial reduction of expressions requiring evaluation --- Eigen/src/Core/PartialReduxEvaluator.h | 3 +-- test/redux.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Eigen/src/Core/PartialReduxEvaluator.h b/Eigen/src/Core/PartialReduxEvaluator.h index 0bf8a50e0..d9c0f1224 100644 --- a/Eigen/src/Core/PartialReduxEvaluator.h +++ b/Eigen/src/Core/PartialReduxEvaluator.h @@ -134,7 +134,6 @@ struct evaluator > { typedef PartialReduxExpr XprType; typedef typename internal::nested_eval::type ArgTypeNested; - typedef typename internal::remove_all::type ArgTypeNestedCleaned; typedef typename ArgType::Scalar InputScalar; typedef typename XprType::Scalar Scalar; enum { @@ -194,7 +193,7 @@ struct evaluator > PacketType packet(Index idx) const { enum { PacketSize = internal::unpacket_traits::size }; - typedef Block::type, Direction==Vertical ? int(ArgType::RowsAtCompileTime) : int(PacketSize), Direction==Vertical ? int(PacketSize) : int(ArgType::ColsAtCompileTime), true /* InnerPanel */> PanelType; diff --git a/test/redux.cpp b/test/redux.cpp index 9e3ed4546..fdbab7714 100644 --- a/test/redux.cpp +++ b/test/redux.cpp @@ -28,6 +28,9 @@ template void matrixRedux(const MatrixType& m) // failures if we underflow into denormals. Thus, we scale so that entries are close to 1. MatrixType m1_for_prod = MatrixType::Ones(rows, cols) + RealScalar(0.2) * m1; + Matrix m2(rows,rows); + m2.setRandom(); + VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1)); VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy Scalar s(0), p(1), minc(numext::real(m1.coeff(0))), maxc(numext::real(m1.coeff(0))); @@ -46,6 +49,10 @@ template void matrixRedux(const MatrixType& m) VERIFY_IS_APPROX(m1_for_prod.prod(), p); VERIFY_IS_APPROX(m1.real().minCoeff(), numext::real(minc)); VERIFY_IS_APPROX(m1.real().maxCoeff(), numext::real(maxc)); + + // test that partial reduction works if nested expressions is forced to evaluate early + VERIFY_IS_APPROX((m1.matrix() * m1.matrix().transpose()) .cwiseProduct(m2.matrix()).rowwise().sum().sum(), + (m1.matrix() * m1.matrix().transpose()).eval().cwiseProduct(m2.matrix()).rowwise().sum().sum()); // test slice vectorization assuming assign is ok Index r0 = internal::random(0,rows-1); @@ -72,8 +79,6 @@ template void matrixRedux(const MatrixType& m) // test nesting complex expression VERIFY_EVALUATION_COUNT( (m1.matrix()*m1.matrix().transpose()).sum(), (MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1) ); - Matrix m2(rows,rows); - m2.setRandom(); VERIFY_EVALUATION_COUNT( ((m1.matrix()*m1.matrix().transpose())+m2).sum(),(MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1)); }