From 55cc4ba56c01f292f538e9fc2384ee36d9cb2a82 Mon Sep 17 00:00:00 2001 From: dellaert Date: Sun, 12 Oct 2014 23:31:48 +0200 Subject: [PATCH] Switched names of fold result and meta-function that is folded over --- gtsam_unstable/nonlinear/Expression-inl.h | 50 ++++++++++--------- .../nonlinear/tests/testExpressionFactor.cpp | 2 +- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/gtsam_unstable/nonlinear/Expression-inl.h b/gtsam_unstable/nonlinear/Expression-inl.h index fccb517c3..3f090c881 100644 --- a/gtsam_unstable/nonlinear/Expression-inl.h +++ b/gtsam_unstable/nonlinear/Expression-inl.h @@ -449,7 +449,7 @@ struct JacobianTrace { * and Beyond. Pearson Education. */ template -struct Record: JacobianTrace, Base { +struct GenerateRecord: JacobianTrace, Base { typedef T return_type; static size_t const N = Base::N + 1; @@ -486,9 +486,8 @@ struct Record: JacobianTrace, Base { /// Recursive Record class Generator template -struct GenerateRecord { - typedef typename boost::mpl::fold, - Record >::type type; +struct Record: public boost::mpl::fold, + GenerateRecord >::type { }; /// Access JacobianTrace @@ -517,14 +516,14 @@ Eigen::Matrix& jacobian( */ template struct Argument { - boost::shared_ptr > expressionA_; + boost::shared_ptr > expression; }; /** * Recursive Definition of Functional ExpressionNode */ template -struct FunctionalNode: Argument, Base { +struct GenerateFunctionalNode: Argument, Base { typedef T return_type; static size_t const N = Base::N + 1; @@ -534,9 +533,8 @@ struct FunctionalNode: Argument, Base { /// Recursive GenerateFunctionalNode class Generator template -struct GenerateFunctionalNode { - typedef typename boost::mpl::fold, - Record >::type type; +struct FunctionalNode: public boost::mpl::fold, + GenerateFunctionalNode >::type { }; /// Access Argument @@ -545,10 +543,17 @@ Argument& argument(Record& record) { return static_cast&>(record); } +/// Access Expression +template +ExecutionTrace& expression(Record* record) { + return argument(*record).expression; +} + //----------------------------------------------------------------------------- + /// Unary Function Expression template -class UnaryExpression: public ExpressionNode { +class UnaryExpression: public FunctionalNode > { public: @@ -562,8 +567,8 @@ private: /// Constructor with a unary function f, and input argument e UnaryExpression(Function f, const Expression& e1) : - ExpressionNode(sizeof(Record) + e1.traceSize()), // function_(f), expressionA1_(e1.root()) { + ExpressionNode::traceSize_ = sizeof(Record) + e1.traceSize(); } friend class Expression ; @@ -592,7 +597,7 @@ public: /// CallRecord structure for reverse AD typedef boost::mpl::vector Arguments; - typedef typename GenerateRecord::type Record; + typedef Record Record; /// Construct an execution trace for reverse AD virtual T traceExecution(const Values& values, ExecutionTrace& trace, @@ -630,8 +635,9 @@ private: /// Constructor with a binary function f, and two input arguments BinaryExpression(Function f, // const Expression& e1, const Expression& e2) : - ExpressionNode(sizeof(Record) + e1.traceSize() + e2.traceSize()), function_( - f), expressionA1_(e1.root()), expressionA2_(e2.root()) { + function_(f), expressionA1_(e1.root()), expressionA2_(e2.root()) { + ExpressionNode::traceSize_ = // + sizeof(Record) + e1.traceSize() + e2.traceSize(); } friend class Expression ; @@ -669,7 +675,7 @@ public: /// CallRecord structure for reverse AD typedef boost::mpl::vector Arguments; - typedef typename GenerateRecord::type Record; + typedef Record Record; /// Construct an execution trace for reverse AD /// The raw buffer is [Record | A1 raw | A2 raw] @@ -711,14 +717,12 @@ private: boost::shared_ptr > expressionA3_; /// Constructor with a ternary function f, and three input arguments - TernaryExpression( - Function f, // - const Expression& e1, const Expression& e2, - const Expression& e3) : - ExpressionNode( - sizeof(Record) + e1.traceSize() + e2.traceSize() + e3.traceSize()), function_( - f), expressionA1_(e1.root()), expressionA2_(e2.root()), expressionA3_( + TernaryExpression(Function f, const Expression& e1, + const Expression& e2, const Expression& e3) : + function_(f), expressionA1_(e1.root()), expressionA2_(e2.root()), expressionA3_( e3.root()) { + ExpressionNode::traceSize_ = // + sizeof(Record) + e1.traceSize() + e2.traceSize() + e3.traceSize(); } friend class Expression ; @@ -762,7 +766,7 @@ public: /// CallRecord structure for reverse AD typedef boost::mpl::vector Arguments; - typedef typename GenerateRecord::type Record; + typedef Record Record; /// Construct an execution trace for reverse AD virtual T traceExecution(const Values& values, ExecutionTrace& trace, diff --git a/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp b/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp index 82b03c0e4..a7923b157 100644 --- a/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp +++ b/gtsam_unstable/nonlinear/tests/testExpressionFactor.cpp @@ -433,7 +433,7 @@ namespace mpl = boost::mpl; template struct Incomplete; typedef mpl::vector MyTypes; -typedef GenerateRecord::type Generated; +typedef Record Generated; //Incomplete incomplete; //BOOST_MPL_ASSERT((boost::is_same< Matrix25, Generated::JacobianTA >)); BOOST_MPL_ASSERT((boost::is_same< Matrix2, Generated::Jacobian2T >));