Formatting and documentation
parent
87ef601b66
commit
d4b868aa12
|
@ -64,7 +64,8 @@ public:
|
||||||
}
|
}
|
||||||
/// Access via key
|
/// Access via key
|
||||||
VerticalBlockMatrix::Block operator()(Key key) {
|
VerticalBlockMatrix::Block operator()(Key key) {
|
||||||
FastVector<Key>::const_iterator it = std::find(keys_.begin(),keys_.end(),key);
|
FastVector<Key>::const_iterator it = std::find(keys_.begin(), keys_.end(),
|
||||||
|
key);
|
||||||
DenseIndex block = it - keys_.begin();
|
DenseIndex block = it - keys_.begin();
|
||||||
return Ab_(block);
|
return Ab_(block);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +99,7 @@ struct CallRecord {
|
||||||
template<int ROWS, int COLS>
|
template<int ROWS, int COLS>
|
||||||
void handleLeafCase(const Eigen::Matrix<double, ROWS, COLS>& dTdA,
|
void handleLeafCase(const Eigen::Matrix<double, ROWS, COLS>& dTdA,
|
||||||
JacobianMap& jacobians, Key key) {
|
JacobianMap& jacobians, Key key) {
|
||||||
jacobians(key).block < ROWS, COLS > (0, 0) += dTdA; // block makes HUGE difference
|
jacobians(key).block<ROWS, COLS>(0, 0) += dTdA; // block makes HUGE difference
|
||||||
}
|
}
|
||||||
/// Handle Leaf Case for Dynamic Matrix type (slower)
|
/// Handle Leaf Case for Dynamic Matrix type (slower)
|
||||||
template<>
|
template<>
|
||||||
|
@ -311,9 +312,9 @@ public:
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/// Leaf Expression
|
/// Leaf Expression
|
||||||
template<class T, class Chart=DefaultChart<T> >
|
template<class T, class Chart = DefaultChart<T> >
|
||||||
class LeafExpression: public ExpressionNode<T> {
|
class LeafExpression: public ExpressionNode<T> {
|
||||||
typedef ChartValue<T,Chart> value_type; // perhaps this can be something else like a std::pair<T,Chart> ??
|
typedef ChartValue<T, Chart> value_type; // perhaps this can be something else like a std::pair<T,Chart> ??
|
||||||
|
|
||||||
/// The key into values
|
/// The key into values
|
||||||
Key key_;
|
Key key_;
|
||||||
|
@ -347,8 +348,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
virtual const value_type& traceExecution(const Values& values, ExecutionTrace<value_type>& trace,
|
virtual const value_type& traceExecution(const Values& values,
|
||||||
char* raw) const {
|
ExecutionTrace<value_type>& trace, char* raw) const {
|
||||||
trace.setLeaf(key_);
|
trace.setLeaf(key_);
|
||||||
return dynamic_cast<const value_type&>(values.at(key_));
|
return dynamic_cast<const value_type&>(values.at(key_));
|
||||||
}
|
}
|
||||||
|
@ -358,7 +359,7 @@ public:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/// Leaf Expression, if no chart is given, assume default chart and value_type is just the plain value
|
/// Leaf Expression, if no chart is given, assume default chart and value_type is just the plain value
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class LeafExpression<T, DefaultChart<T> >: public ExpressionNode<T> {
|
class LeafExpression<T, DefaultChart<T> > : public ExpressionNode<T> {
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
|
|
||||||
/// The key into values
|
/// The key into values
|
||||||
|
@ -405,6 +406,7 @@ public:
|
||||||
// C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost
|
// C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost
|
||||||
// and Beyond. Abrahams, David; Gurtovoy, Aleksey. Pearson Education.
|
// and Beyond. Abrahams, David; Gurtovoy, Aleksey. Pearson Education.
|
||||||
// to recursively generate a class, that will be the base for function nodes.
|
// to recursively generate a class, that will be the base for function nodes.
|
||||||
|
//
|
||||||
// The class generated, for three arguments A1, A2, and A3 will be
|
// The class generated, for three arguments A1, A2, and A3 will be
|
||||||
//
|
//
|
||||||
// struct Base1 : Argument<T,A1,1>, FunctionalBase<T> {
|
// struct Base1 : Argument<T,A1,1>, FunctionalBase<T> {
|
||||||
|
@ -429,6 +431,30 @@ public:
|
||||||
//
|
//
|
||||||
// All this magic happens when we generate the Base3 base class of FunctionalNode
|
// All this magic happens when we generate the Base3 base class of FunctionalNode
|
||||||
// by invoking boost::mpl::fold over the meta-function GenerateFunctionalNode
|
// by invoking boost::mpl::fold over the meta-function GenerateFunctionalNode
|
||||||
|
//
|
||||||
|
// Similarly, the inner Record struct will be
|
||||||
|
//
|
||||||
|
// struct Record1 : JacobianTrace<T,A1,1>, CallRecord<traits::dimension<T>::value> {
|
||||||
|
// ... storage related to A1 ...
|
||||||
|
// ... methods that work on A1 ...
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// struct Record2 : JacobianTrace<T,A2,2>, Record1 {
|
||||||
|
// ... storage related to A2 ...
|
||||||
|
// ... methods that work on A2 and (recursively) on A1 ...
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// struct Record3 : JacobianTrace<T,A3,3>, Record2 {
|
||||||
|
// ... storage related to A3 ...
|
||||||
|
// ... methods that work on A3 and (recursively) on A2 and A1 ...
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// struct Record : Record3 {
|
||||||
|
// Provides convenience access to storage in hierarchy by using
|
||||||
|
// static_cast<JacobianTrace<T, A, N> &>(*this)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
/// meta-function to generate fixed-size JacobianTA type
|
/// meta-function to generate fixed-size JacobianTA type
|
||||||
|
@ -457,6 +483,7 @@ struct FunctionalBase: ExpressionNode<T> {
|
||||||
|
|
||||||
/// Construct an execution trace for reverse AD
|
/// Construct an execution trace for reverse AD
|
||||||
void trace(const Values& values, Record* record, char*& raw) const {
|
void trace(const Values& values, Record* record, char*& raw) const {
|
||||||
|
// base case: does not do anything
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -562,15 +589,23 @@ struct GenerateFunctionalNode: Argument<T, A, Base::N + 1>, Base {
|
||||||
template<class T, class TYPES>
|
template<class T, class TYPES>
|
||||||
struct FunctionalNode {
|
struct FunctionalNode {
|
||||||
|
|
||||||
|
/// The following typedef generates the recursively defined Base class
|
||||||
typedef typename boost::mpl::fold<TYPES, FunctionalBase<T>,
|
typedef typename boost::mpl::fold<TYPES, FunctionalBase<T>,
|
||||||
GenerateFunctionalNode<T, MPL::_2, MPL::_1> >::type Base;
|
GenerateFunctionalNode<T, MPL::_2, MPL::_1> >::type Base;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type generated by this meta-function derives from Base
|
||||||
|
* and adds access functions as well as the crucial [trace] function
|
||||||
|
*/
|
||||||
struct type: public Base {
|
struct type: public Base {
|
||||||
|
|
||||||
// Argument types and derived, note these are base 0 !
|
// Argument types and derived, note these are base 0 !
|
||||||
|
// These are currently not used - useful for Phoenix in future
|
||||||
|
#ifdef EXPRESSIONS_PHOENIX
|
||||||
typedef TYPES Arguments;
|
typedef TYPES Arguments;
|
||||||
typedef typename boost::mpl::transform<TYPES, Jacobian<T, MPL::_1> >::type Jacobians;
|
typedef typename boost::mpl::transform<TYPES, Jacobian<T, MPL::_1> >::type Jacobians;
|
||||||
typedef typename boost::mpl::transform<TYPES, OptionalJacobian<T, MPL::_1> >::type Optionals;
|
typedef typename boost::mpl::transform<TYPES, OptionalJacobian<T, MPL::_1> >::type Optionals;
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Reset expression shared pointer
|
/// Reset expression shared pointer
|
||||||
template<class A, size_t N>
|
template<class A, size_t N>
|
||||||
|
@ -725,7 +760,8 @@ public:
|
||||||
|
|
||||||
typedef boost::function<
|
typedef boost::function<
|
||||||
T(const A1&, const A2&, const A3&, typename OptionalJacobian<T, A1>::type,
|
T(const A1&, const A2&, const A3&, typename OptionalJacobian<T, A1>::type,
|
||||||
typename OptionalJacobian<T, A2>::type, typename OptionalJacobian<T, A3>::type)> Function;
|
typename OptionalJacobian<T, A2>::type,
|
||||||
|
typename OptionalJacobian<T, A3>::type)> Function;
|
||||||
typedef typename FunctionalNode<T, boost::mpl::vector<A1, A2, A3> >::type Base;
|
typedef typename FunctionalNode<T, boost::mpl::vector<A1, A2, A3> >::type Base;
|
||||||
typedef typename Base::Record Record;
|
typedef typename Base::Record Record;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue