gtsam 4.1.1
gtsam
ISAM2.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// \callgraph
20
21#pragma once
22
29
30#include <vector>
31
32namespace gtsam {
33
45class GTSAM_EXPORT ISAM2 : public BayesTree<ISAM2Clique> {
46 protected:
49
53
62
63 mutable VectorValues deltaNewton_; // Only used when using Dogleg - stores
64 // the Gauss-Newton update
65 mutable VectorValues RgProd_; // Only used when using Dogleg - stores R*g and
66 // is updated incrementally
67
76 mutable KeySet deltaReplacedMask_; // TODO(dellaert): Make sure accessed in
77 // the right way
78
82
85
88
90 mutable boost::optional<double> doglegDelta_;
91
95
98
99 public:
100 using This = ISAM2;
104 using Cliques = Base::Cliques;
105
107 explicit ISAM2(const ISAM2Params& params);
108
111 ISAM2();
112
114 virtual ~ISAM2() {}
115
117 virtual bool equals(const ISAM2& other, double tol = 1e-9) const;
118
151 virtual ISAM2Result update(
152 const NonlinearFactorGraph& newFactors = NonlinearFactorGraph(),
153 const Values& newTheta = Values(),
154 const FactorIndices& removeFactorIndices = FactorIndices(),
155 const boost::optional<FastMap<Key, int> >& constrainedKeys = boost::none,
156 const boost::optional<FastList<Key> >& noRelinKeys = boost::none,
157 const boost::optional<FastList<Key> >& extraReelimKeys = boost::none,
158 bool force_relinearize = false);
159
178 virtual ISAM2Result update(const NonlinearFactorGraph& newFactors,
179 const Values& newTheta,
180 const ISAM2UpdateParams& updateParams);
181
199 void marginalizeLeaves(
200 const FastList<Key>& leafKeys,
201 boost::optional<FactorIndices&> marginalFactorsIndices = boost::none,
202 boost::optional<FactorIndices&> deletedFactorsIndices = boost::none);
203
205 const Values& getLinearizationPoint() const { return theta_; }
206
208 bool valueExists(Key key) const { return theta_.exists(key); }
209
215 Values calculateEstimate() const;
216
223 template <class VALUE>
224 VALUE calculateEstimate(Key key) const {
225 const Vector& delta = getDelta()[key];
226 return traits<VALUE>::Retract(theta_.at<VALUE>(key), delta);
227 }
228
237 const Value& calculateEstimate(Key key) const;
238
240 Matrix marginalCovariance(Key key) const;
241
244
248 Values calculateBestEstimate() const;
249
251 const VectorValues& getDelta() const;
252
254 double error(const VectorValues& x) const;
255
258 return nonlinearFactors_;
259 }
260
262 const VariableIndex& getVariableIndex() const { return variableIndex_; }
263
265 const KeySet& getFixedVariables() const { return fixedVariables_; }
266
267 const ISAM2Params& params() const { return params_; }
268
270 void printStats() const { getCliqueData().getStats().print(); }
271
279 VectorValues gradientAtZero() const;
280
282
283 protected:
285 void recalculate(const ISAM2UpdateParams& updateParams,
286 const KeySet& relinKeys, ISAM2Result* result);
287
288 // Do a batch step - reorder and relinearize all variables
289 void recalculateBatch(const ISAM2UpdateParams& updateParams,
290 KeySet* affectedKeysSet, ISAM2Result* result);
291
292 // retrieve all factors that ONLY contain the affected variables
293 // (note that the remaining stuff is summarized in the cached factors)
294 GaussianFactorGraph relinearizeAffectedFactors(
295 const ISAM2UpdateParams& updateParams, const FastList<Key>& affectedKeys,
296 const KeySet& relinKeys);
297
298 void recalculateIncremental(const ISAM2UpdateParams& updateParams,
299 const KeySet& relinKeys,
300 const FastList<Key>& affectedKeys,
301 KeySet* affectedKeysSet, Cliques* orphans,
302 ISAM2Result* result);
303
309 void addVariables(const Values& newTheta,
310 ISAM2Result::DetailedResults* detail = 0);
311
315 void removeVariables(const KeySet& unusedKeys);
316
317 void updateDelta(bool forceFullSolve = false) const;
318
319 private:
321 friend class boost::serialization::access;
322 template<class ARCHIVE>
323 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
324 ar & boost::serialization::base_object<BayesTree<ISAM2Clique> >(*this);
325 ar & BOOST_SERIALIZATION_NVP(theta_);
326 ar & BOOST_SERIALIZATION_NVP(variableIndex_);
327 ar & BOOST_SERIALIZATION_NVP(delta_);
328 ar & BOOST_SERIALIZATION_NVP(deltaNewton_);
329 ar & BOOST_SERIALIZATION_NVP(RgProd_);
330 ar & BOOST_SERIALIZATION_NVP(deltaReplacedMask_);
331 ar & BOOST_SERIALIZATION_NVP(nonlinearFactors_);
332 ar & BOOST_SERIALIZATION_NVP(linearFactors_);
333 ar & BOOST_SERIALIZATION_NVP(doglegDelta_);
334 ar & BOOST_SERIALIZATION_NVP(fixedVariables_);
335 ar & BOOST_SERIALIZATION_NVP(update_count_);
336 }
337
338}; // ISAM2
339
341template <>
342struct traits<ISAM2> : public Testable<ISAM2> {};
343
344} // namespace gtsam
Gaussian Bayes Tree, the result of eliminating a GaussianJunctionTree.
Specialized iSAM2 Clique.
Parameters for iSAM 2.
Factor Graph consisting of non-linear factors.
Class that stores detailed iSAM2 result.
Class that stores extra params for ISAM2::update()
Global functions in a separate testing namespace.
Definition: chartTesting.h:28
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:112
FastVector< FactorIndex > FactorIndices
Define collection types:
Definition: Factor.h:33
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:69
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition: concepts.h:30
Definition: FastList.h:40
Definition: FastMap.h:38
Template to create a binary predicate.
Definition: Testable.h:111
A helper that implements the traits interface for GTSAM types.
Definition: Testable.h:151
This is the base class for any type to be stored in Values.
Definition: Value.h:36
Definition: BayesTree.h:67
boost::shared_ptr< Clique > sharedClique
Shared pointer to a clique.
Definition: BayesTree.h:74
The VariableIndex class computes and stores the block column structure of a factor graph.
Definition: VariableIndex.h:43
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition: GaussianFactorGraph.h:69
This class represents a collection of vector-valued variables associated each with a unique integer i...
Definition: VectorValues.h:74
Definition: ISAM2.h:45
KeySet fixedVariables_
Set of variables that are involved with linear factors from marginalized variables and thus cannot ha...
Definition: ISAM2.h:94
KeySet deltaReplacedMask_
A cumulative mask for the variables that were replaced and have not yet been updated in the linear so...
Definition: ISAM2.h:76
int update_count_
Counter incremented every update(), used to determine periodic relinearization.
Definition: ISAM2.h:96
VALUE calculateEstimate(Key key) const
Compute an estimate for a single variable using its incomplete linear delta computed during the last ...
Definition: ISAM2.h:224
virtual ~ISAM2()
default virtual destructor
Definition: ISAM2.h:114
const KeySet & getFixedVariables() const
Access the nonlinear variable index.
Definition: ISAM2.h:265
Base::Cliques Cliques
List of Cliques.
Definition: ISAM2.h:104
void printStats() const
prints out clique statistics
Definition: ISAM2.h:270
NonlinearFactorGraph nonlinearFactors_
All original nonlinear factors are stored here to use during relinearization.
Definition: ISAM2.h:81
const VariableIndex & getVariableIndex() const
Access the nonlinear variable index.
Definition: ISAM2.h:262
Base::sharedClique sharedClique
Shared pointer to a clique.
Definition: ISAM2.h:103
VectorValues delta_
The linear delta from the last linear solution, an update to the estimate in theta.
Definition: ISAM2.h:61
VariableIndex variableIndex_
VariableIndex lets us look up factors by involved variable and keeps track of dimensions.
Definition: ISAM2.h:52
const Values & getLinearizationPoint() const
Access the current linearization point.
Definition: ISAM2.h:205
Values theta_
The current linearization point.
Definition: ISAM2.h:48
ISAM2Params params_
The current parameters.
Definition: ISAM2.h:87
boost::optional< double > doglegDelta_
The current Dogleg Delta (trust region radius)
Definition: ISAM2.h:90
GaussianFactorGraph linearFactors_
The current linear factors, which are only updated as needed.
Definition: ISAM2.h:84
const NonlinearFactorGraph & getFactorsUnsafe() const
Access the set of nonlinear factors.
Definition: ISAM2.h:257
bool valueExists(Key key) const
Check whether variable with given key exists in linearization point.
Definition: ISAM2.h:208
Specialized Clique structure for ISAM2, incorporating caching and gradient contribution TODO: more do...
Definition: ISAM2Clique.h:37
Definition: ISAM2Params.h:135
Definition: ISAM2Result.h:41
A struct holding detailed results, which must be enabled with ISAM2Params::enableDetailedResults.
Definition: ISAM2Result.h:117
Definition: ISAM2UpdateParams.h:32
A non-linear factor graph is a graph of non-Gaussian, i.e.
Definition: NonlinearFactorGraph.h:78
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:63
const ValueType at(Key j) const
Retrieve a variable by key j.
Definition: Values-inl.h:346
bool exists(Key j) const
Check if a value exists with key j.
Definition: Values.cpp:96