gtsam
Loading...
Searching...
No Matches
Expression.h
Go to the documentation of this file.
1/* ----------------------------------------------------------------------------
2
3 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4 * Atlanta, Georgia 30332-0415
5 * All Rights Reserved
6 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7
8 * See LICENSE for the license information
9
10 * -------------------------------------------------------------------------- */
11
19
20#pragma once
21
22#include <gtsam/nonlinear/internal/JacobianMap.h>
25#include <gtsam/base/VectorSpace.h>
26
27#include <map>
28
29// Forward declare tests
30class ExpressionFactorShallowTest;
31
32namespace gtsam {
33
34// Forward declares
35class Values;
36template<typename T> class ExpressionFactor;
37template<typename T> class ExpressionEqualityConstraint;
38class ScalarExpressionInequalityConstraint;
39
40namespace internal {
41template<typename T> class ExecutionTrace;
42template<typename T> class ExpressionNode;
43}
44
48template<typename T>
50
51public:
52
55
56protected:
57
58 // Paul's trick shared pointer, polymorphic root of entire expression tree
59 std::shared_ptr<internal::ExpressionNode<T> > root_;
60
62 Expression(const std::shared_ptr<internal::ExpressionNode<T> >& root) : root_(root) {}
63
64public:
65
66 // Expressions wrap trees of functions that can evaluate their own derivatives.
67 // The meta-functions below are useful to specify the type of those functions.
68 // Example, a function taking a camera and a 3D point and yielding a 2D point:
69 // Expression<Point2>::BinaryFunction<PinholeCamera<Cal3_S2>,Point3>::type
70 template<class A1>
72 typedef std::function<
73 T(const A1&, typename MakeOptionalJacobian<T, A1>::type)> type;
74 };
75
76 template<class A1, class A2>
78 typedef std::function<
79 T(const A1&, const A2&, typename MakeOptionalJacobian<T, A1>::type,
80 typename MakeOptionalJacobian<T, A2>::type)> type;
81 };
82
83 template<class A1, class A2, class A3>
85 typedef std::function<
86 T(const A1&, const A2&, const A3&,
87 typename MakeOptionalJacobian<T, A1>::type,
88 typename MakeOptionalJacobian<T, A2>::type,
89 typename MakeOptionalJacobian<T, A3>::type)> type;
90 };
91
93 Expression(const T& value);
94
96 Expression(const Key& key);
97
100
102 Expression(unsigned char c, std::uint64_t j);
103
105 template<typename A>
106 Expression(typename UnaryFunction<A>::type function,
107 const Expression<A>& expression);
108
110 template<typename A1, typename A2>
111 Expression(typename BinaryFunction<A1, A2>::type function,
112 const Expression<A1>& expression1, const Expression<A2>& expression2);
113
115 template<typename A1, typename A2, typename A3>
116 Expression(typename TernaryFunction<A1, A2, A3>::type function,
117 const Expression<A1>& expression1, const Expression<A2>& expression2,
118 const Expression<A3>& expression3);
119
121 template<typename A>
122 Expression(const Expression<A>& expression,
123 T (A::*method)(typename MakeOptionalJacobian<T, A>::type) const);
124
126 template<typename A1, typename A2>
127 Expression(const Expression<A1>& expression1,
128 T (A1::*method)(const A2&, typename MakeOptionalJacobian<T, A1>::type,
129 typename MakeOptionalJacobian<T, A2>::type) const,
130 const Expression<A2>& expression2);
131
133 template<typename A1, typename A2, typename A3>
134 Expression(const Expression<A1>& expression1,
135 T (A1::*method)(const A2&, const A3&,
136 typename MakeOptionalJacobian<T, A1>::type,
137 typename MakeOptionalJacobian<T, A2>::type,
138 typename MakeOptionalJacobian<T, A3>::type) const,
139 const Expression<A2>& expression2, const Expression<A3>& expression3);
140
142 virtual ~Expression() {
143 }
144
146 KeySet keys() const;
147
149 void dims(std::map<Key, int>& map) const;
150
152 void print(const std::string& s) const;
153
159 T value(const Values& values, std::vector<Matrix>* H = nullptr) const;
160
165 T value(const Values& values, std::vector<Matrix>& H) const {
166 return value(values, &H);
167 }
168
174 virtual std::shared_ptr<Expression> clone() const {
175 return std::make_shared<Expression>(*this);
176 }
177
179 const std::shared_ptr<internal::ExpressionNode<T> >& root() const;
180
182 size_t traceSize() const;
183
186
187protected:
188
191
193 typedef std::pair<KeyVector, FastVector<int> > KeysAndDims;
194 KeysAndDims keysAndDims() const;
195
197 T valueAndDerivatives(const Values& values, const KeyVector& keys,
198 const FastVector<int>& dims, std::vector<Matrix>& H) const;
199
202 char* traceStorage) const;
203
206 internal::JacobianMap& jacobians) const;
207
208 // be very selective on who can access these private methods:
209 friend class ExpressionFactor<T> ;
210 friend class internal::ExpressionNode<T>;
211 friend class ExpressionEqualityConstraint<T>;
212 friend class ScalarExpressionInequalityConstraint;
213
214 // and add tests
215 friend class ::ExpressionFactorShallowTest;
216};
217
222template <typename T>
223class ScalarMultiplyExpression : public Expression<T> {
224 // Check that T is a vector space
225 GTSAM_CONCEPT_ASSERT(IsVectorSpace<T>);
226
227 public:
228 explicit ScalarMultiplyExpression(double s, const Expression<T>& e);
229};
230
235template <typename T>
236class BinarySumExpression : public Expression<T> {
237 // Check that T is a vector space
238 GTSAM_CONCEPT_ASSERT(IsVectorSpace<T>);
239
240 public:
241 explicit BinarySumExpression(const Expression<T>& e1, const Expression<T>& e2);
242};
243
244
250template <typename T, typename A>
252 const std::function<T(A)>& f, const Expression<A>& expression,
253 const Eigen::Matrix<double, traits<T>::dimension, traits<A>::dimension>& dTdA) {
254 // Use lambda to endow f with a linear Jacobian
255 typename Expression<T>::template UnaryFunction<A>::type g =
256 [=](const A& value, typename MakeOptionalJacobian<T, A>::type H) {
257 if (H)
258 *H << dTdA;
259 return f(value);
260 };
261 return Expression<T>(g, expression);
262}
263
270template <typename T>
274
281template <typename T>
282BinarySumExpression<T> operator+(const Expression<T>& e1, const Expression<T>& e2) {
283 return BinarySumExpression<T>(e1, e2);
284}
285
287template <typename T>
289 // TODO(frank, abe): Implement an actual negate operator instead of multiplying by -1
290 return e1 + (-1.0) * e2;
291}
292
298template<typename T>
299Expression<T> operator*(const Expression<T>& e1, const Expression<T>& e2);
300
306template<typename T>
307std::vector<Expression<T> > createUnknowns(size_t n, char c, size_t start = 0);
308
309} // namespace gtsam
310
312
Special class for optional Jacobian arguments.
Internals for Expression.h, not for general consumption.
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
FastVector is a type alias to a std::vector with a custom memory allocator.
Definition FastVector.h:33
Global functions in a separate testing namespace.
Definition chartTesting.h:28
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition Key.h:91
Key symbol(unsigned char c, std::uint64_t j)
Create a symbol key from a character and index, i.e.
Definition Symbol.h:139
std::vector< Expression< T > > createUnknowns(size_t n, char c, size_t start)
Construct an array of leaves.
Definition Expression-inl.h:284
Point2 operator*(double s, const Point2 &p)
multiply with scalar
Definition Point2.h:52
Expression< T > linearExpression(const std::function< T(A)> &f, const Expression< A > &expression, const Eigen::Matrix< double, traits< T >::dimension, traits< A >::dimension > &dTdA)
Create an expression out of a linear function f:T->A with (constant) Jacobian dTdA TODO(frank): creat...
Definition Expression.h:251
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
Errors operator-(const Errors &a, const Errors &b)
Subtraction.
Definition Errors.cpp:74
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
Vector Space concept.
Definition VectorSpace.h:564
Character and index key used to refer to variables.
Definition Symbol.h:37
Factor that supports arbitrary expressions via AD.
Definition ExpressionFactor.h:46
Definition Expression.h:37
Definition Expression.h:41
Definition Expression.h:42
Expression class that supports automatic differentiation.
Definition Expression.h:49
Expression(const std::shared_ptr< internal::ExpressionNode< T > > &root)
Construct with a custom root.
Definition Expression.h:62
KeySet keys() const
Return keys that play in this expression.
Definition Expression-inl.h:128
Expression< TangentVector > type
Definition Expression.h:54
Expression()
Default constructor, for serialization.
Definition Expression.h:190
const std::shared_ptr< internal::ExpressionNode< TangentVector > > & root() const
T value(const Values &values, std::vector< Matrix > &H) const
An overload of the value function to accept reference to vector of matrices instead of a pointer to v...
Definition Expression.h:165
virtual ~Expression()
Destructor.
Definition Expression.h:142
Expression(const Expression< A > &expression, T(A::*method)(typename MakeOptionalJacobian< T, A >::type) const)
Construct a nullary method expression.
Definition Expression-inl.h:86
std::pair< KeyVector, FastVector< int > > KeysAndDims
Definition Expression.h:193
T traceExecution(const Values &values, internal::ExecutionTrace< T > &trace, char *traceStorage) const
trace execution, very unsafe
Definition Expression-inl.h:192
Expression(const Key &key)
Construct a leaf expression, with Key.
Definition Expression-inl.h:40
void dims(std::map< Key, int > &map) const
Return dimensions for each argument, as a map.
Definition Expression-inl.h:133
Expression(typename TernaryFunction< A1, A2, A3 >::type function, const Expression< A1 > &expression1, const Expression< A2 > &expression2, const Expression< A3 > &expression3)
Construct a ternary function expression.
Definition Expression-inl.h:75
Expression(unsigned char c, std::uint64_t j)
Construct a leaf expression, creating Symbol.
Definition Expression-inl.h:50
Expression(const Symbol &symbol)
Construct a leaf expression, with Symbol.
Definition Expression-inl.h:45
void print(const std::string &s) const
Print.
Definition Expression-inl.h:138
Expression(const Expression< A1 > &expression1, T(A1::*method)(const A2 &, typename MakeOptionalJacobian< T, A1 >::type, typename MakeOptionalJacobian< T, A2 >::type) const, const Expression< A2 > &expression2)
Construct a unary method expression.
Definition Expression-inl.h:97
T valueAndJacobianMap(const Values &values, internal::JacobianMap &jacobians) const
brief Return value and derivatives, reverse AD version
Definition Expression-inl.h:205
Expression(const Expression< A1 > &expression1, T(A1::*method)(const A2 &, const A3 &, typename MakeOptionalJacobian< T, A1 >::type, typename MakeOptionalJacobian< T, A2 >::type, typename MakeOptionalJacobian< T, A3 >::type) const, const Expression< A2 > &expression2, const Expression< A3 > &expression3)
Construct a binary method expression.
Definition Expression-inl.h:112
Expression(typename UnaryFunction< A >::type function, const Expression< A > &expression)
Construct a unary function expression.
Definition Expression-inl.h:57
TangentVector value(const Values &values, std::vector< Matrix > *H=nullptr) const
T valueAndDerivatives(const Values &values, const KeyVector &keys, const FastVector< int > &dims, std::vector< Matrix > &H) const
private version that takes keys and dimensions, returns derivatives
Definition Expression-inl.h:168
virtual std::shared_ptr< Expression > clone() const
Definition Expression.h:174
Expression(const T &value)
Construct a constant expression.
Definition Expression-inl.h:35
Expression< T > & operator+=(const Expression< T > &e)
Add another expression to this expression.
Definition Expression-inl.h:302
Expression(typename BinaryFunction< A1, A2 >::type function, const Expression< A1 > &expression1, const Expression< A2 > &expression2)
Construct a binary function expression.
Definition Expression-inl.h:65
size_t traceSize() const
Return size needed for memory buffer in traceExecution.
Definition Expression-inl.h:161
Definition Expression.h:71
Definition Expression.h:77
Definition Expression.h:84
A ScalarMultiplyExpression is a specialization of Expression that multiplies with a scalar It optimiz...
Definition Expression.h:223
A BinarySumExpression is a specialization of Expression that adds two expressions together It optimiz...
Definition Expression.h:236
A non-templated config holding any types of Manifold-group elements.
Definition Values.h:65