Switched names of fold result and meta-function that is folded over
parent
ef21a4ba4a
commit
55cc4ba56c
|
@ -449,7 +449,7 @@ struct JacobianTrace {
|
||||||
* and Beyond. Pearson Education.
|
* and Beyond. Pearson Education.
|
||||||
*/
|
*/
|
||||||
template<class T, class A, class Base>
|
template<class T, class A, class Base>
|
||||||
struct Record: JacobianTrace<T, A, Base::N + 1>, Base {
|
struct GenerateRecord: JacobianTrace<T, A, Base::N + 1>, Base {
|
||||||
|
|
||||||
typedef T return_type;
|
typedef T return_type;
|
||||||
static size_t const N = Base::N + 1;
|
static size_t const N = Base::N + 1;
|
||||||
|
@ -486,9 +486,8 @@ struct Record: JacobianTrace<T, A, Base::N + 1>, Base {
|
||||||
|
|
||||||
/// Recursive Record class Generator
|
/// Recursive Record class Generator
|
||||||
template<class T, class TYPES>
|
template<class T, class TYPES>
|
||||||
struct GenerateRecord {
|
struct Record: public boost::mpl::fold<TYPES, CallRecord<T::dimension>,
|
||||||
typedef typename boost::mpl::fold<TYPES, CallRecord<T::dimension>,
|
GenerateRecord<T, MPL::_2, MPL::_1> >::type {
|
||||||
Record<T, MPL::_2, MPL::_1> >::type type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Access JacobianTrace
|
/// Access JacobianTrace
|
||||||
|
@ -517,14 +516,14 @@ Eigen::Matrix<double, Record::return_type::dimension, A::dimension>& jacobian(
|
||||||
*/
|
*/
|
||||||
template<class T, class A, size_t N>
|
template<class T, class A, size_t N>
|
||||||
struct Argument {
|
struct Argument {
|
||||||
boost::shared_ptr<ExpressionNode<A> > expressionA_;
|
boost::shared_ptr<ExpressionNode<A> > expression;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursive Definition of Functional ExpressionNode
|
* Recursive Definition of Functional ExpressionNode
|
||||||
*/
|
*/
|
||||||
template<class T, class A, class Base>
|
template<class T, class A, class Base>
|
||||||
struct FunctionalNode: Argument<T, A, Base::N + 1>, Base {
|
struct GenerateFunctionalNode: Argument<T, A, Base::N + 1>, Base {
|
||||||
|
|
||||||
typedef T return_type;
|
typedef T return_type;
|
||||||
static size_t const N = Base::N + 1;
|
static size_t const N = Base::N + 1;
|
||||||
|
@ -534,9 +533,8 @@ struct FunctionalNode: Argument<T, A, Base::N + 1>, Base {
|
||||||
|
|
||||||
/// Recursive GenerateFunctionalNode class Generator
|
/// Recursive GenerateFunctionalNode class Generator
|
||||||
template<class T, class TYPES>
|
template<class T, class TYPES>
|
||||||
struct GenerateFunctionalNode {
|
struct FunctionalNode: public boost::mpl::fold<TYPES, ExpressionNode<T>,
|
||||||
typedef typename boost::mpl::fold<TYPES, ExpressionNode<T>,
|
GenerateFunctionalNode<T, MPL::_2, MPL::_1> >::type {
|
||||||
Record<T, MPL::_2, MPL::_1> >::type type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Access Argument
|
/// Access Argument
|
||||||
|
@ -545,10 +543,17 @@ Argument<typename Record::return_type, A, N>& argument(Record& record) {
|
||||||
return static_cast<Argument<typename Record::return_type, A, N>&>(record);
|
return static_cast<Argument<typename Record::return_type, A, N>&>(record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Access Expression
|
||||||
|
template<class A, size_t N, class Record>
|
||||||
|
ExecutionTrace<A>& expression(Record* record) {
|
||||||
|
return argument<A, N>(*record).expression;
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
/// Unary Function Expression
|
/// Unary Function Expression
|
||||||
template<class T, class A1>
|
template<class T, class A1>
|
||||||
class UnaryExpression: public ExpressionNode<T> {
|
class UnaryExpression: public FunctionalNode<T, boost::mpl::vector<A1> > {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -562,8 +567,8 @@ private:
|
||||||
|
|
||||||
/// Constructor with a unary function f, and input argument e
|
/// Constructor with a unary function f, and input argument e
|
||||||
UnaryExpression(Function f, const Expression<A1>& e1) :
|
UnaryExpression(Function f, const Expression<A1>& e1) :
|
||||||
ExpressionNode<T>(sizeof(Record) + e1.traceSize()), //
|
|
||||||
function_(f), expressionA1_(e1.root()) {
|
function_(f), expressionA1_(e1.root()) {
|
||||||
|
ExpressionNode<T>::traceSize_ = sizeof(Record) + e1.traceSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
friend class Expression<T> ;
|
friend class Expression<T> ;
|
||||||
|
@ -592,7 +597,7 @@ public:
|
||||||
|
|
||||||
/// CallRecord structure for reverse AD
|
/// CallRecord structure for reverse AD
|
||||||
typedef boost::mpl::vector<A1> Arguments;
|
typedef boost::mpl::vector<A1> Arguments;
|
||||||
typedef typename GenerateRecord<T, Arguments>::type Record;
|
typedef Record<T, Arguments> Record;
|
||||||
|
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
||||||
|
@ -630,8 +635,9 @@ private:
|
||||||
/// Constructor with a binary function f, and two input arguments
|
/// Constructor with a binary function f, and two input arguments
|
||||||
BinaryExpression(Function f, //
|
BinaryExpression(Function f, //
|
||||||
const Expression<A1>& e1, const Expression<A2>& e2) :
|
const Expression<A1>& e1, const Expression<A2>& e2) :
|
||||||
ExpressionNode<T>(sizeof(Record) + e1.traceSize() + e2.traceSize()), function_(
|
function_(f), expressionA1_(e1.root()), expressionA2_(e2.root()) {
|
||||||
f), expressionA1_(e1.root()), expressionA2_(e2.root()) {
|
ExpressionNode<T>::traceSize_ = //
|
||||||
|
sizeof(Record) + e1.traceSize() + e2.traceSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
friend class Expression<T> ;
|
friend class Expression<T> ;
|
||||||
|
@ -669,7 +675,7 @@ public:
|
||||||
|
|
||||||
/// CallRecord structure for reverse AD
|
/// CallRecord structure for reverse AD
|
||||||
typedef boost::mpl::vector<A1, A2> Arguments;
|
typedef boost::mpl::vector<A1, A2> Arguments;
|
||||||
typedef typename GenerateRecord<T, Arguments>::type Record;
|
typedef Record<T, Arguments> Record;
|
||||||
|
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
/// The raw buffer is [Record | A1 raw | A2 raw]
|
/// The raw buffer is [Record | A1 raw | A2 raw]
|
||||||
|
@ -711,14 +717,12 @@ private:
|
||||||
boost::shared_ptr<ExpressionNode<A3> > expressionA3_;
|
boost::shared_ptr<ExpressionNode<A3> > expressionA3_;
|
||||||
|
|
||||||
/// Constructor with a ternary function f, and three input arguments
|
/// Constructor with a ternary function f, and three input arguments
|
||||||
TernaryExpression(
|
TernaryExpression(Function f, const Expression<A1>& e1,
|
||||||
Function f, //
|
const Expression<A2>& e2, const Expression<A3>& e3) :
|
||||||
const Expression<A1>& e1, const Expression<A2>& e2,
|
function_(f), expressionA1_(e1.root()), expressionA2_(e2.root()), expressionA3_(
|
||||||
const Expression<A3>& e3) :
|
|
||||||
ExpressionNode<T>(
|
|
||||||
sizeof(Record) + e1.traceSize() + e2.traceSize() + e3.traceSize()), function_(
|
|
||||||
f), expressionA1_(e1.root()), expressionA2_(e2.root()), expressionA3_(
|
|
||||||
e3.root()) {
|
e3.root()) {
|
||||||
|
ExpressionNode<T>::traceSize_ = //
|
||||||
|
sizeof(Record) + e1.traceSize() + e2.traceSize() + e3.traceSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
friend class Expression<T> ;
|
friend class Expression<T> ;
|
||||||
|
@ -762,7 +766,7 @@ public:
|
||||||
|
|
||||||
/// CallRecord structure for reverse AD
|
/// CallRecord structure for reverse AD
|
||||||
typedef boost::mpl::vector<A1, A2, A3> Arguments;
|
typedef boost::mpl::vector<A1, A2, A3> Arguments;
|
||||||
typedef typename GenerateRecord<T, Arguments>::type Record;
|
typedef Record<T, Arguments> Record;
|
||||||
|
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
virtual T traceExecution(const Values& values, ExecutionTrace<T>& trace,
|
||||||
|
|
|
@ -433,7 +433,7 @@ namespace mpl = boost::mpl;
|
||||||
template<class T> struct Incomplete;
|
template<class T> struct Incomplete;
|
||||||
|
|
||||||
typedef mpl::vector<Pose3, Point3, Cal3_S2> MyTypes;
|
typedef mpl::vector<Pose3, Point3, Cal3_S2> MyTypes;
|
||||||
typedef GenerateRecord<Point2, MyTypes>::type Generated;
|
typedef Record<Point2, MyTypes> Generated;
|
||||||
//Incomplete<Generated> incomplete;
|
//Incomplete<Generated> incomplete;
|
||||||
//BOOST_MPL_ASSERT((boost::is_same< Matrix25, Generated::JacobianTA >));
|
//BOOST_MPL_ASSERT((boost::is_same< Matrix25, Generated::JacobianTA >));
|
||||||
BOOST_MPL_ASSERT((boost::is_same< Matrix2, Generated::Jacobian2T >));
|
BOOST_MPL_ASSERT((boost::is_same< Matrix2, Generated::Jacobian2T >));
|
||||||
|
|
Loading…
Reference in New Issue