gtsam
Loading...
Searching...
No Matches
HessianFactor.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
18
19#pragma once
20
25
26#include <utility>
27
28namespace gtsam {
29
30 // Forward declarations
31 class Ordering;
32 class JacobianFactor;
33 class HessianFactor;
35 class GaussianBayesNet;
37
101 class GTSAM_EXPORT HessianFactor : public GaussianFactor {
102 protected:
103
105
106 public:
107
110 typedef std::shared_ptr<This> shared_ptr;
111 typedef SymmetricBlockMatrix::Block Block;
112 typedef SymmetricBlockMatrix::constBlock constBlock;
113
114
117
123 HessianFactor(Key j, const Matrix& G, const Vector& g, double f);
124
128 HessianFactor(Key j, const Vector& mu, const Matrix& Sigma);
129
145 HessianFactor(Key j1, Key j2,
146 const Matrix& G11, const Matrix& G12, const Vector& g1,
147 const Matrix& G22, const Vector& g2, double f);
148
153 HessianFactor(Key j1, Key j2, Key j3,
154 const Matrix& G11, const Matrix& G12, const Matrix& G13, const Vector& g1,
155 const Matrix& G22, const Matrix& G23, const Vector& g2,
156 const Matrix& G33, const Vector& g3, double f);
157
162 HessianFactor(const KeyVector& js, const std::vector<Matrix>& Gs,
163 const std::vector<Vector>& gs, double f);
164
166 template<typename KEYS>
168
173 template <typename KEYS>
174 HessianFactor(const KEYS& keys,
176
178 explicit HessianFactor(const JacobianFactor& cg);
179
182 explicit HessianFactor(const GaussianFactor& factor);
183
185 explicit HessianFactor(const GaussianFactorGraph& factors,
186 const Scatter& scatter);
187
189 explicit HessianFactor(const GaussianFactorGraph& factors)
190 : HessianFactor(factors, Scatter(factors)) {}
191
193 ~HessianFactor() override {}
194
197 return std::make_shared<HessianFactor>(*this); }
198
200 void print(const std::string& s = "",
201 const KeyFormatter& formatter = DefaultKeyFormatter) const override;
202
204 bool equals(const GaussianFactor& lf, double tol = 1e-9) const override;
205
207 using GaussianFactor::error;
208
213 double error(const VectorValues& c) const override;
214
219 double deltaError(const VectorValues& c, double* oldError = nullptr,
220 double* newError = nullptr) const override;
221
227 DenseIndex getDim(const_iterator variable) const override {
228 return info_.getDim(std::distance(begin(), variable));
229 }
230
232 size_t rows() const { return info_.rows(); }
233
239 GaussianFactor::shared_ptr negate() const override;
240
244 double constantTerm() const {
245 const auto view = info_.diagonalBlock(size());
246 return view(0, 0);
247 }
248
252 double& constantTerm() { return info_.diagonalBlock(size())(0, 0); }
253
258 SymmetricBlockMatrix::constBlock linearTerm(const_iterator j) const {
259#ifndef NDEBUG
260 if(empty()) throw;
261#endif
262 return info_.aboveDiagonalBlock(j - begin(), size());
263 }
264
267 SymmetricBlockMatrix::constBlock linearTerm() const {
268#ifndef NDEBUG
269 if(empty()) throw;
270#endif
271 // get the last column (except the bottom right block)
272 return info_.aboveDiagonalRange(0, size(), size(), size() + 1);
273 }
274
277 SymmetricBlockMatrix::Block linearTerm() {
278#ifndef NDEBUG
279 if(empty()) throw;
280#endif
281 return info_.aboveDiagonalRange(0, size(), size(), size() + 1);
282 }
283
285 const SymmetricBlockMatrix& info() const { return info_; }
286
290
306 Matrix augmentedInformation() const override;
307
309 Eigen::SelfAdjointView<SymmetricBlockMatrix::constBlock, Eigen::Upper> informationView() const;
310
314 Matrix information() const override;
315
317 void hessianDiagonalAdd(VectorValues& d) const override;
318
320 using Base::hessianDiagonal;
321
323 void hessianDiagonal(double* d) const override;
324
326 std::map<Key,Matrix> hessianBlockDiagonal() const override;
327
329 std::pair<Matrix, Vector> jacobian() const override;
330
336 Matrix augmentedJacobian() const override;
337
343 void updateHessian(const KeyVector& keys, SymmetricBlockMatrix* info) const override;
344
353 void updateHessian(const KeyVector& keys, SymmetricBlockMatrix* info,
354 DenseIndex beginCol, DenseIndex endCol) const override;
355
359 void updateHessian(HessianFactor* other) const {
360#ifndef NDEBUG
361 if(!other) throw;
362#endif
363 updateHessian(other->keys_, &other->info_);
364 }
365
367 void multiplyHessianAdd(double alpha, const VectorValues& x, VectorValues& y) const override;
368
370 VectorValues gradientAtZero() const override;
371
373 void gradientAtZero(double* d) const override;
374
379 Vector gradient(Key key, const VectorValues& x) const override;
380
385 std::shared_ptr<GaussianConditional> eliminateCholesky(const Ordering& keys);
386
388 VectorValues solve();
389
390 private:
392 static void CheckAugmentedInformation(
393 size_t keyCount, const SymmetricBlockMatrix& augmentedInformation);
394
396 void Allocate(const Scatter& scatter);
397
399 HessianFactor(const Scatter& scatter);
400
401 friend class NonlinearFactorGraph;
402 friend class NonlinearClusterTree;
403
404#if GTSAM_ENABLE_BOOST_SERIALIZATION
406 friend class boost::serialization::access;
407 template<class ARCHIVE>
408 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
409 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(GaussianFactor);
410 ar & BOOST_SERIALIZATION_NVP(info_);
411 }
412#endif
413 };
414
431GTSAM_EXPORT std::pair<std::shared_ptr<GaussianConditional>, std::shared_ptr<HessianFactor> >
432 EliminateCholesky(const GaussianFactorGraph& factors, const Ordering& keys);
433
449GTSAM_EXPORT std::pair<std::shared_ptr<GaussianConditional>, std::shared_ptr<GaussianFactor> >
450 EliminatePreferCholesky(const GaussianFactorGraph& factors, const Ordering& keys);
451
453template<>
454struct traits<HessianFactor> : public Testable<HessianFactor> {};
455
456} // \ namespace gtsam
457
458
A thin wrapper around std::vector that uses a custom allocator.
Access to matrices via blocks of pre-defined sizes.
Maps global variable indices to slot indices.
A factor with a quadratic error function - a Gaussian.
Contains the HessianFactor class, a general quadratic factor.
std::pair< std::shared_ptr< GaussianConditional >, std::shared_ptr< GaussianFactor > > EliminatePreferCholesky(const GaussianFactorGraph &factors, const Ordering &keys)
Densely partially eliminate with Cholesky factorization.
Definition HessianFactor.cpp:646
std::pair< std::shared_ptr< GaussianConditional >, std::shared_ptr< HessianFactor > > EliminateCholesky(const GaussianFactorGraph &factors, const Ordering &keys)
Densely partially eliminate with Cholesky factorization.
Definition HessianFactor.cpp:621
Global functions in a separate testing namespace.
Definition chartTesting.h:28
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
Definition Key.cpp:30
ptrdiff_t DenseIndex
The index type for Eigen objects.
Definition types.h:49
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition Key.h:91
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition Key.h:35
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
This class stores a dense matrix and allows it to be accessed as a collection of blocks.
Definition SymmetricBlockMatrix.h:80
Template to create a binary predicate.
Definition Testable.h:112
A helper that implements the traits interface for GTSAM types.
Definition Testable.h:152
const KeyVector & keys() const
Access the factor's involved variable keys.
Definition Factor.h:143
KeyVector keys_
The keys involved in this factor.
Definition Factor.h:88
const_iterator begin() const
Iterator at beginning of involved variable keys.
Definition Factor.h:146
bool empty() const
Whether the factor is empty (involves zero variables).
Definition Factor.h:131
KeyVector::const_iterator const_iterator
Const iterator over keys.
Definition Factor.h:83
size_t size() const
Definition Factor.h:160
Definition Ordering.h:33
GaussianBayesNet is a Bayes net made from linear-Gaussian conditionals.
Definition GaussianBayesNet.h:36
A GaussianConditional functions as the node in a Bayes network.
Definition GaussianConditional.h:43
An abstract virtual base class for JacobianFactor and HessianFactor.
Definition GaussianFactor.h:39
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition GaussianFactor.h:42
GaussianFactor()
Default constructor creates empty factor.
Definition GaussianFactor.h:49
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition GaussianFactorGraph.h:77
A Gaussian factor using the canonical parameters (information form).
Definition HessianFactor.h:101
HessianFactor This
Typedef to this class.
Definition HessianFactor.h:109
Matrix augmentedInformation() const override
Return the augmented information matrix represented by this GaussianFactor.
Definition HessianFactor.cpp:338
void updateHessian(HessianFactor *other) const
Update another Hessian factor.
Definition HessianFactor.h:359
GaussianFactor::shared_ptr clone() const override
Clone this HessianFactor.
Definition HessianFactor.h:196
const SymmetricBlockMatrix & info() const
Return underlying information matrix.
Definition HessianFactor.h:285
SymmetricBlockMatrix::Block linearTerm()
Return the complete linear term as described above.
Definition HessianFactor.h:277
double constantTerm() const
Return the constant term as described above.
Definition HessianFactor.h:244
SymmetricBlockMatrix::constBlock linearTerm() const
Return the complete linear term as described above.
Definition HessianFactor.h:267
~HessianFactor() override
Destructor.
Definition HessianFactor.h:193
HessianFactor(const GaussianFactorGraph &factors)
Combine a set of factors into a single dense HessianFactor.
Definition HessianFactor.h:189
std::shared_ptr< This > shared_ptr
A shared_ptr to this class.
Definition HessianFactor.h:110
DenseIndex getDim(const_iterator variable) const override
Return the dimension of the variable pointed to by the given key iterator todo: Remove this in favor ...
Definition HessianFactor.h:227
SymmetricBlockMatrix::constBlock linearTerm(const_iterator j) const
Return the part of linear term as described above corresponding to the requested variable.
Definition HessianFactor.h:258
SymmetricBlockMatrix info_
The full augmented information matrix, s.t. the quadratic error is 0.5*[x -1]'H[x -1].
Definition HessianFactor.h:104
GaussianFactor Base
Typedef to base class.
Definition HessianFactor.h:108
void updateHessian(const KeyVector &keys, SymmetricBlockMatrix *info) const override
Update an information matrix by adding the information corresponding to this factor (used internally ...
Definition HessianFactor.cpp:420
size_t rows() const
Return the number of columns and rows of the Hessian matrix, including the information vector.
Definition HessianFactor.h:232
HessianFactor()
default constructor for I/O
Definition HessianFactor.cpp:75
SymmetricBlockMatrix::constBlock constBlock
A block from the Hessian matrix (const version).
Definition HessianFactor.h:112
SymmetricBlockMatrix & info()
Return non-const information matrix.
Definition HessianFactor.h:289
SymmetricBlockMatrix::Block Block
A block from the Hessian matrix.
Definition HessianFactor.h:111
double & constantTerm()
Return the constant term as described above.
Definition HessianFactor.h:252
A Gaussian factor in the squared-error form.
Definition JacobianFactor.h:92
Scatter is an intermediate data structure used when building a HessianFactor incrementally,...
Definition Scatter.h:49
VectorValues represents a collection of vector-valued variables associated each with a unique integer...
Definition VectorValues.h:73
Definition NonlinearFactorGraph.h:57
Definition NonlinearClusterTree.h:14