gtsam
Loading...
Searching...
No Matches
NoiseModel.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
21#include <gtsam/base/Manifold.h>
22#include <gtsam/base/Matrix.h>
24#include <gtsam/base/Testable.h>
25#include <gtsam/base/std_optional_serialization.h>
26#include <gtsam/dllexport.h>
27#include <gtsam/linear/LossFunctions.h>
28
29#if GTSAM_ENABLE_BOOST_SERIALIZATION
30#include <boost/serialization/nvp.hpp>
31#include <boost/serialization/extended_type_info.hpp>
32#include <boost/serialization/singleton.hpp>
33#include <boost/serialization/shared_ptr.hpp>
34#endif
35
36#include <optional>
37#include <type_traits>
38
39namespace gtsam {
40
42 namespace noiseModel {
43
44 // Forward declaration
45 class Gaussian;
46 class Diagonal;
47 class Constrained;
48 class Isotropic;
49 class Unit;
50 class RobustModel;
51
52 //---------------------------------------------------------------------------------------
53
60 class GTSAM_EXPORT Base {
61
62 public:
63 typedef std::shared_ptr<Base> shared_ptr;
64
65 protected:
66
67 size_t dim_;
68
69 public:
70
72 Base(size_t dim = 1):dim_(dim) {}
73 virtual ~Base() {}
74
76 virtual bool isConstrained() const { return false; } // default false
77
79 virtual bool isUnit() const { return false; } // default false
80
82 inline size_t dim() const { return dim_;}
83
84 virtual void print(const std::string& name = "") const = 0;
85
86 virtual bool equals(const Base& expected, double tol=1e-9) const = 0;
87
89 virtual Vector sigmas() const;
90
92 virtual Vector whiten(const Vector& v) const = 0;
93
95 virtual Matrix Whiten(const Matrix& H) const = 0;
96
98 virtual Vector unwhiten(const Vector& v) const = 0;
99
101 virtual double squaredMahalanobisDistance(const Vector& v) const;
102
104 virtual double mahalanobisDistance(const Vector& v) const {
105 return std::sqrt(squaredMahalanobisDistance(v));
106 }
107
109 virtual double loss(const double squared_distance) const {
110 return 0.5 * squared_distance;
111 }
112
119 virtual double loss(const Vector& v) const {
121 }
122
123 virtual void WhitenSystem(std::vector<Matrix>& A, Vector& b) const = 0;
124 virtual void WhitenSystem(Matrix& A, Vector& b) const = 0;
125 virtual void WhitenSystem(Matrix& A1, Matrix& A2, Vector& b) const = 0;
126 virtual void WhitenSystem(Matrix& A1, Matrix& A2, Matrix& A3, Vector& b) const = 0;
127
129 virtual void whitenInPlace(Vector& v) const {
130 v = whiten(v);
131 }
132
134 virtual void unwhitenInPlace(Vector& v) const {
135 v = unwhiten(v);
136 }
137
139 virtual void whitenInPlace(Eigen::Block<Vector>& v) const {
140 v = whiten(v);
141 }
142
144 virtual void unwhitenInPlace(Eigen::Block<Vector>& v) const {
145 v = unwhiten(v);
146 }
147
149 virtual Vector unweightedWhiten(const Vector& v) const {
150 return whiten(v);
151 }
152
154 virtual double weight(const Vector& v) const { return 1.0; }
155
156 private:
157#if GTSAM_ENABLE_BOOST_SERIALIZATION
159 friend class boost::serialization::access;
160 template<class ARCHIVE>
161 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
162 ar & BOOST_SERIALIZATION_NVP(dim_);
163 }
164#endif
165 };
166
167 //---------------------------------------------------------------------------------------
169 template <class T>
170 inline bool matchesDimension(const Base& model, const T& measured) {
171 static_assert(IsManifold<T>::value,
172 "noiseModel::matchesDimension requires a manifold type.");
173 if constexpr (traits<T>::dimension == Eigen::Dynamic) {
174 return model.dim() == traits<T>::GetDimension(measured);
175 } else {
176 return model.dim() == static_cast<size_t>(traits<T>::dimension);
177 }
178 }
179
192 class GTSAM_EXPORT Gaussian: public Base {
193
194 protected:
195
197 std::optional<Matrix> sqrt_information_;
198
199 private:
200
204 const Matrix& thisR() const {
205 // should never happen
206 if (!sqrt_information_) throw std::runtime_error("Gaussian: has no R matrix");
207 return *sqrt_information_;
208 }
209
211 virtual double logDetR() const;
212
213 public:
214
215 typedef std::shared_ptr<Gaussian> shared_ptr;
216
218 Gaussian(size_t dim = 1,
219 const std::optional<Matrix>& sqrt_information = {})
220 : Base(dim), sqrt_information_(sqrt_information) {}
221
222 ~Gaussian() override {}
223
229 static shared_ptr SqrtInformation(const Matrix& R, bool smart = true);
230
236 static shared_ptr Information(const Matrix& M, bool smart = true);
237
243 static shared_ptr Covariance(const Matrix& covariance, bool smart = true);
244
245 void print(const std::string& name) const override;
246 bool equals(const Base& expected, double tol=1e-9) const override;
247 Vector sigmas() const override;
248 Vector whiten(const Vector& v) const override;
249 Vector unwhiten(const Vector& v) const override;
250 void unwhitenInPlace(Vector& v) const override;
251 void unwhitenInPlace(Eigen::Block<Vector>& v) const override;
252
257 Matrix Whiten(const Matrix& H) const override;
258
262 virtual void WhitenInPlace(Matrix& H) const;
263
267 virtual void WhitenInPlace(Eigen::Block<Matrix> H) const;
268
272 void WhitenSystem(std::vector<Matrix>& A, Vector& b) const override;
273 void WhitenSystem(Matrix& A, Vector& b) const override;
274 void WhitenSystem(Matrix& A1, Matrix& A2, Vector& b) const override;
275 void WhitenSystem(Matrix& A1, Matrix& A2, Matrix& A3, Vector& b) const override;
276
286 virtual std::shared_ptr<Diagonal> QR(Matrix& Ab) const;
287
289 virtual Matrix R() const { return thisR();}
290
292 virtual Matrix information() const;
293
295 virtual Matrix covariance() const;
296
298 double logDeterminant() const;
299
306 double negLogConstant() const;
307
308 private:
309#if GTSAM_ENABLE_BOOST_SERIALIZATION
311 friend class boost::serialization::access;
312 template<class ARCHIVE>
313 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
314 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
315 ar & BOOST_SERIALIZATION_NVP(sqrt_information_);
316 }
317#endif
318 }; // Gaussian
319
320 //---------------------------------------------------------------------------------------
321
327 class GTSAM_EXPORT Diagonal : public Gaussian {
328 protected:
329
335 Vector sigmas_, invsigmas_, precisions_;
336
338 Diagonal(const Vector& sigmas);
339
341 virtual double logDetR() const override;
342
343 public:
345 Diagonal();
346
347 typedef std::shared_ptr<Diagonal> shared_ptr;
348
349 ~Diagonal() override {}
350
355 static shared_ptr Sigmas(const Vector& sigmas, bool smart = true);
356
363 static shared_ptr Variances(const Vector& variances, bool smart = true);
364
369 static shared_ptr Precisions(const Vector& precisions, bool smart = true);
370
371 void print(const std::string& name) const override;
372 Vector sigmas() const override { return sigmas_; }
374 inline const Vector& sigmasRef() const { return sigmas_; }
375 Vector whiten(const Vector& v) const override;
376 Vector unwhiten(const Vector& v) const override;
377 void whitenInPlace(Vector& v) const override;
378 void unwhitenInPlace(Vector& v) const override;
379 Matrix Whiten(const Matrix& H) const override;
380 void WhitenInPlace(Matrix& H) const override;
381 void WhitenInPlace(Eigen::Block<Matrix> H) const override;
382 void whitenInPlace(Eigen::Block<Vector>& v) const override;
383 void unwhitenInPlace(Eigen::Block<Vector>& v) const override;
384
388 inline double sigma(size_t i) const { return sigmas_(i); }
389
393 inline const Vector& invsigmas() const { return invsigmas_; }
394 inline double invsigma(size_t i) const {return invsigmas_(i);}
395
399 inline const Vector& precisions() const { return precisions_; }
400 inline double precision(size_t i) const {return precisions_(i);}
401
405 Matrix R() const override {
406 return invsigmas().asDiagonal();
407 }
408
409 private:
410#if GTSAM_ENABLE_BOOST_SERIALIZATION
412 friend class boost::serialization::access;
413 template<class ARCHIVE>
414 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
415 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Gaussian);
416 ar & BOOST_SERIALIZATION_NVP(sigmas_);
417 ar & BOOST_SERIALIZATION_NVP(invsigmas_);
418 }
419#endif
420 }; // Diagonal
421
422 //---------------------------------------------------------------------------------------
423
436 class GTSAM_EXPORT Constrained : public Diagonal {
437 protected:
438
439 // Sigmas are contained in the base class
440 Vector mu_;
441
447 Constrained(const Vector& mu, const Vector& sigmas);
448
449 public:
450
451 typedef std::shared_ptr<Constrained> shared_ptr;
452
459 Constrained(const Vector& sigmas = Z_1x1);
460
461 ~Constrained() override {}
462
464 bool isConstrained() const override { return true; }
465
467 bool constrained(size_t i) const;
468
470 const Vector& mu() const { return mu_; }
471
476 static shared_ptr MixedSigmas(const Vector& mu, const Vector& sigmas);
477
482 static shared_ptr MixedSigmas(const Vector& sigmas);
483
488 static shared_ptr MixedSigmas(double m, const Vector& sigmas);
489
494 static shared_ptr MixedVariances(const Vector& mu, const Vector& variances);
495 static shared_ptr MixedVariances(const Vector& variances);
496
501 static shared_ptr MixedPrecisions(const Vector& mu, const Vector& precisions);
502 static shared_ptr MixedPrecisions(const Vector& precisions);
503
509 double squaredMahalanobisDistance(const Vector& v) const override;
510
512 static shared_ptr All(size_t dim) {
513 return shared_ptr(new Constrained(Vector::Constant(dim, 1000.0), Vector::Constant(dim,0)));
514 }
515
517 static shared_ptr All(size_t dim, const Vector& mu) {
518 return shared_ptr(new Constrained(mu, Vector::Constant(dim,0)));
519 }
520
522 static shared_ptr All(size_t dim, double mu) {
523 return shared_ptr(new Constrained(Vector::Constant(dim, mu), Vector::Constant(dim,0)));
524 }
525
526 void print(const std::string& name) const override;
527
529 Vector whiten(const Vector& v) const override;
530 void whitenInPlace(Vector& v) const override;
531 void whitenInPlace(Eigen::Block<Vector>& v) const override;
532
535 Matrix Whiten(const Matrix& H) const override;
536 void WhitenInPlace(Matrix& H) const override;
537 void WhitenInPlace(Eigen::Block<Matrix> H) const override;
538
543 Matrix informationFromA(const Matrix& A) const;
544
554 Diagonal::shared_ptr QR(Matrix& Ab) const override;
555
560 shared_ptr unit() const;
561
562 private:
563#if GTSAM_ENABLE_BOOST_SERIALIZATION
565 friend class boost::serialization::access;
566 template<class ARCHIVE>
567 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
568 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Diagonal);
569 ar & BOOST_SERIALIZATION_NVP(mu_);
570 }
571#endif
572
573 }; // Constrained
574
575 //---------------------------------------------------------------------------------------
576
581 class GTSAM_EXPORT Isotropic : public Diagonal {
582 protected:
583 double sigma_, invsigma_;
584
586 Isotropic(size_t dim, double sigma) :
587 Diagonal(Vector::Constant(dim, sigma)),sigma_(sigma),invsigma_(1.0/sigma) {}
588
590 virtual double logDetR() const override;
591
592 public:
593
594 /* dummy constructor to allow for serialization */
595 Isotropic() : Diagonal(Vector1::Constant(1.0)),sigma_(1.0),invsigma_(1.0) {}
596
597 ~Isotropic() override {}
598
599 typedef std::shared_ptr<Isotropic> shared_ptr;
600
604 static shared_ptr Sigma(size_t dim, double sigma, bool smart = true);
605
612 static shared_ptr Variance(size_t dim, double variance, bool smart = true);
613
617 static shared_ptr Precision(size_t dim, double precision, bool smart = true) {
618 return Variance(dim, 1.0/precision, smart);
619 }
620
621 void print(const std::string& name) const override;
622 double squaredMahalanobisDistance(const Vector& v) const override;
623 Vector whiten(const Vector& v) const override;
624 Vector unwhiten(const Vector& v) const override;
625 Matrix Whiten(const Matrix& H) const override;
626 void WhitenInPlace(Matrix& H) const override;
627 void whitenInPlace(Vector& v) const override;
628 void WhitenInPlace(Eigen::Block<Matrix> H) const override;
629 void unwhitenInPlace(Vector& v) const override;
630 void unwhitenInPlace(Eigen::Block<Vector>& v) const override;
631
635 inline double sigma() const { return sigma_; }
636
637 private:
638#if GTSAM_ENABLE_BOOST_SERIALIZATION
640 friend class boost::serialization::access;
641 template<class ARCHIVE>
642 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
643 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Diagonal);
644 ar & BOOST_SERIALIZATION_NVP(sigma_);
645 ar & BOOST_SERIALIZATION_NVP(invsigma_);
646 }
647#endif
648
649 };
650
651 //---------------------------------------------------------------------------------------
652
656 class GTSAM_EXPORT Unit : public Isotropic {
657 protected:
659 virtual double logDetR() const override;
660
661 public:
662
663 typedef std::shared_ptr<Unit> shared_ptr;
664
666 Unit(size_t dim=1): Isotropic(dim,1.0) {}
667
668 ~Unit() override {}
669
673 static shared_ptr Create(size_t dim) {
674 return shared_ptr(new Unit(dim));
675 }
676
681 template <class T, std::enable_if_t<!std::is_integral_v<T>, int> = 0>
682 static shared_ptr Create(const T& measured) {
683 static_assert(IsManifold<T>::value,
684 "noiseModel::Unit::Create requires a manifold type.");
685 if constexpr (traits<T>::dimension == Eigen::Dynamic) {
686 return Create(traits<T>::GetDimension(measured));
687 } else {
688 static const shared_ptr kDefault =
689 Create(static_cast<size_t>(traits<T>::dimension));
690 return kDefault;
691 }
692 }
693
695 bool isUnit() const override { return true; }
696
697 void print(const std::string& name) const override;
698 double squaredMahalanobisDistance(const Vector& v) const override;
699 Vector whiten(const Vector& v) const override { return v; }
700 Vector unwhiten(const Vector& v) const override { return v; }
701 Matrix Whiten(const Matrix& H) const override { return H; }
702 void WhitenInPlace(Matrix& /*H*/) const override {}
703 void WhitenInPlace(Eigen::Block<Matrix> /*H*/) const override {}
704 void whitenInPlace(Vector& /*v*/) const override {}
705 void unwhitenInPlace(Vector& /*v*/) const override {}
706 void whitenInPlace(Eigen::Block<Vector>& /*v*/) const override {}
707 void unwhitenInPlace(Eigen::Block<Vector>& /*v*/) const override {}
708
709 private:
710#if GTSAM_ENABLE_BOOST_SERIALIZATION
712 friend class boost::serialization::access;
713 template<class ARCHIVE>
714 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
715 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Isotropic);
716 }
717#endif
718 };
719
740 class GTSAM_EXPORT Robust : public Base {
741 public:
742 typedef std::shared_ptr<Robust> shared_ptr;
743
744 protected:
745 typedef mEstimator::Base RobustModel;
746 typedef noiseModel::Base NoiseModel;
747
748 const RobustModel::shared_ptr robust_;
749 const NoiseModel::shared_ptr noise_;
750
751 public:
752
755
757 Robust(const RobustModel::shared_ptr robust, const NoiseModel::shared_ptr noise)
758 : Base(noise->dim()), robust_(robust), noise_(noise) {}
759
761 ~Robust() override {}
762
763 void print(const std::string& name) const override;
764 bool equals(const Base& expected, double tol=1e-9) const override;
765
767 const RobustModel::shared_ptr& robust() const { return robust_; }
768
770 const NoiseModel::shared_ptr& noise() const { return noise_; }
771
772 // Functions below are dummy but necessary for the noiseModel::Base
773 inline Vector whiten(const Vector& v) const override
774 { Vector r = v; this->WhitenSystem(r); return r; }
775 inline Matrix Whiten(const Matrix& A) const override
776 { Vector b; Matrix B=A; this->WhitenSystem(B,b); return B; }
777 inline Vector unwhiten(const Vector& /*v*/) const override
778 { throw std::invalid_argument("unwhiten is not currently supported for robust noise models."); }
779 inline void whitenInPlace(Vector& v) const override { this->WhitenSystem(v); }
784 double loss(const double squared_distance) const override {
785 return robust_->loss(std::sqrt(squared_distance));
786 }
787
794 double loss(const Vector& v) const override;
795
796 // NOTE: This is special because in whiten the base version will do the re-weighting
797 // which is incorrect!
798 double squaredMahalanobisDistance(const Vector& v) const override {
799 return noise_->squaredMahalanobisDistance(v);
800 }
801
802 // These are really robust iterated re-weighting support functions
803 virtual void WhitenSystem(Vector& b) const;
804 void WhitenSystem(std::vector<Matrix>& A, Vector& b) const override;
805 void WhitenSystem(Matrix& A, Vector& b) const override;
806 void WhitenSystem(Matrix& A1, Matrix& A2, Vector& b) const override;
807 void WhitenSystem(Matrix& A1, Matrix& A2, Matrix& A3, Vector& b) const override;
808
809 Vector unweightedWhiten(const Vector& v) const override;
810 double weight(const Vector& v) const override;
811
812 static shared_ptr Create(
813 const RobustModel::shared_ptr &robust, const NoiseModel::shared_ptr noise);
814
815 private:
816#if GTSAM_ENABLE_BOOST_SERIALIZATION
818 friend class boost::serialization::access;
819 template<class ARCHIVE>
820 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
821 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
822 ar & boost::serialization::make_nvp("robust_", const_cast<RobustModel::shared_ptr&>(robust_));
823 ar & boost::serialization::make_nvp("noise_", const_cast<NoiseModel::shared_ptr&>(noise_));
824 }
825#endif
826 };
827
828 // Helper function
829 GTSAM_EXPORT std::optional<Vector> checkIfDiagonal(const Matrix& M);
830
832 template <class T>
833 Base::shared_ptr validOrDefault(const T& value,
834 const Base::shared_ptr& model) {
835 if (!model) return noiseModel::Unit::Create(value);
836 if (noiseModel::matchesDimension(*model, value)) return model;
837 throw std::runtime_error(
838 "noiseModel::validOrDefault: mis-matched model dimension.");
839 }
840
841 } // namespace noiseModel
842
846 typedef noiseModel::Base::shared_ptr SharedNoiseModel;
847 typedef noiseModel::Gaussian::shared_ptr SharedGaussian;
848 typedef noiseModel::Diagonal::shared_ptr SharedDiagonal;
849 typedef noiseModel::Constrained::shared_ptr SharedConstrained;
850 typedef noiseModel::Isotropic::shared_ptr SharedIsotropic;
851
853 template<> struct traits<noiseModel::Gaussian> : public Testable<noiseModel::Gaussian> {};
854 template<> struct traits<noiseModel::Diagonal> : public Testable<noiseModel::Diagonal> {};
855 template<> struct traits<noiseModel::Constrained> : public Testable<noiseModel::Constrained> {};
856 template<> struct traits<noiseModel::Isotropic> : public Testable<noiseModel::Isotropic> {};
857 template<> struct traits<noiseModel::Unit> : public Testable<noiseModel::Unit> {};
858
859} //\ namespace gtsam
typedef and functions to augment Eigen's MatrixXd
Macros for Matrix constants to avoid excessive template instantiation.
Concept check for values that can be used in unit tests.
Base class and basic functions for Manifold types.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
noiseModel::Base::shared_ptr SharedNoiseModel
Aliases.
Definition NoiseModel.h:846
All noise models live in the noiseModel namespace.
Definition LossFunctions.cpp:33
Base::shared_ptr validOrDefault(const T &value, const Base::shared_ptr &model)
Create.
Definition NoiseModel.h:833
bool matchesDimension(const Base &model, const T &measured)
Return true if the model dimension matches the manifold dimension.
Definition NoiseModel.h:170
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
Template to create a binary predicate.
Definition Testable.h:112
A helper that implements the traits interface for GTSAM types.
Definition Testable.h:152
Pure virtual class for all robust error function classes.
Definition LossFunctions.h:81
noiseModel::Base is the abstract base class for all noise models.
Definition NoiseModel.h:60
virtual double loss(const Vector &v) const
Evaluate the loss of an unwhitened residual v.
Definition NoiseModel.h:119
virtual bool isConstrained() const
true if a constrained noise model, saves slow/clumsy dynamic casting
Definition NoiseModel.h:76
virtual void whitenInPlace(Vector &v) const
in-place whiten, override if can be done more efficiently
Definition NoiseModel.h:129
size_t dim() const
Dimensionality.
Definition NoiseModel.h:82
virtual void unwhitenInPlace(Eigen::Block< Vector > &v) const
in-place unwhiten, override if can be done more efficiently
Definition NoiseModel.h:144
virtual void whitenInPlace(Eigen::Block< Vector > &v) const
in-place whiten, override if can be done more efficiently
Definition NoiseModel.h:139
virtual Vector whiten(const Vector &v) const =0
Whiten an error vector.
virtual double mahalanobisDistance(const Vector &v) const
Mahalanobis distance.
Definition NoiseModel.h:104
virtual bool isUnit() const
true if a unit noise model, saves slow/clumsy dynamic casting
Definition NoiseModel.h:79
virtual double weight(const Vector &v) const
get the weight from the effective loss function on residual vector v
Definition NoiseModel.h:154
virtual Vector unweightedWhiten(const Vector &v) const
Useful function for robust noise models to get the unweighted but whitened error.
Definition NoiseModel.h:149
virtual double squaredMahalanobisDistance(const Vector &v) const
Squared Mahalanobis distance v'*R'*R*v = <R*v,R*v>.
Definition NoiseModel.cpp:78
virtual Vector unwhiten(const Vector &v) const =0
Unwhiten an error vector.
virtual double loss(const double squared_distance) const
Loss function, input is squared Mahalanobis distance.
Definition NoiseModel.h:109
virtual void unwhitenInPlace(Vector &v) const
in-place unwhiten, override if can be done more efficiently
Definition NoiseModel.h:134
virtual Matrix Whiten(const Matrix &H) const =0
Whiten a matrix.
Base(size_t dim=1)
primary constructor
Definition NoiseModel.h:72
Gaussian implements the mathematical model |R*x|^2 = |y|^2 with R'*R=inv(Sigma) where y = whiten(x) =...
Definition NoiseModel.h:192
virtual Matrix R() const
Return R itself, but note that Whiten(H) is cheaper than R*H.
Definition NoiseModel.h:289
Gaussian(size_t dim=1, const std::optional< Matrix > &sqrt_information={})
constructor takes square root information matrix
Definition NoiseModel.h:218
std::optional< Matrix > sqrt_information_
Matrix square root of information matrix (R).
Definition NoiseModel.h:197
A diagonal noise model implements a diagonal covariance matrix, with the elements of the diagonal spe...
Definition NoiseModel.h:327
const Vector & sigmasRef() const
Return standard deviations without copying.
Definition NoiseModel.h:374
Matrix R() const override
Return R itself, but note that Whiten(H) is cheaper than R*H.
Definition NoiseModel.h:405
Vector sigmas_
Standard deviations (sigmas), their inverse and inverse square (weights/precisions) These are all com...
Definition NoiseModel.h:335
double sigma(size_t i) const
Return standard deviations (sqrt of diagonal).
Definition NoiseModel.h:388
const Vector & invsigmas() const
Return sqrt precisions.
Definition NoiseModel.h:393
virtual double logDetR() const override
Compute the log of |R|. Used for computing log(|Σ|).
Definition NoiseModel.cpp:367
Vector sigmas() const override
Calculate standard deviations.
Definition NoiseModel.h:372
const Vector & precisions() const
Return precisions.
Definition NoiseModel.h:399
Diagonal(const Vector &sigmas)
constructor to allow for disabling initialization of invsigmas
Definition NoiseModel.cpp:279
A Constrained constrained model is a specialization of Diagonal which allows some or all of the sigma...
Definition NoiseModel.h:436
bool isConstrained() const override
true if a constrained noise mode, saves slow/clumsy dynamic casting
Definition NoiseModel.h:464
static shared_ptr All(size_t dim, const Vector &mu)
Fully constrained variations.
Definition NoiseModel.h:517
static shared_ptr All(size_t dim, double mu)
Fully constrained variations with a mu parameter.
Definition NoiseModel.h:522
static shared_ptr All(size_t dim)
Fully constrained variations.
Definition NoiseModel.h:512
const Vector & mu() const
Access mu as a vector.
Definition NoiseModel.h:470
Constrained(const Vector &mu, const Vector &sigmas)
Constructor that prevents inf values from appearing in invsigmas, while preserving infinite precision...
Definition NoiseModel.cpp:398
Vector mu_
Penalty function weight - needs to be large enough to dominate soft constraints.
Definition NoiseModel.h:440
An isotropic noise model corresponds to a scaled diagonal covariance To construct,...
Definition NoiseModel.h:581
double sigma() const
Return standard deviation.
Definition NoiseModel.h:635
static shared_ptr Precision(size_t dim, double precision, bool smart=true)
An isotropic noise model created by specifying a precision.
Definition NoiseModel.h:617
Isotropic(size_t dim, double sigma)
protected constructor takes sigma
Definition NoiseModel.h:586
static shared_ptr Variance(size_t dim, double variance, bool smart=true)
An isotropic noise model created by specifying a variance = sigma^2.
Definition NoiseModel.cpp:714
Unit: i.i.d.
Definition NoiseModel.h:656
void WhitenInPlace(Eigen::Block< Matrix >) const override
In-place version.
Definition NoiseModel.h:703
Vector unwhiten(const Vector &v) const override
Unwhiten an error vector.
Definition NoiseModel.h:700
void whitenInPlace(Eigen::Block< Vector > &) const override
in-place whiten, override if can be done more efficiently
Definition NoiseModel.h:706
bool isUnit() const override
true if a unit noise model, saves slow/clumsy dynamic casting
Definition NoiseModel.h:695
Unit(size_t dim=1)
constructor for serialization
Definition NoiseModel.h:666
Vector whiten(const Vector &v) const override
Whiten an error vector.
Definition NoiseModel.h:699
static shared_ptr Create(size_t dim)
Create a unit covariance noise model.
Definition NoiseModel.h:673
void unwhitenInPlace(Vector &) const override
in-place unwhiten, override if can be done more efficiently
Definition NoiseModel.h:705
void unwhitenInPlace(Eigen::Block< Vector > &) const override
in-place unwhiten, override if can be done more efficiently
Definition NoiseModel.h:707
void whitenInPlace(Vector &) const override
in-place whiten, override if can be done more efficiently
Definition NoiseModel.h:704
void WhitenInPlace(Matrix &) const override
In-place version.
Definition NoiseModel.h:702
static shared_ptr Create(const T &measured)
Create a unit covariance noise model for a measurement type.
Definition NoiseModel.h:682
virtual double logDetR() const override
Compute the log of |R|. Used for computing log(|Σ|).
Definition NoiseModel.cpp:787
Matrix Whiten(const Matrix &H) const override
Whiten a matrix.
Definition NoiseModel.h:701
const RobustModel::shared_ptr & robust() const
Return the contained robust error function.
Definition NoiseModel.h:767
Robust()
Default Constructor for serialization.
Definition NoiseModel.h:754
Robust(const RobustModel::shared_ptr robust, const NoiseModel::shared_ptr noise)
Constructor.
Definition NoiseModel.h:757
double squaredMahalanobisDistance(const Vector &v) const override
Squared Mahalanobis distance v'*R'*R*v = <R*v,R*v>.
Definition NoiseModel.h:798
const NoiseModel::shared_ptr noise_
noise model used
Definition NoiseModel.h:749
double loss(const double squared_distance) const override
Compute the block loss from a squared Mahalanobis distance.
Definition NoiseModel.h:784
Vector unwhiten(const Vector &) const override
Unwhiten an error vector.
Definition NoiseModel.h:777
void whitenInPlace(Vector &v) const override
in-place whiten, override if can be done more efficiently
Definition NoiseModel.h:779
Matrix Whiten(const Matrix &A) const override
Whiten a matrix.
Definition NoiseModel.h:775
const RobustModel::shared_ptr robust_
robust error function used
Definition NoiseModel.h:748
~Robust() override
Destructor.
Definition NoiseModel.h:761
const NoiseModel::shared_ptr & noise() const
Return the contained noise model.
Definition NoiseModel.h:770
Vector whiten(const Vector &v) const override
Whiten an error vector.
Definition NoiseModel.h:773
Diagonal(const Vector &sigmas)
constructor to allow for disabling initialization of invsigmas
Definition NoiseModel.cpp:279
Gaussian implements the mathematical model |R*x|^2 = |y|^2 with R'*R=inv(Sigma) where y = whiten(x) =...
Definition NoiseModel.h:192
Gaussian(size_t dim=1, const std::optional< Matrix > &sqrt_information={})
constructor takes square root information matrix
Definition NoiseModel.h:218
An isotropic noise model corresponds to a scaled diagonal covariance To construct,...
Definition NoiseModel.h:581
Isotropic(size_t dim, double sigma)
protected constructor takes sigma
Definition NoiseModel.h:586
Constrained(const Vector &mu, const Vector &sigmas)
Constructor that prevents inf values from appearing in invsigmas, while preserving infinite precision...
Definition NoiseModel.cpp:398