gtsam  3.2.1
gtsam
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
19 #pragma once
20 
22 #include <gtsam/base/FastVector.h>
23 #include <gtsam/base/FastMap.h>
25 
26 #include <boost/make_shared.hpp>
27 
28 namespace gtsam {
29 
30  // Forward declarations
31  class Ordering;
32  class JacobianFactor;
33  class HessianFactor;
34  class GaussianConditional;
35  class GaussianBayesNet;
36  class GaussianFactorGraph;
37 
38  GTSAM_EXPORT std::pair<boost::shared_ptr<GaussianConditional>, boost::shared_ptr<GaussianFactor> >
39  EliminatePreferCholesky(const GaussianFactorGraph& factors, const Ordering& keys);
40 
41  GTSAM_EXPORT std::pair<boost::shared_ptr<GaussianConditional>, boost::shared_ptr<HessianFactor> >
42  EliminateCholesky(const GaussianFactorGraph& factors, const Ordering& keys);
43 
47  struct GTSAM_EXPORT SlotEntry {
48  size_t slot, dimension;
49  SlotEntry(size_t _slot, size_t _dimension)
50  : slot(_slot), dimension(_dimension) {}
51  std::string toString() const;
52  };
53 
60  class Scatter: public FastMap<Key, SlotEntry> {
61  public:
62  Scatter() {
63  }
64  Scatter(const GaussianFactorGraph& gfg,
65  boost::optional<const Ordering&> ordering = boost::none);
66  };
67 
131  class GTSAM_EXPORT HessianFactor : public GaussianFactor {
132  protected:
133 
135 
136  public:
137 
139  typedef HessianFactor This;
140  typedef boost::shared_ptr<This> shared_ptr;
143 
144 
146  HessianFactor();
147 
153  HessianFactor(Key j, const Matrix& G, const Vector& g, double f);
154 
158  HessianFactor(Key j, const Vector& mu, const Matrix& Sigma);
159 
175  HessianFactor(Key j1, Key j2,
176  const Matrix& G11, const Matrix& G12, const Vector& g1,
177  const Matrix& G22, const Vector& g2, double f);
178 
183  HessianFactor(Key j1, Key j2, Key j3,
184  const Matrix& G11, const Matrix& G12, const Matrix& G13, const Vector& g1,
185  const Matrix& G22, const Matrix& G23, const Vector& g2,
186  const Matrix& G33, const Vector& g3, double f);
187 
192  HessianFactor(const std::vector<Key>& js, const std::vector<Matrix>& Gs,
193  const std::vector<Vector>& gs, double f);
194 
197  template<typename KEYS>
198  HessianFactor(const KEYS& keys, const SymmetricBlockMatrix& augmentedInformation);
199 
201  explicit HessianFactor(const JacobianFactor& cg);
202 
205  explicit HessianFactor(const GaussianFactor& factor);
206 
208  explicit HessianFactor(const GaussianFactorGraph& factors,
209  boost::optional<const Scatter&> scatter = boost::none);
210 
212  virtual ~HessianFactor() {}
213 
216  return boost::make_shared<HessianFactor>(*this); }
217 
219  virtual void print(const std::string& s = "",
220  const KeyFormatter& formatter = DefaultKeyFormatter) const;
221 
223  virtual bool equals(const GaussianFactor& lf, double tol = 1e-9) const;
224 
226  virtual double error(const VectorValues& c) const;
233  virtual DenseIndex getDim(const_iterator variable) const { return info_(variable-this->begin(), 0).rows(); }
234 
236  size_t rows() const { return info_.rows(); }
237 
243  virtual GaussianFactor::shared_ptr negate() const;
244 
246  virtual bool empty() const { return size() == 0 /*|| rows() == 0*/; }
247 
258  constBlock info(const_iterator j1, const_iterator j2) const { return info_(j1-begin(), j2-begin()); }
259 
270  Block info(iterator j1, iterator j2) { return info_(j1-begin(), j2-begin()); }
271 
276  SymmetricBlockMatrix::constBlock info() const { return info_.full(); }
277 
282  SymmetricBlockMatrix::Block info() { return info_.full(); }
283 
287  double constantTerm() const { return info_(this->size(), this->size())(0,0); }
288 
292  double& constantTerm() { return info_(this->size(), this->size())(0,0); }
293 
298  constBlock::OffDiagonal::ColXpr linearTerm(const_iterator j) const {
299  return info_(j-begin(), size()).knownOffDiagonal().col(0); }
300 
305  Block::OffDiagonal::ColXpr linearTerm(iterator j) {
306  return info_(j-begin(), size()).knownOffDiagonal().col(0); }
307 
310  constBlock::OffDiagonal::ColXpr linearTerm() const {
311  return info_.range(0, this->size(), this->size(), this->size() + 1).knownOffDiagonal().col(0); }
312 
315  Block::OffDiagonal::ColXpr linearTerm() {
316  return info_.range(0, this->size(), this->size(), this->size() + 1).knownOffDiagonal().col(0); }
317 
333  virtual Matrix augmentedInformation() const;
334 
338  virtual Matrix information() const;
339 
341  virtual VectorValues hessianDiagonal() const;
342 
343  /* ************************************************************************* */
344  virtual void hessianDiagonal(double* d) const;
345 
347  virtual std::map<Key,Matrix> hessianBlockDiagonal() const;
348 
354  virtual std::pair<Matrix, Vector> jacobian() const;
355 
361  virtual Matrix augmentedJacobian() const;
362 
364  const SymmetricBlockMatrix& matrixObject() const { return info_; }
365 
371  void updateATA(const JacobianFactor& update, const Scatter& scatter);
372 
378  void updateATA(const HessianFactor& update, const Scatter& scatter);
379 
381  void multiplyHessianAdd(double alpha, const VectorValues& x, VectorValues& y) const;
382 
383  void multiplyHessianAdd(double alpha, const double* x, double* y, std::vector<size_t> keys) const;
384 
385  void multiplyHessianAdd(double alpha, const double* x, double* y) const {};
386 
388  VectorValues gradientAtZero() const;
389 
390  virtual void gradientAtZero(double* d) const;
391 
408  friend GTSAM_EXPORT std::pair<boost::shared_ptr<GaussianConditional>, boost::shared_ptr<HessianFactor> >
409  EliminateCholesky(const GaussianFactorGraph& factors, const Ordering& keys);
410 
426  friend GTSAM_EXPORT std::pair<boost::shared_ptr<GaussianConditional>, boost::shared_ptr<GaussianFactor> >
427  EliminatePreferCholesky(const GaussianFactorGraph& factors, const Ordering& keys);
428 
429  private:
430 
432  friend class boost::serialization::access;
433  template<class ARCHIVE>
434  void serialize(ARCHIVE & ar, const unsigned int version) {
435  ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(GaussianFactor);
436  ar & BOOST_SERIALIZATION_NVP(info_);
437  }
438  };
439 
440 }
441 
Scatter is an intermediate data structure used when building a HessianFactor incrementally, to get the keys in the right order.
Definition: HessianFactor.h:60
Definition: FastMap.h:37
Block::OffDiagonal::ColXpr linearTerm()
Return the complete linear term as described above.
Definition: HessianFactor.h:315
Access to matrices via blocks of pre-defined sizes.
double constantTerm() const
Return the constant term as described above.
Definition: HessianFactor.h:287
virtual bool empty() const
Check if the factor is empty.
Definition: HessianFactor.h:246
A Gaussian factor using the canonical parameters (information form)
Definition: HessianFactor.h:131
Block::OffDiagonal::ColXpr linearTerm(iterator j)
Return the part of linear term as described above corresponding to the requested variable...
Definition: HessianFactor.h:305
const SymmetricBlockMatrix & matrixObject() const
Return the full augmented Hessian matrix of this factor as a SymmetricBlockMatrix object...
Definition: HessianFactor.h:364
virtual GaussianFactor::shared_ptr clone() const
Clone this HessianFactor.
Definition: HessianFactor.h:215
SymmetricBlockMatrix::constBlock info() const
Return the upper-triangular part of the full augmented information matrix, as described above...
Definition: HessianFactor.h:276
A Gaussian factor in the squared-error form.
Definition: JacobianFactor.h:82
virtual ~HessianFactor()
Destructor.
Definition: HessianFactor.h:212
GaussianFactor Base
Typedef to base class.
Definition: HessianFactor.h:138
SymmetricBlockMatrix::constBlock constBlock
A block from the Hessian matrix (const version)
Definition: HessianFactor.h:142
constBlock::OffDiagonal::ColXpr linearTerm() const
Return the complete linear term as described above.
Definition: HessianFactor.h:310
void print(const Matrix &A, const string &s, ostream &stream)
print a matrix
Definition: Matrix.cpp:183
A thin wrapper around std::map that uses boost's fast_pool_allocator.
SymmetricBlockMatrix info_
The full augmented information matrix, s.t. the quadratic error is 0.5*[x -1]'H[x -1]...
Definition: HessianFactor.h:134
A factor with a quadratic error function - a Gaussian.
A matrix expression that references a single block of a SymmetricBlockMatrix.
Definition: SymmetricBlockMatrixBlockExpr.h:22
void multiplyHessianAdd(double alpha, const double *x, double *y) const
y += alpha * A'*A*x
Definition: HessianFactor.h:385
Template to create a binary predicate.
Definition: Testable.h:102
HessianFactor This
Typedef to this class.
Definition: HessianFactor.h:139
size_t Key
Integer nonlinear key type.
Definition: types.h:59
SymmetricBlockMatrix::Block info()
Return the upper-triangular part of the full augmented information matrix, as described above...
Definition: HessianFactor.h:282
ptrdiff_t DenseIndex
The index type for Eigen objects.
Definition: types.h:74
virtual DenseIndex getDim(const_iterator variable) const
0.5*[x -1]'H[x -1] (also see constructor documentation)
Definition: HessianFactor.h:233
boost::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactor.h:39
constBlock::OffDiagonal::ColXpr linearTerm(const_iterator j) const
Return the part of linear term as described above corresponding to the requested variable...
Definition: HessianFactor.h:298
FastVector< Key >::iterator iterator
Iterator over keys.
Definition: Factor.h:61
Block info(iterator j1, iterator j2)
Return a view of the block at (j1,j2) of the upper-triangular part of the information matrix ...
Definition: HessianFactor.h:270
This class represents a collection of vector-valued variables associated each with a unique integer i...
Definition: VectorValues.h:89
Definition: SymmetricBlockMatrix.h:40
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition: GaussianFactorGraph.h:65
Definition: Ordering.h:30
size_t rows() const
Return the number of columns and rows of the Hessian matrix, including the information vector...
Definition: HessianFactor.h:236
Contains the HessianFactor class, a general quadratic factor.
One SlotEntry stores the slot index for a variable, as well its dimension.
Definition: HessianFactor.h:47
constBlock info(const_iterator j1, const_iterator j2) const
Return a view of the block at (j1,j2) of the upper-triangular part of the information matrix ...
Definition: HessianFactor.h:258
SymmetricBlockMatrix::Block Block
A block from the Hessian matrix.
Definition: HessianFactor.h:141
double & constantTerm()
Return the constant term as described above.
Definition: HessianFactor.h:292
A thin wrapper around std::vector that uses boost's pool_allocator.
boost::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: types.h:62
FastVector< Key >::const_iterator const_iterator
Const iterator over keys.
Definition: Factor.h:64
boost::shared_ptr< This > shared_ptr
A shared_ptr to this class.
Definition: HessianFactor.h:140
An abstract virtual base class for JacobianFactor and HessianFactor.
Definition: GaussianFactor.h:35