inlined a fully specialized function template defined in a .hpp

release/4.3a0
Renaud Dube 2014-11-07 11:37:27 +01:00
parent a94835a2e4
commit bd3f9db7df
1 changed files with 58 additions and 53 deletions

View File

@ -58,7 +58,7 @@ class Expression;
class JacobianMap { class JacobianMap {
const FastVector<Key>& keys_; const FastVector<Key>& keys_;
VerticalBlockMatrix& Ab_; VerticalBlockMatrix& Ab_;
public: public:
JacobianMap(const FastVector<Key>& keys, VerticalBlockMatrix& Ab) : JacobianMap(const FastVector<Key>& keys, VerticalBlockMatrix& Ab) :
keys_(keys), Ab_(Ab) { keys_(keys), Ab_(Ab) {
} }
@ -98,11 +98,16 @@ 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) {
// if (ROWS == -1 && COLS == -1 ) {
// jacobians(key) += dTdA;
// } else {
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<>
void handleLeafCase( inline void handleLeafCase(
const Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& dTdA, const Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& dTdA,
JacobianMap& jacobians, Key key) { JacobianMap& jacobians, Key key) {
jacobians(key) += dTdA; jacobians(key) += dTdA;
@ -140,7 +145,7 @@ class ExecutionTrace {
Key key; Key key;
CallRecord<Dim>* ptr; CallRecord<Dim>* ptr;
} content; } content;
public: public:
/// Pointer always starts out as a Constant /// Pointer always starts out as a Constant
ExecutionTrace() : ExecutionTrace() :
kind(Constant) { kind(Constant) {
@ -242,7 +247,7 @@ struct Select<2, A> {
template<class T> template<class T>
class ExpressionNode { class ExpressionNode {
protected: protected:
size_t traceSize_; size_t traceSize_;
@ -251,7 +256,7 @@ protected:
traceSize_(traceSize) { traceSize_(traceSize) {
} }
public: public:
/// Destructor /// Destructor
virtual ~ExpressionNode() { virtual ~ExpressionNode() {
@ -295,7 +300,7 @@ class ConstantExpression: public ExpressionNode<T> {
friend class Expression<T> ; friend class Expression<T> ;
public: public:
/// Return value /// Return value
virtual T value(const Values& values) const { virtual T value(const Values& values) const {
@ -326,7 +331,7 @@ class LeafExpression: public ExpressionNode<T> {
friend class Expression<value_type> ; friend class Expression<value_type> ;
public: public:
/// Return keys that play in this expression /// Return keys that play in this expression
virtual std::set<Key> keys() const { virtual std::set<Key> keys() const {
@ -372,7 +377,7 @@ class LeafExpression<T, DefaultChart<T> >: public ExpressionNode<T> {
friend class Expression<T> ; friend class Expression<T> ;
public: public:
/// Return keys that play in this expression /// Return keys that play in this expression
virtual std::set<Key> keys() const { virtual std::set<Key> keys() const {
@ -623,13 +628,13 @@ struct FunctionalNode {
template<class T, class A1> template<class T, class A1>
class UnaryExpression: public FunctionalNode<T, boost::mpl::vector<A1> >::type { class UnaryExpression: public FunctionalNode<T, boost::mpl::vector<A1> >::type {
public: public:
typedef boost::function<T(const A1&, typename OptionalJacobian<T, A1>::type)> Function; typedef boost::function<T(const A1&, typename OptionalJacobian<T, A1>::type)> Function;
typedef typename FunctionalNode<T, boost::mpl::vector<A1> >::type Base; typedef typename FunctionalNode<T, boost::mpl::vector<A1> >::type Base;
typedef typename Base::Record Record; typedef typename Base::Record Record;
private: private:
Function function_; Function function_;
@ -642,7 +647,7 @@ private:
friend class Expression<T> ; friend class Expression<T> ;
public: public:
/// Return value /// Return value
virtual T value(const Values& values) const { virtual T value(const Values& values) const {
@ -667,7 +672,7 @@ public:
template<class T, class A1, class A2> template<class T, class A1, class A2>
class BinaryExpression: public FunctionalNode<T, boost::mpl::vector<A1, A2> >::type { class BinaryExpression: public FunctionalNode<T, boost::mpl::vector<A1, A2> >::type {
public: public:
typedef boost::function< typedef boost::function<
T(const A1&, const A2&, typename OptionalJacobian<T, A1>::type, T(const A1&, const A2&, typename OptionalJacobian<T, A1>::type,
@ -675,7 +680,7 @@ public:
typedef typename FunctionalNode<T, boost::mpl::vector<A1, A2> >::type Base; typedef typename FunctionalNode<T, boost::mpl::vector<A1, A2> >::type Base;
typedef typename Base::Record Record; typedef typename Base::Record Record;
private: private:
Function function_; Function function_;
@ -692,7 +697,7 @@ private:
friend class Expression<T> ; friend class Expression<T> ;
friend class ::ExpressionFactorBinaryTest; friend class ::ExpressionFactorBinaryTest;
public: public:
/// Return value /// Return value
virtual T value(const Values& values) const { virtual T value(const Values& values) const {
@ -721,7 +726,7 @@ public:
template<class T, class A1, class A2, class A3> template<class T, class A1, class A2, class A3>
class TernaryExpression: public FunctionalNode<T, boost::mpl::vector<A1, A2, A3> >::type { class TernaryExpression: public FunctionalNode<T, boost::mpl::vector<A1, A2, A3> >::type {
public: 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,
@ -729,7 +734,7 @@ public:
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;
private: private:
Function function_; Function function_;
@ -746,7 +751,7 @@ private:
friend class Expression<T> ; friend class Expression<T> ;
public: public:
/// Return value /// Return value
virtual T value(const Values& values) const { virtual T value(const Values& values) const {