aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2011-04-13 09:49:10 +0100
committerGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2011-04-13 09:49:10 +0100
commit7e863248987b06440742b1a02feaeb35cb1d75b6 (patch)
tree036e58c303a1dd18eef80368a4c48fb37d4bb730
parent11164830f54d0a8db32f1274f9c971115b5b2eee (diff)
Implement evaluator for PartialReduxExpr as a dumb wrapper.
-rw-r--r--Eigen/src/Core/CoreEvaluators.h33
-rw-r--r--test/evaluators.cpp5
2 files changed, 38 insertions, 0 deletions
diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h
index ef6913add..db6faca10 100644
--- a/Eigen/src/Core/CoreEvaluators.h
+++ b/Eigen/src/Core/CoreEvaluators.h
@@ -665,6 +665,39 @@ protected:
};
+// -------------------- PartialReduxExpr --------------------
+//
+// This is a wrapper around the expression object.
+// TODO: Find out how to write a proper evaluator without duplicating
+// the row() and col() member functions.
+
+template< typename XprType, typename MemberOp, int Direction>
+struct evaluator_impl<PartialReduxExpr<XprType, MemberOp, Direction> >
+{
+ typedef PartialReduxExpr<XprType, MemberOp, Direction> PartialReduxExprType;
+
+ evaluator_impl(const PartialReduxExprType expr)
+ : m_expr(expr)
+ { }
+
+ typedef typename PartialReduxExprType::Index Index;
+ typedef typename PartialReduxExprType::CoeffReturnType CoeffReturnType;
+
+ CoeffReturnType coeff(Index row, Index col) const
+ {
+ return m_expr.coeff(row, col);
+ }
+
+ CoeffReturnType coeff(Index index) const
+ {
+ return m_expr.coeff(index);
+ }
+
+protected:
+ const PartialReduxExprType& m_expr;
+};
+
+
} // namespace internal
#endif // EIGEN_COREEVALUATORS_H
diff --git a/test/evaluators.cpp b/test/evaluators.cpp
index 8e0dadb06..aa57e4ad5 100644
--- a/test/evaluators.cpp
+++ b/test/evaluators.cpp
@@ -176,4 +176,9 @@ void test_evaluators()
matXcd.resize(12, 12);
VERIFY_IS_APPROX_EVALUATOR(matXcd, matXcd_ref.replicate(2,2));
VERIFY_IS_APPROX_EVALUATOR(matXcd, (matXcd_ref.replicate<2,2>()));
+
+ // test partial reductions
+ VectorXd vec1(6);
+ VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.rowwise().sum());
+ VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.colwise().sum().transpose());
}