GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
LinearizedFactor.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 #pragma once
19 
20 #include <vector>
21 #include <gtsam_unstable/dllexport.h>
25 
26 namespace gtsam {
27 
31 class GTSAM_UNSTABLE_EXPORT LinearizedGaussianFactor : public NonlinearFactor {
32 public:
36 
38  typedef std::shared_ptr<LinearizedGaussianFactor> shared_ptr;
39 
40 protected:
41 
44 
45 public:
46 
49 
54  LinearizedGaussianFactor(const GaussianFactor::shared_ptr& gaussian, const Values& lin_points);
55 
56  ~LinearizedGaussianFactor() override {};
57 
58  // access functions
59  const Values& linearizationPoint() const { return lin_points_; }
60 
61 private:
62 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
63 
64  friend class boost::serialization::access;
65  template<class ARCHIVE>
66  void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
67  ar & boost::serialization::make_nvp("LinearizedGaussianFactor",
68  boost::serialization::base_object<Base>(*this));
69  ar & BOOST_SERIALIZATION_NVP(lin_points_);
70  }
71 #endif
72 
73 };
74 
79 class GTSAM_UNSTABLE_EXPORT LinearizedJacobianFactor : public LinearizedGaussianFactor {
80 
81 public:
85 
87  typedef std::shared_ptr<LinearizedJacobianFactor> shared_ptr;
88 
89  typedef VerticalBlockMatrix::Block ABlock;
90  typedef VerticalBlockMatrix::constBlock constABlock;
91  typedef VerticalBlockMatrix::Block::ColXpr BVector;
92  typedef VerticalBlockMatrix::constBlock::ConstColXpr constBVector;
93 
94 protected:
95 
96 // // store components of a jacobian factor
97 // typedef std::map<Key, Matrix> KeyMatrixMap;
98 // KeyMatrixMap matrices_;
99 // Vector b_;
100 
101  VerticalBlockMatrix Ab_; // the block view of the full matrix
102 
103 public:
104 
107 
112  LinearizedJacobianFactor(const JacobianFactor::shared_ptr& jacobian, const Values& lin_points);
113 
114  ~LinearizedJacobianFactor() override {}
115 
117  gtsam::NonlinearFactor::shared_ptr clone() const override {
118  return std::static_pointer_cast<gtsam::NonlinearFactor>(
119  gtsam::NonlinearFactor::shared_ptr(new This(*this))); }
120 
121  // Testable
122 
124  void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override;
125 
127  bool equals(const NonlinearFactor& expected, double tol = 1e-9) const override;
128 
129  // access functions
130  const constBVector b() const { return Ab_(size()).col(0); }
131  const constABlock A() const { return Ab_.range(0, size()); };
132  const constABlock A(Key key) const { return Ab_(std::find(begin(), end(), key) - begin()); }
133 
135  size_t dim() const override { return Ab_.rows(); };
136 
138  double error(const Values& c) const override;
139 
145  std::shared_ptr<GaussianFactor> linearize(const Values& c) const override;
146 
148  Vector error_vector(const Values& c) const;
149 
150 private:
151 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
152  friend class boost::serialization::access;
154  template<class ARCHIVE>
155  void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
156  ar & boost::serialization::make_nvp("LinearizedJacobianFactor",
157  boost::serialization::base_object<Base>(*this));
158  ar & BOOST_SERIALIZATION_NVP(Ab_);
159  }
160 #endif
161 };
162 
164 template<>
165 struct traits<LinearizedJacobianFactor> : public Testable<LinearizedJacobianFactor> {
166 };
167 
172 class GTSAM_UNSTABLE_EXPORT LinearizedHessianFactor : public LinearizedGaussianFactor {
173 
174 public:
178 
180  typedef std::shared_ptr<LinearizedHessianFactor> shared_ptr;
181 
183  typedef SymmetricBlockMatrix::Block Block;
184  typedef SymmetricBlockMatrix::constBlock constBlock;
185 
186  typedef SymmetricBlockMatrix::Block::ColXpr Column;
187  typedef SymmetricBlockMatrix::constBlock::ColXpr constColumn;
188 
189 protected:
190 
192 
194 public:
195 
198 
204  LinearizedHessianFactor(const HessianFactor::shared_ptr& hessian, const Values& lin_points);
205 
206  ~LinearizedHessianFactor() override {}
207 
209  gtsam::NonlinearFactor::shared_ptr clone() const override {
210  return std::static_pointer_cast<gtsam::NonlinearFactor>(
211  gtsam::NonlinearFactor::shared_ptr(new This(*this))); }
212 
213  // Testable
214 
216  void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override;
217 
219  bool equals(const NonlinearFactor& expected, double tol = 1e-9) const override;
220 
224  double constantTerm() const {
225  const auto block = info_.diagonalBlock(size());
226  return block(0, 0);
227  }
228 
233  constColumn linearTerm(const_iterator j) const {
234  return info_.aboveDiagonalRange(j - begin(), size(), size(), size() + 1).col(0);
235  }
236 
239  constColumn linearTerm() const {
240  return info_.aboveDiagonalRange(0, size(), size(), size() + 1).col(0);
241  }
242 
254  const DenseIndex J1 = j1 - begin();
255  const DenseIndex J2 = j2 - begin();
256  return info_.block(J1, J2);
257  }
258 
263  Eigen::SelfAdjointView<constBlock, Eigen::Upper> squaredTerm() const {
264  return info_.selfadjointView(0, size());
265  }
266 
268  size_t dim() const override { return info_.rows() - 1; }
269 
271  double error(const Values& c) const override;
272 
278  std::shared_ptr<GaussianFactor> linearize(const Values& c) const override;
279 
280 private:
282 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
283  friend class boost::serialization::access;
284  template<class ARCHIVE>
285  void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
286  ar & boost::serialization::make_nvp("LinearizedHessianFactor",
287  boost::serialization::base_object<Base>(*this));
288  ar & BOOST_SERIALIZATION_NVP(info_);
289  }
290 #endif
291 };
292 
294 template<>
295 struct traits<LinearizedHessianFactor> : public Testable<LinearizedHessianFactor> {
296 };
297 
298 } // \namespace aspn
NonlinearFactor Base
Definition: LinearizedFactor.h:34
std::shared_ptr< This > shared_ptr
A shared_ptr to this class.
Definition: HessianFactor.h:109
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
Definition: LinearizedFactor.h:79
Definition: VerticalBlockMatrix.h:42
constBlock aboveDiagonalRange(DenseIndex i_startBlock, DenseIndex i_endBlock, DenseIndex j_startBlock, DenseIndex j_endBlock) const
Get a range [i,j) from the matrix. Indices are in block units.
Definition: SymmetricBlockMatrix.h:172
Values lin_points_
Definition: LinearizedFactor.h:43
Definition: Factor.h:69
DenseIndex rows() const
Row size.
Definition: VerticalBlockMatrix.h:115
Definition: Testable.h:152
Definition: Group.h:43
Definition: NonlinearFactor.h:68
constColumn linearTerm() const
Definition: LinearizedFactor.h:239
size_t dim() const override
Definition: LinearizedFactor.h:268
ptrdiff_t DenseIndex
The index type for Eigen objects.
Definition: types.h:108
constColumn linearTerm(const_iterator j) const
Definition: LinearizedFactor.h:233
Definition: LinearizedFactor.h:172
LinearizedGaussianFactor Base
Definition: LinearizedFactor.h:83
std::shared_ptr< LinearizedJacobianFactor > shared_ptr
Definition: LinearizedFactor.h:87
Definition: SymmetricBlockMatrix.h:53
SymmetricBlockMatrix::Block::ColXpr Column
A column containing the linear term h.
Definition: LinearizedFactor.h:186
Definition: Testable.h:112
Eigen::SelfAdjointView< constBlock, Eigen::Upper > selfadjointView(DenseIndex I, DenseIndex J) const
Return the square sub-matrix that contains blocks(i:j, i:j).
Definition: SymmetricBlockMatrix.h:158
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition: LinearizedFactor.h:209
DenseIndex rows() const
Row size.
Definition: SymmetricBlockMatrix.h:116
std::shared_ptr< LinearizedGaussianFactor > shared_ptr
Definition: LinearizedFactor.h:38
size_t dim() const override
Definition: LinearizedFactor.h:135
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
Contains the HessianFactor class, a general quadratic factor.
Matrix squaredTerm(const_iterator j1, const_iterator j2) const
Definition: LinearizedFactor.h:253
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: JacobianFactor.h:97
Definition: Values.h:65
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::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianFactor.h:42
Block range(DenseIndex startBlock, DenseIndex endBlock)
Definition: VerticalBlockMatrix.h:130
Definition: chartTesting.h:28
Definition: LinearizedFactor.h:31
Non-linear factor base classes.
Eigen::SelfAdjointView< constBlock, Eigen::Upper > squaredTerm() const
Definition: LinearizedFactor.h:263
double constantTerm() const
Definition: LinearizedFactor.h:224
SymmetricBlockMatrix::Block Block
A block from the Hessian matrix.
Definition: LinearizedFactor.h:183
SymmetricBlockMatrix::constBlock::ColXpr constColumn
A column containing the linear term h (const version)
Definition: LinearizedFactor.h:187
Eigen::SelfAdjointView< Block, Eigen::Upper > diagonalBlock(DenseIndex J)
Return the J&#39;th diagonal block as a self adjoint view.
Definition: SymmetricBlockMatrix.h:137
KeyVector::const_iterator const_iterator
Const iterator over keys.
Definition: Factor.h:82
SymmetricBlockMatrix::constBlock constBlock
A block from the Hessian matrix (const version)
Definition: LinearizedFactor.h:184
std::shared_ptr< LinearizedHessianFactor > shared_ptr
Definition: LinearizedFactor.h:180
SymmetricBlockMatrix info_
Definition: LinearizedFactor.h:191
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
Matrix block(DenseIndex I, DenseIndex J) const
LinearizedGaussianFactor Base
Definition: LinearizedFactor.h:176
LinearizedGaussianFactor()
Definition: LinearizedFactor.h:48
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition: LinearizedFactor.h:117