23 #include <gtsam/base/std_optional_serialization.h> 24 #include <gtsam/dllexport.h> 25 #include <gtsam/linear/LossFunctions.h> 27 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 28 #include <boost/serialization/nvp.hpp> 29 #include <boost/serialization/extended_type_info.hpp> 30 #include <boost/serialization/singleton.hpp> 31 #include <boost/serialization/shared_ptr.hpp> 39 namespace noiseModel {
60 typedef std::shared_ptr<Base> shared_ptr;
69 Base(
size_t dim = 1):dim_(dim) {}
76 virtual bool isUnit()
const {
return false; }
79 inline size_t dim()
const {
return dim_;}
81 virtual void print(
const std::string& name =
"")
const = 0;
83 virtual bool equals(
const Base& expected,
double tol=1e-9)
const = 0;
86 virtual Vector sigmas()
const;
89 virtual Vector whiten(
const Vector& v)
const = 0;
92 virtual Matrix Whiten(
const Matrix& H)
const = 0;
95 virtual Vector unwhiten(
const Vector& v)
const = 0;
98 virtual double squaredMahalanobisDistance(
const Vector& v)
const;
102 return std::sqrt(squaredMahalanobisDistance(v));
106 virtual double loss(
const double squared_distance)
const {
107 return 0.5 * squared_distance;
110 virtual void WhitenSystem(std::vector<Matrix>& A, Vector& b)
const = 0;
111 virtual void WhitenSystem(Matrix& A, Vector& b)
const = 0;
112 virtual void WhitenSystem(Matrix& A1, Matrix& A2, Vector& b)
const = 0;
113 virtual void WhitenSystem(Matrix& A1, Matrix& A2, Matrix& A3, Vector& b)
const = 0;
141 virtual double weight(
const Vector& v)
const {
return 1.0; }
144 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 146 friend class boost::serialization::access;
147 template<
class ARCHIVE>
148 void serialize(ARCHIVE & ar,
const unsigned int ) {
149 ar & BOOST_SERIALIZATION_NVP(dim_);
180 const Matrix& thisR()
const {
182 if (!sqrt_information_)
throw std::runtime_error(
"Gaussian: has no R matrix");
183 return *sqrt_information_;
189 typedef std::shared_ptr<Gaussian> shared_ptr;
193 const std::optional<Matrix>& sqrt_information = {})
194 :
Base(dim), sqrt_information_(sqrt_information) {}
203 static shared_ptr SqrtInformation(
const Matrix& R,
bool smart =
true);
210 static shared_ptr Information(
const Matrix& M,
bool smart =
true);
217 static shared_ptr Covariance(
const Matrix& covariance,
bool smart =
true);
219 void print(
const std::string& name)
const override;
220 bool equals(
const Base& expected,
double tol=1e-9)
const override;
221 Vector sigmas()
const override;
222 Vector whiten(
const Vector& v)
const override;
223 Vector unwhiten(
const Vector& v)
const override;
229 Matrix Whiten(
const Matrix& H)
const override;
234 virtual void WhitenInPlace(Matrix& H)
const;
239 virtual void WhitenInPlace(Eigen::Block<Matrix> H)
const;
244 void WhitenSystem(std::vector<Matrix>& A, Vector& b)
const override;
245 void WhitenSystem(Matrix& A, Vector& b)
const override;
246 void WhitenSystem(Matrix& A1, Matrix& A2, Vector& b)
const override;
247 void WhitenSystem(Matrix& A1, Matrix& A2, Matrix& A3, Vector& b)
const override;
258 virtual std::shared_ptr<Diagonal> QR(Matrix& Ab)
const;
261 virtual Matrix
R()
const {
return thisR();}
264 virtual Matrix information()
const;
267 virtual Matrix covariance()
const;
270 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 272 friend class boost::serialization::access;
273 template<
class ARCHIVE>
274 void serialize(ARCHIVE & ar,
const unsigned int ) {
275 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Base);
276 ar & BOOST_SERIALIZATION_NVP(sqrt_information_);
307 typedef std::shared_ptr<Diagonal> shared_ptr;
315 static shared_ptr Sigmas(
const Vector& sigmas,
bool smart =
true);
323 static shared_ptr Variances(
const Vector& variances,
bool smart =
true);
329 static shared_ptr Precisions(
const Vector& precisions,
bool smart =
true);
331 void print(
const std::string& name)
const override;
332 Vector
sigmas()
const override {
return sigmas_; }
333 Vector whiten(
const Vector& v)
const override;
334 Vector unwhiten(
const Vector& v)
const override;
335 Matrix Whiten(
const Matrix& H)
const override;
336 void WhitenInPlace(Matrix& H)
const override;
337 void WhitenInPlace(Eigen::Block<Matrix> H)
const override;
342 inline double sigma(
size_t i)
const {
return sigmas_(i); }
347 inline const Vector&
invsigmas()
const {
return invsigmas_; }
348 inline double invsigma(
size_t i)
const {
return invsigmas_(i);}
353 inline const Vector&
precisions()
const {
return precisions_; }
354 inline double precision(
size_t i)
const {
return precisions_(i);}
359 Matrix
R()
const override {
360 return invsigmas().asDiagonal();
364 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 366 friend class boost::serialization::access;
367 template<
class ARCHIVE>
368 void serialize(ARCHIVE & ar,
const unsigned int ) {
369 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Gaussian);
370 ar & BOOST_SERIALIZATION_NVP(sigmas_);
371 ar & BOOST_SERIALIZATION_NVP(invsigmas_);
401 Constrained(
const Vector& mu,
const Vector& sigmas);
405 typedef std::shared_ptr<Constrained> shared_ptr;
421 bool constrained(
size_t i)
const;
424 const Vector&
mu()
const {
return mu_; }
430 static shared_ptr MixedSigmas(
const Vector& mu,
const Vector& sigmas);
436 static shared_ptr MixedSigmas(
const Vector& sigmas);
442 static shared_ptr MixedSigmas(
double m,
const Vector& sigmas);
448 static shared_ptr MixedVariances(
const Vector& mu,
const Vector& variances);
449 static shared_ptr MixedVariances(
const Vector& variances);
455 static shared_ptr MixedPrecisions(
const Vector& mu,
const Vector& precisions);
456 static shared_ptr MixedPrecisions(
const Vector& precisions);
463 double squaredMahalanobisDistance(
const Vector& v)
const override;
466 static shared_ptr
All(
size_t dim) {
467 return shared_ptr(
new Constrained(Vector::Constant(dim, 1000.0), Vector::Constant(dim,0)));
471 static shared_ptr
All(
size_t dim,
const Vector& mu) {
472 return shared_ptr(
new Constrained(mu, Vector::Constant(dim,0)));
476 static shared_ptr
All(
size_t dim,
double mu) {
477 return shared_ptr(
new Constrained(Vector::Constant(dim, mu), Vector::Constant(dim,0)));
480 void print(
const std::string& name)
const override;
483 Vector whiten(
const Vector& v)
const override;
487 Matrix Whiten(
const Matrix& H)
const override;
488 void WhitenInPlace(Matrix& H)
const override;
489 void WhitenInPlace(Eigen::Block<Matrix> H)
const override;
500 Diagonal::shared_ptr QR(Matrix& Ab)
const override;
506 shared_ptr unit()
const;
509 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 511 friend class boost::serialization::access;
512 template<
class ARCHIVE>
513 void serialize(ARCHIVE & ar,
const unsigned int ) {
514 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Diagonal);
515 ar & BOOST_SERIALIZATION_NVP(mu_);
529 double sigma_, invsigma_;
533 Diagonal(Vector::Constant(dim, sigma)),sigma_(sigma),invsigma_(1.0/sigma) {}
542 typedef std::shared_ptr<Isotropic> shared_ptr;
547 static shared_ptr Sigma(
size_t dim,
double sigma,
bool smart =
true);
555 static shared_ptr Variance(
size_t dim,
double variance,
bool smart =
true);
560 static shared_ptr
Precision(
size_t dim,
double precision,
bool smart =
true) {
561 return Variance(dim, 1.0/precision, smart);
564 void print(
const std::string& name)
const override;
565 double squaredMahalanobisDistance(
const Vector& v)
const override;
566 Vector whiten(
const Vector& v)
const override;
567 Vector unwhiten(
const Vector& v)
const override;
568 Matrix Whiten(
const Matrix& H)
const override;
569 void WhitenInPlace(Matrix& H)
const override;
570 void whitenInPlace(Vector& v)
const override;
571 void WhitenInPlace(Eigen::Block<Matrix> H)
const override;
576 inline double sigma()
const {
return sigma_; }
579 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 581 friend class boost::serialization::access;
582 template<
class ARCHIVE>
583 void serialize(ARCHIVE & ar,
const unsigned int ) {
584 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Diagonal);
585 ar & BOOST_SERIALIZATION_NVP(sigma_);
586 ar & BOOST_SERIALIZATION_NVP(invsigma_);
600 typedef std::shared_ptr<Unit> shared_ptr;
611 return shared_ptr(
new Unit(dim));
615 bool isUnit()
const override {
return true; }
617 void print(
const std::string& name)
const override;
618 double squaredMahalanobisDistance(
const Vector& v)
const override;
619 Vector
whiten(
const Vector& v)
const override {
return v; }
620 Vector
unwhiten(
const Vector& v)
const override {
return v; }
621 Matrix
Whiten(
const Matrix& H)
const override {
return H; }
630 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 632 friend class boost::serialization::access;
633 template<
class ARCHIVE>
634 void serialize(ARCHIVE & ar,
const unsigned int ) {
635 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Isotropic);
659 typedef std::shared_ptr<Robust> shared_ptr;
674 Robust(
const RobustModel::shared_ptr robust,
const NoiseModel::shared_ptr noise)
675 :
Base(noise->dim()), robust_(robust), noise_(noise) {}
680 void print(
const std::string& name)
const override;
681 bool equals(
const Base& expected,
double tol=1e-9)
const override;
684 const RobustModel::shared_ptr&
robust()
const {
return robust_; }
687 const NoiseModel::shared_ptr&
noise()
const {
return noise_; }
690 inline Vector
whiten(
const Vector& v)
const override 691 { Vector r = v; this->WhitenSystem(r);
return r; }
692 inline Matrix
Whiten(
const Matrix& A)
const override 693 { Vector b; Matrix B=A; this->WhitenSystem(B,b);
return B; }
694 inline Vector
unwhiten(
const Vector& )
const override 695 {
throw std::invalid_argument(
"unwhiten is not currently supported for robust noise models."); }
697 double loss(
const double squared_distance)
const override {
698 return robust_->loss(std::sqrt(squared_distance));
704 return noise_->squaredMahalanobisDistance(v);
708 virtual void WhitenSystem(Vector& b)
const;
709 void WhitenSystem(std::vector<Matrix>& A, Vector& b)
const override;
710 void WhitenSystem(Matrix& A, Vector& b)
const override;
711 void WhitenSystem(Matrix& A1, Matrix& A2, Vector& b)
const override;
712 void WhitenSystem(Matrix& A1, Matrix& A2, Matrix& A3, Vector& b)
const override;
714 Vector unweightedWhiten(
const Vector& v)
const override;
715 double weight(
const Vector& v)
const override;
717 static shared_ptr Create(
718 const RobustModel::shared_ptr &robust,
const NoiseModel::shared_ptr noise);
721 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 723 friend class boost::serialization::access;
724 template<
class ARCHIVE>
725 void serialize(ARCHIVE & ar,
const unsigned int ) {
726 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(
Base);
727 ar & boost::serialization::make_nvp(
"robust_", const_cast<RobustModel::shared_ptr&>(robust_));
728 ar & boost::serialization::make_nvp(
"noise_", const_cast<NoiseModel::shared_ptr&>(noise_));
734 GTSAM_EXPORT std::optional<Vector> checkIfDiagonal(
const Matrix& M);
742 typedef noiseModel::Gaussian::shared_ptr SharedGaussian;
743 typedef noiseModel::Diagonal::shared_ptr SharedDiagonal;
744 typedef noiseModel::Constrained::shared_ptr SharedConstrained;
745 typedef noiseModel::Isotropic::shared_ptr SharedIsotropic;
748 template<>
struct traits<noiseModel::Gaussian> :
public Testable<noiseModel::Gaussian> {};
749 template<>
struct traits<noiseModel::Diagonal> :
public Testable<noiseModel::Diagonal> {};
750 template<>
struct traits<noiseModel::Constrained> :
public Testable<noiseModel::Constrained> {};
751 template<>
struct traits<noiseModel::Isotropic> :
public Testable<noiseModel::Isotropic> {};
752 template<>
struct traits<noiseModel::Unit> :
public Testable<noiseModel::Unit> {};
Matrix Whiten(const Matrix &H) const override
Definition: NoiseModel.h:621
static shared_ptr All(size_t dim, const Vector &mu)
Definition: NoiseModel.h:471
Unit(size_t dim=1)
Definition: NoiseModel.h:603
Vector mu_
Penalty function weight - needs to be large enough to dominate soft constraints.
Definition: NoiseModel.h:394
double squaredMahalanobisDistance(const Vector &v) const override
Squared Mahalanobis distance v'*R'*R*v = <R*v,R*v>
Definition: NoiseModel.h:703
Definition: NoiseModel.h:597
virtual double weight(const Vector &v) const
Definition: NoiseModel.h:141
Definition: NoiseModel.h:57
Concept check for values that can be used in unit tests.
virtual void whitenInPlace(Eigen::Block< Vector > &v) const
Definition: NoiseModel.h:126
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
virtual void unwhitenInPlace(Eigen::Block< Vector > &v) const
Definition: NoiseModel.h:131
const Vector & invsigmas() const
Definition: NoiseModel.h:347
const RobustModel::shared_ptr & robust() const
Return the contained robust error function.
Definition: NoiseModel.h:684
Definition: Testable.h:152
virtual double mahalanobisDistance(const Vector &v) const
Mahalanobis distance.
Definition: NoiseModel.h:101
void unwhitenInPlace(Eigen::Block< Vector > &) const override
Definition: NoiseModel.h:627
Gaussian(size_t dim=1, const std::optional< Matrix > &sqrt_information={})
Definition: NoiseModel.h:192
virtual bool isUnit() const
true if a unit noise model, saves slow/clumsy dynamic casting
Definition: NoiseModel.h:76
virtual bool isConstrained() const
true if a constrained noise model, saves slow/clumsy dynamic casting
Definition: NoiseModel.h:73
void WhitenInPlace(Eigen::Block< Matrix >) const override
Definition: NoiseModel.h:623
Vector sigmas_
Definition: NoiseModel.h:296
static shared_ptr Create(size_t dim)
Definition: NoiseModel.h:610
bool isConstrained() const override
true if a constrained noise mode, saves slow/clumsy dynamic casting
Definition: NoiseModel.h:418
virtual void whitenInPlace(Vector &v) const
Definition: NoiseModel.h:116
double sigma(size_t i) const
Definition: NoiseModel.h:342
std::optional< Matrix > sqrt_information_
Definition: NoiseModel.h:173
static shared_ptr All(size_t dim, double mu)
Definition: NoiseModel.h:476
Definition: Testable.h:112
virtual double loss(const double squared_distance) const
loss function, input is Mahalanobis distance
Definition: NoiseModel.h:106
virtual Vector unweightedWhiten(const Vector &v) const
Definition: NoiseModel.h:136
const RobustModel::shared_ptr robust_
robust error function used
Definition: NoiseModel.h:665
Definition: NoiseModel.h:168
Vector whiten(const Vector &v) const override
Whiten an error vector.
Definition: NoiseModel.h:690
const Vector & precisions() const
Definition: NoiseModel.h:353
Robust()
Default Constructor for serialization.
Definition: NoiseModel.h:671
Vector sigmas() const override
Calculate standard deviations.
Definition: NoiseModel.h:332
const NoiseModel::shared_ptr noise_
noise model used
Definition: NoiseModel.h:666
void WhitenInPlace(Matrix &) const override
Definition: NoiseModel.h:622
void unwhitenInPlace(Vector &) const override
Definition: NoiseModel.h:625
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
double loss(const double squared_distance) const override
Compute loss from the m-estimator using the Mahalanobis distance.
Definition: NoiseModel.h:697
virtual void unwhitenInPlace(Vector &v) const
Definition: NoiseModel.h:121
~Robust() override
Destructor.
Definition: NoiseModel.h:678
Definition: LossFunctions.h:65
typedef and functions to augment Eigen's MatrixXd
void whitenInPlace(Eigen::Block< Vector > &) const override
Definition: NoiseModel.h:626
Base(size_t dim=1)
primary constructor
Definition: NoiseModel.h:69
Vector whiten(const Vector &v) const override
Whiten an error vector.
Definition: NoiseModel.h:619
Definition: chartTesting.h:28
double sigma() const
Definition: NoiseModel.h:576
const Vector & mu() const
Access mu as a vector.
Definition: NoiseModel.h:424
const NoiseModel::shared_ptr & noise() const
Return the contained noise model.
Definition: NoiseModel.h:687
Matrix R() const override
Definition: NoiseModel.h:359
Definition: NoiseModel.h:657
Robust(const RobustModel::shared_ptr robust, const NoiseModel::shared_ptr noise)
Constructor.
Definition: NoiseModel.h:674
void whitenInPlace(Vector &) const override
Definition: NoiseModel.h:624
Vector unwhiten(const Vector &) const override
Unwhiten an error vector.
Definition: NoiseModel.h:694
Vector unwhiten(const Vector &v) const override
Unwhiten an error vector.
Definition: NoiseModel.h:620
size_t dim() const
Dimensionality.
Definition: NoiseModel.h:79
Definition: NoiseModel.h:527
static shared_ptr Precision(size_t dim, double precision, bool smart=true)
Definition: NoiseModel.h:560
Definition: NoiseModel.h:288
Matrix Whiten(const Matrix &A) const override
Whiten a matrix.
Definition: NoiseModel.h:692
Definition: NoiseModel.h:390
noiseModel::Base::shared_ptr SharedNoiseModel
Definition: NoiseModel.h:741
Isotropic(size_t dim, double sigma)
Definition: NoiseModel.h:532
virtual Matrix R() const
Return R itself, but note that Whiten(H) is cheaper than R*H.
Definition: NoiseModel.h:261
static shared_ptr All(size_t dim)
Definition: NoiseModel.h:466
bool isUnit() const override
true if a unit noise model, saves slow/clumsy dynamic casting
Definition: NoiseModel.h:615