Moved utility functions to inl.h

release/4.3a0
dellaert 2015-05-11 20:53:41 -07:00
parent 8d8f270b60
commit 134730eeee
2 changed files with 41 additions and 25 deletions

View File

@ -232,4 +232,33 @@ typename Expression<T>::KeysAndDims Expression<T>::keysAndDims() const {
return pair;
}
// http://stackoverflow.com/questions/16260445/boost-bind-to-operator
template<class T>
struct apply_compose {
typedef T result_type;
static const int Dim = traits<T>::dimension;
T operator()(const T& x, const T& y, OptionalJacobian<Dim, Dim> H1 =
boost::none, OptionalJacobian<Dim, Dim> H2 = boost::none) const {
return x.compose(y, H1, H2);
}
};
/// Construct a product expression, assumes T::compose(T) -> T
template<typename T>
Expression<T> operator*(const Expression<T>& expression1,
const Expression<T>& expression2) {
return Expression<T>(boost::bind(apply_compose<T>(), _1, _2, _3, _4),
expression1, expression2);
}
/// Construct an array of leaves
template<typename T>
std::vector<Expression<T> > createUnknowns(size_t n, char c, size_t start) {
std::vector<Expression<T> > unknowns;
unknowns.reserve(n);
for (size_t i = start; i < start + n; i++)
unknowns.push_back(Expression<T>(c, i));
return unknowns;
}
} // namespace gtsam

View File

@ -185,34 +185,21 @@ private:
friend class ::ExpressionFactorShallowTest;
};
// http://stackoverflow.com/questions/16260445/boost-bind-to-operator
template<class T>
struct apply_compose {
typedef T result_type;
static const int Dim = traits<T>::dimension;
T operator()(const T& x, const T& y, OptionalJacobian<Dim, Dim> H1 =
boost::none, OptionalJacobian<Dim, Dim> H2 = boost::none) const {
return x.compose(y, H1, H2);
}
};
/// Construct a product expression, assumes T::compose(T) -> T
/**
* Construct a product expression, assumes T::compose(T) -> T
* Example:
* Expression<Point2> a(0), b(1), c = a*b;
*/
template<typename T>
Expression<T> operator*(const Expression<T>& expression1,
const Expression<T>& expression2) {
return Expression<T>(boost::bind(apply_compose<T>(), _1, _2, _3, _4),
expression1, expression2);
}
Expression<T> operator*(const Expression<T>& e1, const Expression<T>& e2);
/// Construct an array of leaves
/**
* Construct an array of unknown expressions with successive symbol keys
* Example:
* createUnknowns<Pose2>(3,'x') creates unknown expressions for x0,x1,x2
*/
template<typename T>
std::vector<Expression<T> > createUnknowns(size_t n, char c, size_t start = 0) {
std::vector<Expression<T> > unknowns;
unknowns.reserve(n);
for (size_t i = start; i < start + n; i++)
unknowns.push_back(Expression<T>(c, i));
return unknowns;
}
std::vector<Expression<T> > createUnknowns(size_t n, char c, size_t start = 0);
} // namespace gtsam