25#include <gtsam/base/std_optional_serialization.h>
26#include <gtsam/dllexport.h>
27#include <gtsam/linear/LossFunctions.h>
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>
63 typedef std::shared_ptr<Base> shared_ptr;
79 virtual bool isUnit()
const {
return false; }
82 inline size_t dim()
const {
return dim_;}
84 virtual void print(
const std::string& name =
"")
const = 0;
86 virtual bool equals(
const Base& expected,
double tol=1e-9)
const = 0;
89 virtual Vector sigmas()
const;
92 virtual Vector
whiten(
const Vector& v)
const = 0;
95 virtual Matrix
Whiten(
const Matrix& H)
const = 0;
98 virtual Vector
unwhiten(
const Vector& v)
const = 0;
109 virtual double loss(
const double squared_distance)
const {
110 return 0.5 * squared_distance;
119 virtual double loss(
const Vector& v)
const {
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;
154 virtual double weight(
const Vector& v)
const {
return 1.0; }
157#if GTSAM_ENABLE_BOOST_SERIALIZATION
159 friend class boost::serialization::access;
160 template<
class ARCHIVE>
161 void serialize(ARCHIVE & ar,
const unsigned int ) {
162 ar & BOOST_SERIALIZATION_NVP(dim_);
171 static_assert(IsManifold<T>::value,
172 "noiseModel::matchesDimension requires a manifold type.");
204 const Matrix& thisR()
const {
211 virtual double logDetR()
const;
215 typedef std::shared_ptr<Gaussian> shared_ptr;
219 const std::optional<Matrix>& sqrt_information = {})
220 :
Base(dim), sqrt_information_(sqrt_information) {}
229 static shared_ptr SqrtInformation(
const Matrix& R,
bool smart =
true);
236 static shared_ptr Information(
const Matrix& M,
bool smart =
true);
243 static shared_ptr Covariance(
const Matrix& covariance,
bool smart =
true);
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;
257 Matrix Whiten(
const Matrix& H)
const override;
262 virtual void WhitenInPlace(Matrix& H)
const;
267 virtual void WhitenInPlace(Eigen::Block<Matrix> H)
const;
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;
286 virtual std::shared_ptr<Diagonal> QR(Matrix& Ab)
const;
289 virtual Matrix
R()
const {
return thisR();}
292 virtual Matrix information()
const;
295 virtual Matrix covariance()
const;
298 double logDeterminant()
const;
306 double negLogConstant()
const;
309#if GTSAM_ENABLE_BOOST_SERIALIZATION
311 friend class boost::serialization::access;
312 template<
class ARCHIVE>
313 void serialize(ARCHIVE & ar,
const unsigned int ) {
314 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Base);
315 ar & BOOST_SERIALIZATION_NVP(sqrt_information_);
341 virtual double logDetR()
const override;
347 typedef std::shared_ptr<Diagonal> shared_ptr;
355 static shared_ptr Sigmas(
const Vector& sigmas,
bool smart =
true);
363 static shared_ptr Variances(
const Vector& variances,
bool smart =
true);
369 static shared_ptr Precisions(
const Vector& precisions,
bool smart =
true);
371 void print(
const std::string& name)
const override;
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;
393 inline const Vector&
invsigmas()
const {
return invsigmas_; }
394 inline double invsigma(
size_t i)
const {
return invsigmas_(i);}
399 inline const Vector&
precisions()
const {
return precisions_; }
400 inline double precision(
size_t i)
const {
return precisions_(i);}
405 Matrix
R()
const override {
410#if GTSAM_ENABLE_BOOST_SERIALIZATION
412 friend class boost::serialization::access;
413 template<
class ARCHIVE>
414 void serialize(ARCHIVE & ar,
const unsigned int ) {
415 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Gaussian);
416 ar & BOOST_SERIALIZATION_NVP(sigmas_);
417 ar & BOOST_SERIALIZATION_NVP(invsigmas_);
451 typedef std::shared_ptr<Constrained> shared_ptr;
467 bool constrained(
size_t i)
const;
470 const Vector&
mu()
const {
return mu_; }
476 static shared_ptr MixedSigmas(
const Vector& mu,
const Vector& sigmas);
482 static shared_ptr MixedSigmas(
const Vector& sigmas);
488 static shared_ptr MixedSigmas(
double m,
const Vector& sigmas);
494 static shared_ptr MixedVariances(
const Vector& mu,
const Vector& variances);
495 static shared_ptr MixedVariances(
const Vector& variances);
501 static shared_ptr MixedPrecisions(
const Vector& mu,
const Vector& precisions);
502 static shared_ptr MixedPrecisions(
const Vector& precisions);
509 double squaredMahalanobisDistance(
const Vector& v)
const override;
513 return shared_ptr(
new Constrained(Vector::Constant(
dim, 1000.0), Vector::Constant(
dim,0)));
517 static shared_ptr
All(
size_t dim,
const Vector&
mu) {
526 void print(
const std::string& name)
const override;
529 Vector whiten(
const Vector& v)
const override;
530 void whitenInPlace(Vector& v)
const override;
531 void whitenInPlace(Eigen::Block<Vector>& v)
const override;
535 Matrix Whiten(
const Matrix& H)
const override;
536 void WhitenInPlace(Matrix& H)
const override;
537 void WhitenInPlace(Eigen::Block<Matrix> H)
const override;
543 Matrix informationFromA(
const Matrix& A)
const;
554 Diagonal::shared_ptr QR(Matrix& Ab)
const override;
560 shared_ptr unit()
const;
563#if GTSAM_ENABLE_BOOST_SERIALIZATION
565 friend class boost::serialization::access;
566 template<
class ARCHIVE>
567 void serialize(ARCHIVE & ar,
const unsigned int ) {
568 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Diagonal);
569 ar & BOOST_SERIALIZATION_NVP(mu_);
583 double sigma_, invsigma_;
590 virtual double logDetR()
const override;
599 typedef std::shared_ptr<Isotropic> shared_ptr;
604 static shared_ptr Sigma(
size_t dim,
double sigma,
bool smart =
true);
612 static shared_ptr Variance(
size_t dim,
double variance,
bool smart =
true);
617 static shared_ptr
Precision(
size_t dim,
double precision,
bool smart =
true) {
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;
635 inline double sigma()
const {
return sigma_; }
638#if GTSAM_ENABLE_BOOST_SERIALIZATION
640 friend class boost::serialization::access;
641 template<
class ARCHIVE>
642 void serialize(ARCHIVE & ar,
const unsigned int ) {
643 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Diagonal);
644 ar & BOOST_SERIALIZATION_NVP(sigma_);
645 ar & BOOST_SERIALIZATION_NVP(invsigma_);
659 virtual double logDetR()
const override;
663 typedef std::shared_ptr<Unit> shared_ptr;
674 return shared_ptr(
new Unit(
dim));
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.");
688 static const shared_ptr kDefault =
695 bool isUnit()
const override {
return true; }
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; }
710#if GTSAM_ENABLE_BOOST_SERIALIZATION
712 friend class boost::serialization::access;
713 template<
class ARCHIVE>
714 void serialize(ARCHIVE & ar,
const unsigned int ) {
715 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Isotropic);
742 typedef std::shared_ptr<Robust> shared_ptr;
763 void print(
const std::string& name)
const override;
764 bool equals(
const Base& expected,
double tol=1e-9)
const override;
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& )
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));
794 double loss(
const Vector& v)
const override;
799 return noise_->squaredMahalanobisDistance(v);
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;
809 Vector unweightedWhiten(
const Vector& v)
const override;
810 double weight(
const Vector& v)
const override;
812 static shared_ptr Create(
813 const RobustModel::shared_ptr &robust,
const NoiseModel::shared_ptr noise);
816#if GTSAM_ENABLE_BOOST_SERIALIZATION
818 friend class boost::serialization::access;
819 template<
class ARCHIVE>
820 void serialize(ARCHIVE & ar,
const unsigned int ) {
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_));
829 GTSAM_EXPORT std::optional<Vector> checkIfDiagonal(
const Matrix& M);
834 const Base::shared_ptr& model) {
837 throw std::runtime_error(
838 "noiseModel::validOrDefault: mis-matched model dimension.");
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;
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