21#include <gtsam/base/utilities.h>
37 using sharedGaussianNoiseModel = noiseModel::Gaussian::shared_ptr;
47 const sharedGaussianNoiseModel& model)
48 : Base(
key, origin, model) {}
52 const sharedGaussianNoiseModel& model)
53 : Base(
key, origin, mean, model) {
54 if (mean.size() !=
static_cast<Eigen::Index
>(model->dim()))
55 throw std::invalid_argument(
56 "ConcentratedGaussian: mean dimension does not match noise model");
68 throw std::invalid_argument(
69 "ConcentratedGaussian: mean dimension does not match covariance");
71 throw std::invalid_argument(
72 "ConcentratedGaussian: covariance matrix is not square");
88 std::cout << s <<
"ConcentratedGaussian on " << keyFormatter(this->
key())
92 if (this->noiseModel_)
93 this->noiseModel_->print(
" noise model: ");
95 std::cout <<
"no noise model\n";
100 double tol = 1e-9)
const override {
111 const size_t n = this->
dim();
112 const bool zeroMean = !this->
mean_;
113 if (xHm && zeroMean) xHm->setIdentity(n, n);
132 const size_t n = this->
dim();
135 constexpr double log2pi = 1.8378770664093454835606594728112;
136 const double logDetSigma =
gaussian->logDeterminant();
137 return 0.5 * n * log2pi + 0.5 * logDetSigma;
156 const T& x = values.
at<T>(this->
key());
181 if (!this->
mean_)
return *
this;
187 const Matrix covHat = hatJm * g->covariance() * hatJm.transpose();
199 auto g = this->
gaussianModel(
"ConcentratedGaussian::transportTo",
207 const Matrix hatJm = hatHx * xHm;
208 const Matrix covHat = hatJm * g->covariance() * hatJm.transpose();
225 if (this->
key() != other.
key())
226 throw std::invalid_argument(
227 "ConcentratedGaussian::operator*: keys differ");
228 if (this->
dim() != other.
dim())
229 throw std::invalid_argument(
230 "ConcentratedGaussian::operator*: dimension mismatch");
236 const auto g1 = this->
gaussian(
"ConcentratedGaussian::operator*",
true);
237 const auto g2 = o.
gaussian(
"ConcentratedGaussian::operator*",
true);
238 auto [m, P] = Fuse(*g1, *g2);
251 static Matrix Symmetrize(
const Matrix& matrix) {
252 return 0.5 * (matrix + matrix.transpose());
257 const Matrix& P1 = g1.second;
258 const Matrix& P2 = g2.second;
259 const Vector& m1 = g1.first;
260 const Vector& m2 = g2.first;
262 const Matrix W1 = P1.inverse();
263 const Matrix W2 = P2.inverse();
264 const Matrix P = (W1 + W2).inverse();
265 const Vector m = P * (W1 * m1 + W2 * m2);
266 return {m, Symmetrize(P)};
269#if GTSAM_ENABLE_BOOST_SERIALIZATION
271 friend class boost::serialization::access;
272 template <
class ARCHIVE>
273 void serialize(ARCHIVE& ar,
const unsigned int ) {
274 ar& boost::serialization::make_nvp(
275 "ExtendedPriorFactor", boost::serialization::base_object<Base>(*
this));
A non-templated config holding any types of Manifold-group elements.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
Definition Key.cpp:30
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
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::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
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 nonlinear density, inherits from ExtendedPriorFactor.
Definition ConcentratedGaussian.h:33
T retractMean(Matrix *xHm) const
Return T element corresponding to the mean, with optional Jacobian.
Definition ConcentratedGaussian.h:110
double logProbability(const Values &values) const
Log-probability overload taking a Values container.
Definition ConcentratedGaussian.h:155
T retractMean(Matrix &xHm) const
Return the mean and write its Jacobian into xHm.
Definition ConcentratedGaussian.h:123
double negLogConstant() const
Calculate the normalization constant for the density.
Definition ConcentratedGaussian.h:131
double evaluate(const T &x) const
Evaluate the probability density at the given value.
Definition ConcentratedGaussian.h:164
double logProbability(const T &x) const
Calculate the log-probability of the given value.
Definition ConcentratedGaussian.h:146
ConcentratedGaussian(Key key, const T &origin, const Matrix &covariance)
Constructor with covariance matrix (zero mean in tangent space).
Definition ConcentratedGaussian.h:60
ConcentratedGaussian(Key key, const T &origin, const Vector &mean, const sharedGaussianNoiseModel &model)
Constructor with noise model and optional mean in tangent space.
Definition ConcentratedGaussian.h:51
ConcentratedGaussian transportTo(const T &x_hat) const
Transport this density to a new origin x̂, returning a density at x̂ with nonzero mean in that chart.
Definition ConcentratedGaussian.h:198
ConcentratedGaussian operator*(const ConcentratedGaussian &other) const
Fusion operator implementing the (approximate) three-step Fusion method in: Y.
Definition ConcentratedGaussian.h:223
bool equals(const NonlinearFactor &expected, double tol=1e-9) const override
equals
Definition ConcentratedGaussian.h:99
T retractMean() const
Return the mean without requesting its Jacobian.
Definition ConcentratedGaussian.h:120
ConcentratedGaussian(Key key, const T &origin, const sharedGaussianNoiseModel &model)
Constructor with noise model and optional mean in tangent space.
Definition ConcentratedGaussian.h:46
void print(const std::string &s, const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition ConcentratedGaussian.h:86
ConcentratedGaussian()
Default constructor for serialization.
Definition ConcentratedGaussian.h:43
ConcentratedGaussian reset() const
Create a new ConcentratedGaussian with zero mean by moving the origin to x̂ = Retract(origin,...
Definition ConcentratedGaussian.h:180
ConcentratedGaussian(Key key, const T &origin, const Vector &mean, const Matrix &covariance)
Constructor with mean (in tangent space) and covariance matrix.
Definition ConcentratedGaussian.h:64
double evaluate(const Values &values) const
Evaluate density P(x) using a Values container.
Definition ConcentratedGaussian.h:167
noiseModel::Gaussian::shared_ptr gaussianModel(const std::string &method="<unknown>", bool throwOnFailure=false) const
Definition ExtendedPriorFactor.h:192
double error(const T &x) const
Definition ExtendedPriorFactor.h:177
std::optional< Vector > mean_
Definition ExtendedPriorFactor.h:54
bool equals(const NonlinearFactor &expected, double tol=1e-9) const override
Definition ExtendedPriorFactor.h:125
std::optional< Matrix > covariance(const std::string &method="<unknown>", bool throwOnFailure=false) const
Definition ExtendedPriorFactor.h:217
std::optional< Gaussian > gaussian(const std::string &method="<unknown>", bool throwOnFailure=false) const
Definition ExtendedPriorFactor.h:228
std::pair< Vector, Matrix > Gaussian
Definition ExtendedPriorFactor.h:225
ExtendedPriorFactor()
Definition ExtendedPriorFactor.h:67
Key key() const
Definition NoiseModelFactorN.h:307
Nonlinear factor base class.
Definition NonlinearFactor.h:70
size_t dim() const override
get the dimension of the factor (number of rows on linearization)
Definition NonlinearFactor.h:251
A non-templated config holding any types of Manifold-group elements.
Definition Values.h:65
const ValueType at(Key j) const
Retrieve a variable by key j.
Definition Values-inl.h:260