mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-19 16:19:37 +08:00
Fix bug in partial reduction of expressions requiring evaluation
This commit is contained in:
parent
f3130ee1ba
commit
8e6dc2c81d
@ -134,7 +134,6 @@ struct evaluator<PartialReduxExpr<ArgType, MemberOp, Direction> >
|
|||||||
{
|
{
|
||||||
typedef PartialReduxExpr<ArgType, MemberOp, Direction> XprType;
|
typedef PartialReduxExpr<ArgType, MemberOp, Direction> XprType;
|
||||||
typedef typename internal::nested_eval<ArgType,1>::type ArgTypeNested;
|
typedef typename internal::nested_eval<ArgType,1>::type ArgTypeNested;
|
||||||
typedef typename internal::remove_all<ArgTypeNested>::type ArgTypeNestedCleaned;
|
|
||||||
typedef typename ArgType::Scalar InputScalar;
|
typedef typename ArgType::Scalar InputScalar;
|
||||||
typedef typename XprType::Scalar Scalar;
|
typedef typename XprType::Scalar Scalar;
|
||||||
enum {
|
enum {
|
||||||
@ -194,7 +193,7 @@ struct evaluator<PartialReduxExpr<ArgType, MemberOp, Direction> >
|
|||||||
PacketType packet(Index idx) const
|
PacketType packet(Index idx) const
|
||||||
{
|
{
|
||||||
enum { PacketSize = internal::unpacket_traits<PacketType>::size };
|
enum { PacketSize = internal::unpacket_traits<PacketType>::size };
|
||||||
typedef Block<const ArgType,
|
typedef Block<typename internal::add_const_on_value_type<ArgTypeNested>::type,
|
||||||
Direction==Vertical ? int(ArgType::RowsAtCompileTime) : int(PacketSize),
|
Direction==Vertical ? int(ArgType::RowsAtCompileTime) : int(PacketSize),
|
||||||
Direction==Vertical ? int(PacketSize) : int(ArgType::ColsAtCompileTime),
|
Direction==Vertical ? int(PacketSize) : int(ArgType::ColsAtCompileTime),
|
||||||
true /* InnerPanel */> PanelType;
|
true /* InnerPanel */> PanelType;
|
||||||
|
@ -28,6 +28,9 @@ template<typename MatrixType> void matrixRedux(const MatrixType& m)
|
|||||||
// failures if we underflow into denormals. Thus, we scale so that entries are close to 1.
|
// 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;
|
MatrixType m1_for_prod = MatrixType::Ones(rows, cols) + RealScalar(0.2) * m1;
|
||||||
|
|
||||||
|
Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> m2(rows,rows);
|
||||||
|
m2.setRandom();
|
||||||
|
|
||||||
VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1));
|
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
|
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)));
|
Scalar s(0), p(1), minc(numext::real(m1.coeff(0))), maxc(numext::real(m1.coeff(0)));
|
||||||
@ -46,6 +49,10 @@ template<typename MatrixType> void matrixRedux(const MatrixType& m)
|
|||||||
VERIFY_IS_APPROX(m1_for_prod.prod(), p);
|
VERIFY_IS_APPROX(m1_for_prod.prod(), p);
|
||||||
VERIFY_IS_APPROX(m1.real().minCoeff(), numext::real(minc));
|
VERIFY_IS_APPROX(m1.real().minCoeff(), numext::real(minc));
|
||||||
VERIFY_IS_APPROX(m1.real().maxCoeff(), numext::real(maxc));
|
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
|
// test slice vectorization assuming assign is ok
|
||||||
Index r0 = internal::random<Index>(0,rows-1);
|
Index r0 = internal::random<Index>(0,rows-1);
|
||||||
@ -72,8 +79,6 @@ template<typename MatrixType> void matrixRedux(const MatrixType& m)
|
|||||||
|
|
||||||
// test nesting complex expression
|
// test nesting complex expression
|
||||||
VERIFY_EVALUATION_COUNT( (m1.matrix()*m1.matrix().transpose()).sum(), (MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1) );
|
VERIFY_EVALUATION_COUNT( (m1.matrix()*m1.matrix().transpose()).sum(), (MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1) );
|
||||||
Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime> m2(rows,rows);
|
|
||||||
m2.setRandom();
|
|
||||||
VERIFY_EVALUATION_COUNT( ((m1.matrix()*m1.matrix().transpose())+m2).sum(),(MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1));
|
VERIFY_EVALUATION_COUNT( ((m1.matrix()*m1.matrix().transpose())+m2).sum(),(MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user