Avoid copy/pasta
parent
ad9fd1969e
commit
14d0f9f1ef
|
|
@ -39,12 +39,55 @@ struct HybridGaussianConditional::Helper {
|
|||
Conditionals conditionals;
|
||||
double minNegLogConstant;
|
||||
|
||||
using GC = GaussianConditional;
|
||||
using P = std::vector<std::pair<Vector, double>>;
|
||||
|
||||
// Common code for three constructors below:
|
||||
template <typename Create>
|
||||
void initialize(const DiscreteKey &mode, const P &p, Create create) {
|
||||
nrFrontals = 1;
|
||||
minNegLogConstant = std::numeric_limits<double>::infinity();
|
||||
|
||||
std::vector<GaussianFactorValuePair> fvs;
|
||||
std::vector<GC::shared_ptr> gcs;
|
||||
for (const auto &[mean, sigma] : p) {
|
||||
auto c = create(mean, sigma);
|
||||
double value = c->negLogConstant();
|
||||
minNegLogConstant = std::min(minNegLogConstant, value);
|
||||
fvs.push_back({c, value});
|
||||
gcs.push_back(c);
|
||||
}
|
||||
|
||||
conditionals = Conditionals({mode}, gcs);
|
||||
pairs = FactorValuePairs({mode}, fvs);
|
||||
}
|
||||
|
||||
// Constructors for different types of GaussianConditionals:
|
||||
|
||||
Helper(const DiscreteKey &mode, Key x0, const P &p) {
|
||||
initialize(mode, p, [x0](const Vector &mean, double sigma) {
|
||||
return GC::sharedMeanAndStddev(x0, mean, sigma);
|
||||
});
|
||||
}
|
||||
|
||||
Helper(const DiscreteKey &mode, Key x0, const Matrix &A, Key x1, const P &p) {
|
||||
initialize(mode, p, [x0, A, x1](const Vector &mean, double sigma) {
|
||||
return GC::sharedMeanAndStddev(x0, A, x1, mean, sigma);
|
||||
});
|
||||
}
|
||||
|
||||
Helper(const DiscreteKey &mode, Key x0, //
|
||||
const Matrix &A1, Key x1, const Matrix &A2, Key x2, const P &p) {
|
||||
initialize(mode, p, [x0, A1, x1, A2, x2](const Vector &mean, double sigma) {
|
||||
return GC::sharedMeanAndStddev(x0, A1, x1, A2, x2, mean, sigma);
|
||||
});
|
||||
}
|
||||
|
||||
/// Construct from tree of GaussianConditionals.
|
||||
Helper(const Conditionals &conditionals)
|
||||
: conditionals(conditionals),
|
||||
minNegLogConstant(std::numeric_limits<double>::infinity()) {
|
||||
auto func = [this](const GaussianConditional::shared_ptr &c)
|
||||
-> GaussianFactorValuePair {
|
||||
auto func = [this](const GC::shared_ptr &c) -> GaussianFactorValuePair {
|
||||
double value = 0.0;
|
||||
if (c) {
|
||||
if (!nrFrontals.has_value()) {
|
||||
|
|
@ -61,64 +104,6 @@ struct HybridGaussianConditional::Helper {
|
|||
"HybridGaussianConditional: need at least one frontal variable.");
|
||||
}
|
||||
}
|
||||
|
||||
/// Construct from means and a sigmas.
|
||||
Helper(const DiscreteKey mode, Key key,
|
||||
const std::vector<std::pair<Vector, double>> ¶meters)
|
||||
: nrFrontals(1),
|
||||
minNegLogConstant(std::numeric_limits<double>::infinity()) {
|
||||
std::vector<GaussianConditional::shared_ptr> gcs;
|
||||
std::vector<GaussianFactorValuePair> fvs;
|
||||
for (const auto &[mean, sigma] : parameters) {
|
||||
auto c = GaussianConditional::sharedMeanAndStddev(key, mean, sigma);
|
||||
double value = c->negLogConstant();
|
||||
minNegLogConstant = std::min(minNegLogConstant, value);
|
||||
gcs.push_back(c);
|
||||
fvs.push_back({c, value});
|
||||
}
|
||||
conditionals = Conditionals({mode}, gcs);
|
||||
pairs = FactorValuePairs({mode}, fvs);
|
||||
}
|
||||
|
||||
/// Construct from means and a sigmas.
|
||||
Helper(const DiscreteKey mode, Key key, //
|
||||
const Matrix &A, Key parent,
|
||||
const std::vector<std::pair<Vector, double>> ¶meters)
|
||||
: nrFrontals(1),
|
||||
minNegLogConstant(std::numeric_limits<double>::infinity()) {
|
||||
std::vector<GaussianConditional::shared_ptr> gcs;
|
||||
std::vector<GaussianFactorValuePair> fvs;
|
||||
for (const auto &[mean, sigma] : parameters) {
|
||||
auto c =
|
||||
GaussianConditional::sharedMeanAndStddev(key, A, parent, mean, sigma);
|
||||
double value = c->negLogConstant();
|
||||
minNegLogConstant = std::min(minNegLogConstant, value);
|
||||
gcs.push_back(c);
|
||||
fvs.push_back({c, value});
|
||||
}
|
||||
conditionals = Conditionals({mode}, gcs);
|
||||
pairs = FactorValuePairs({mode}, fvs);
|
||||
}
|
||||
|
||||
/// Construct from means and a sigmas.
|
||||
Helper(const DiscreteKey mode, Key key, //
|
||||
const Matrix &A1, Key parent1, const Matrix &A2, Key parent2,
|
||||
const std::vector<std::pair<Vector, double>> ¶meters)
|
||||
: nrFrontals(1),
|
||||
minNegLogConstant(std::numeric_limits<double>::infinity()) {
|
||||
std::vector<GaussianConditional::shared_ptr> gcs;
|
||||
std::vector<GaussianFactorValuePair> fvs;
|
||||
for (const auto &[mean, sigma] : parameters) {
|
||||
auto c = GaussianConditional::sharedMeanAndStddev(key, A1, parent1, A2,
|
||||
parent2, mean, sigma);
|
||||
double value = c->negLogConstant();
|
||||
minNegLogConstant = std::min(minNegLogConstant, value);
|
||||
gcs.push_back(c);
|
||||
fvs.push_back({c, value});
|
||||
}
|
||||
conditionals = Conditionals({mode}, gcs);
|
||||
pairs = FactorValuePairs({mode}, fvs);
|
||||
}
|
||||
};
|
||||
|
||||
/* *******************************************************************************/
|
||||
|
|
|
|||
Loading…
Reference in New Issue