gtsam
Loading...
Searching...
No Matches
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
17
18#pragma once
19
20#include <gtsam/config.h>
21
22#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V43
23
24#include <vector>
25#include <gtsam_unstable/dllexport.h>
29
30namespace gtsam {
31
37class GTSAM_UNSTABLE_EXPORT LinearizedGaussianFactor : public NonlinearFactor {
38public:
40 typedef NonlinearFactor Base;
41 typedef LinearizedGaussianFactor This;
42
44 typedef std::shared_ptr<LinearizedGaussianFactor> shared_ptr;
45
46protected:
47
49 Values lin_points_;
50
51public:
52
54 LinearizedGaussianFactor() = default;
55
60 LinearizedGaussianFactor(const GaussianFactor::shared_ptr& gaussian, const Values& lin_points);
61
62 ~LinearizedGaussianFactor() override = default;
63
64 // access functions
65 const Values& linearizationPoint() const { return lin_points_; }
66
67private:
68#if GTSAM_ENABLE_BOOST_SERIALIZATION
70 friend class boost::serialization::access;
71 template<class ARCHIVE>
72 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
73 ar & boost::serialization::make_nvp("LinearizedGaussianFactor",
74 boost::serialization::base_object<Base>(*this));
75 ar & BOOST_SERIALIZATION_NVP(lin_points_);
76 }
77#endif
78
79};
80
86class GTSAM_UNSTABLE_EXPORT LinearizedJacobianFactor : public LinearizedGaussianFactor {
87
88public:
90 typedef LinearizedGaussianFactor Base;
91 typedef LinearizedJacobianFactor This;
92
94 typedef std::shared_ptr<LinearizedJacobianFactor> shared_ptr;
95
96 typedef VerticalBlockMatrix::Block ABlock;
97 typedef VerticalBlockMatrix::constBlock constABlock;
98 typedef VerticalBlockMatrix::Block::ColXpr BVector;
99 typedef VerticalBlockMatrix::constBlock::ConstColXpr constBVector;
100
101protected:
102
103// // store components of a jacobian factor
104// typedef std::map<Key, Matrix> KeyMatrixMap;
105// KeyMatrixMap matrices_;
106// Vector b_;
107
108 VerticalBlockMatrix Ab_; // the block view of the full matrix
109
110public:
111
113 LinearizedJacobianFactor();
114
119 LinearizedJacobianFactor(const JacobianFactor::shared_ptr& jacobian, const Values& lin_points);
120
121 ~LinearizedJacobianFactor() override {}
122
124 gtsam::NonlinearFactor::shared_ptr clone() const override {
125 return std::static_pointer_cast<gtsam::NonlinearFactor>(
126 gtsam::NonlinearFactor::shared_ptr(new This(*this))); }
127
128 // Testable
129
131 void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override;
132
134 bool equals(const NonlinearFactor& expected, double tol = 1e-9) const override;
135
136 // access functions
137 const constBVector b() const { return Ab_(size()).col(0); }
138 const constABlock A() const { return Ab_.range(0, size()); }
139 const constABlock A(Key key) const { return Ab_(std::find(begin(), end(), key) - begin()); }
140
142 size_t dim() const override { return Ab_.rows(); }
143
145 double error(const Values& c) const override;
146
152 std::shared_ptr<GaussianFactor> linearize(const Values& c) const override;
153
155 Vector error_vector(const Values& c) const;
156
157private:
158#if GTSAM_ENABLE_BOOST_SERIALIZATION
159 friend class boost::serialization::access;
161 template<class ARCHIVE>
162 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
163 ar & boost::serialization::make_nvp("LinearizedJacobianFactor",
164 boost::serialization::base_object<Base>(*this));
165 ar & BOOST_SERIALIZATION_NVP(Ab_);
166 }
167#endif
168};
169
171template<>
172struct traits<LinearizedJacobianFactor> : public Testable<LinearizedJacobianFactor> {
173};
174
180class GTSAM_UNSTABLE_EXPORT LinearizedHessianFactor : public LinearizedGaussianFactor {
181
182public:
184 typedef LinearizedGaussianFactor Base;
185 typedef LinearizedHessianFactor This;
186
188 typedef std::shared_ptr<LinearizedHessianFactor> shared_ptr;
189
191 typedef SymmetricBlockMatrix::Block Block;
192 typedef SymmetricBlockMatrix::constBlock constBlock;
193
194 typedef SymmetricBlockMatrix::Block::ColXpr Column;
195 typedef SymmetricBlockMatrix::constBlock::ColXpr constColumn;
196
197protected:
198
199 SymmetricBlockMatrix info_;
201
202public:
203
205 LinearizedHessianFactor();
206
212 LinearizedHessianFactor(const HessianFactor::shared_ptr& hessian, const Values& lin_points);
213
214 ~LinearizedHessianFactor() override {}
215
217 gtsam::NonlinearFactor::shared_ptr clone() const override {
218 return std::static_pointer_cast<gtsam::NonlinearFactor>(
219 gtsam::NonlinearFactor::shared_ptr(new This(*this))); }
220
221 // Testable
222
224 void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override;
225
227 bool equals(const NonlinearFactor& expected, double tol = 1e-9) const override;
228
232 double constantTerm() const {
233 const auto block = info_.diagonalBlock(size());
234 return block(0, 0);
235 }
236
241 constColumn linearTerm(const_iterator j) const {
242 return info_.aboveDiagonalRange(j - begin(), size(), size(), size() + 1).col(0);
243 }
244
247 constColumn linearTerm() const {
248 return info_.aboveDiagonalRange(0, size(), size(), size() + 1).col(0);
249 }
250
261 Matrix squaredTerm(const_iterator j1, const_iterator j2) const {
262 const DenseIndex J1 = j1 - begin();
263 const DenseIndex J2 = j2 - begin();
264 return info_.block(J1, J2);
265 }
266
271 Eigen::SelfAdjointView<constBlock, Eigen::Upper> squaredTerm() const {
272 return info_.selfadjointView(0, size());
273 }
274
276 size_t dim() const override { return info_.rows() - 1; }
277
279 double error(const Values& c) const override;
280
286 std::shared_ptr<GaussianFactor> linearize(const Values& c) const override;
287
288private:
290#if GTSAM_ENABLE_BOOST_SERIALIZATION
291 friend class boost::serialization::access;
292 template<class ARCHIVE>
293 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
294 ar & boost::serialization::make_nvp("LinearizedHessianFactor",
295 boost::serialization::base_object<Base>(*this));
296 ar & BOOST_SERIALIZATION_NVP(info_);
297 }
298#endif
299};
300
302template<>
303struct traits<LinearizedHessianFactor> : public Testable<LinearizedHessianFactor> {
304};
305
306} // \namespace aspn
307
308#endif // GTSAM_ALLOW_DEPRECATED_SINCE_V43
Contains the HessianFactor class, a general quadratic factor.
Non-linear factor base classes.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
ptrdiff_t DenseIndex
The index type for Eigen objects.
Definition types.h:49
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
A helper that implements the traits interface for GTSAM types.
Definition Testable.h:152
Nonlinear factor base class.
Definition NonlinearFactor.h:70