differing noise models for multi-dimensional problem
parent
8ba5da44a6
commit
01a959b9e5
|
@ -73,7 +73,7 @@ Ordering getOrdering(HybridGaussianFactorGraph& factors,
|
||||||
return ordering;
|
return ordering;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_DISABLED(HybridEstimation, Full) {
|
TEST(HybridEstimation, Full) {
|
||||||
size_t K = 6;
|
size_t K = 6;
|
||||||
std::vector<double> measurements = {0, 1, 2, 2, 2, 3};
|
std::vector<double> measurements = {0, 1, 2, 2, 2, 3};
|
||||||
// Ground truth discrete seq
|
// Ground truth discrete seq
|
||||||
|
@ -115,7 +115,7 @@ TEST_DISABLED(HybridEstimation, Full) {
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
// Test approximate inference with an additional pruning step.
|
// Test approximate inference with an additional pruning step.
|
||||||
TEST_DISABLED(HybridEstimation, Incremental) {
|
TEST(HybridEstimation, Incremental) {
|
||||||
size_t K = 15;
|
size_t K = 15;
|
||||||
std::vector<double> measurements = {0, 1, 2, 2, 2, 2, 3, 4, 5, 6, 6,
|
std::vector<double> measurements = {0, 1, 2, 2, 2, 2, 3, 4, 5, 6, 6,
|
||||||
7, 8, 9, 9, 9, 10, 11, 11, 11, 11};
|
7, 8, 9, 9, 9, 10, 11, 11, 11, 11};
|
||||||
|
@ -283,7 +283,7 @@ AlgebraicDecisionTree<Key> getProbPrimeTree(
|
||||||
* Test for correctness of different branches of the P'(Continuous | Discrete).
|
* Test for correctness of different branches of the P'(Continuous | Discrete).
|
||||||
* The values should match those of P'(Continuous) for each discrete mode.
|
* The values should match those of P'(Continuous) for each discrete mode.
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
TEST_DISABLED(HybridEstimation, Probability) {
|
TEST(HybridEstimation, Probability) {
|
||||||
constexpr size_t K = 4;
|
constexpr size_t K = 4;
|
||||||
std::vector<double> measurements = {0, 1, 2, 2};
|
std::vector<double> measurements = {0, 1, 2, 2};
|
||||||
double between_sigma = 1.0, measurement_sigma = 0.1;
|
double between_sigma = 1.0, measurement_sigma = 0.1;
|
||||||
|
@ -326,7 +326,7 @@ TEST_DISABLED(HybridEstimation, Probability) {
|
||||||
* in the multi-frontal setting. The values should match those of P'(Continuous)
|
* in the multi-frontal setting. The values should match those of P'(Continuous)
|
||||||
* for each discrete mode.
|
* for each discrete mode.
|
||||||
*/
|
*/
|
||||||
TEST_DISABLED(HybridEstimation, ProbabilityMultifrontal) {
|
TEST(HybridEstimation, ProbabilityMultifrontal) {
|
||||||
constexpr size_t K = 4;
|
constexpr size_t K = 4;
|
||||||
std::vector<double> measurements = {0, 1, 2, 2};
|
std::vector<double> measurements = {0, 1, 2, 2};
|
||||||
|
|
||||||
|
@ -433,7 +433,7 @@ static HybridGaussianFactorGraph::shared_ptr createHybridGaussianFactorGraph() {
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Do hybrid elimination and do regression test on discrete conditional.
|
* Do hybrid elimination and do regression test on discrete conditional.
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
TEST_DISABLED(HybridEstimation, eliminateSequentialRegression) {
|
TEST(HybridEstimation, eliminateSequentialRegression) {
|
||||||
// Create the factor graph from the nonlinear factor graph.
|
// Create the factor graph from the nonlinear factor graph.
|
||||||
HybridGaussianFactorGraph::shared_ptr fg = createHybridGaussianFactorGraph();
|
HybridGaussianFactorGraph::shared_ptr fg = createHybridGaussianFactorGraph();
|
||||||
|
|
||||||
|
@ -468,7 +468,7 @@ TEST_DISABLED(HybridEstimation, eliminateSequentialRegression) {
|
||||||
* 3. Sample from the Bayes Net.
|
* 3. Sample from the Bayes Net.
|
||||||
* 4. Check that the ratio `BN(x)/FG(x) = constant` for all samples `x`.
|
* 4. Check that the ratio `BN(x)/FG(x) = constant` for all samples `x`.
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
TEST_DISABLED(HybridEstimation, CorrectnessViaSampling) {
|
TEST(HybridEstimation, CorrectnessViaSampling) {
|
||||||
// 1. Create the factor graph from the nonlinear factor graph.
|
// 1. Create the factor graph from the nonlinear factor graph.
|
||||||
const auto fg = createHybridGaussianFactorGraph();
|
const auto fg = createHybridGaussianFactorGraph();
|
||||||
|
|
||||||
|
@ -502,14 +502,19 @@ TEST_DISABLED(HybridEstimation, CorrectnessViaSampling) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Helper function to add the constant term corresponding to
|
||||||
|
* the difference in noise models.
|
||||||
|
*/
|
||||||
std::shared_ptr<HybridGaussianFactorGraph> addConstantTerm(
|
std::shared_ptr<HybridGaussianFactorGraph> addConstantTerm(
|
||||||
const HybridGaussianFactorGraph& gfg, const Key& mode, double noise_tight,
|
const HybridGaussianFactorGraph& gfg, const Key& mode, double noise_tight,
|
||||||
double noise_loose, size_t d, size_t tight_index) {
|
double noise_loose, size_t d, size_t tight_index) {
|
||||||
HybridGaussianFactorGraph updated_gfg;
|
HybridGaussianFactorGraph updated_gfg;
|
||||||
|
|
||||||
|
constexpr double log2pi = 1.8378770664093454835606594728112;
|
||||||
// logConstant will be of the tighter model
|
// logConstant will be of the tighter model
|
||||||
double logConstant =
|
double logNormalizationConstant = log(1.0 / noise_tight);
|
||||||
-0.5 * d * 1.8378770664093454835606594728112 + log(1.0 / noise_tight);
|
double logConstant = -0.5 * d * log2pi + logNormalizationConstant;
|
||||||
|
|
||||||
for (auto&& f : gfg) {
|
for (auto&& f : gfg) {
|
||||||
if (auto gmf = dynamic_pointer_cast<GaussianMixtureFactor>(f)) {
|
if (auto gmf = dynamic_pointer_cast<GaussianMixtureFactor>(f)) {
|
||||||
|
@ -517,13 +522,15 @@ std::shared_ptr<HybridGaussianFactorGraph> addConstantTerm(
|
||||||
const GaussianFactor::shared_ptr& gf) {
|
const GaussianFactor::shared_ptr& gf) {
|
||||||
if (assignment.at(mode) != tight_index) {
|
if (assignment.at(mode) != tight_index) {
|
||||||
double factor_log_constant =
|
double factor_log_constant =
|
||||||
-0.5 * d * 1.8378770664093454835606594728112 +
|
-0.5 * d * log2pi + log(1.0 / noise_loose);
|
||||||
log(1.0 / noise_loose);
|
|
||||||
|
|
||||||
GaussianFactorGraph gfg_;
|
GaussianFactorGraph gfg_;
|
||||||
gfg_.push_back(gf);
|
gfg_.push_back(gf);
|
||||||
Vector c(d);
|
Vector c(d);
|
||||||
c << std::sqrt(2.0 * (logConstant - factor_log_constant));
|
for (size_t i = 0; i < d; i++) {
|
||||||
|
c(i) = std::sqrt(2.0 * (logConstant - factor_log_constant));
|
||||||
|
}
|
||||||
|
|
||||||
auto constantFactor = std::make_shared<JacobianFactor>(c);
|
auto constantFactor = std::make_shared<JacobianFactor>(c);
|
||||||
gfg_.push_back(constantFactor);
|
gfg_.push_back(constantFactor);
|
||||||
return std::make_shared<JacobianFactor>(gfg_);
|
return std::make_shared<JacobianFactor>(gfg_);
|
||||||
|
@ -542,6 +549,7 @@ std::shared_ptr<HybridGaussianFactorGraph> addConstantTerm(
|
||||||
return std::make_shared<HybridGaussianFactorGraph>(updated_gfg);
|
return std::make_shared<HybridGaussianFactorGraph>(updated_gfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
TEST(HybridEstimation, ModeSelection) {
|
TEST(HybridEstimation, ModeSelection) {
|
||||||
HybridNonlinearFactorGraph graph;
|
HybridNonlinearFactorGraph graph;
|
||||||
Values initial;
|
Values initial;
|
||||||
|
@ -616,56 +624,57 @@ TEST(HybridEstimation, ModeSelection2) {
|
||||||
using symbol_shorthand::Z;
|
using symbol_shorthand::Z;
|
||||||
|
|
||||||
// The size of the noise model
|
// The size of the noise model
|
||||||
size_t d = 1;
|
size_t d = 3;
|
||||||
double noise_tight = 0.5, noise_loose = 5.0;
|
double noise_tight = 0.5, noise_loose = 5.0;
|
||||||
|
|
||||||
HybridBayesNet bn;
|
HybridBayesNet bn;
|
||||||
const DiscreteKey mode{M(0), 2};
|
const DiscreteKey mode{M(0), 2};
|
||||||
|
|
||||||
bn.push_back(
|
bn.push_back(
|
||||||
GaussianConditional::sharedMeanAndStddev(Z(0), -I_1x1, X(0), Z_1x1, 0.1));
|
GaussianConditional::sharedMeanAndStddev(Z(0), -I_3x3, X(0), Z_3x1, 0.1));
|
||||||
bn.push_back(
|
bn.push_back(
|
||||||
GaussianConditional::sharedMeanAndStddev(Z(0), -I_1x1, X(1), Z_1x1, 0.1));
|
GaussianConditional::sharedMeanAndStddev(Z(0), -I_3x3, X(1), Z_3x1, 0.1));
|
||||||
bn.emplace_back(new GaussianMixture(
|
bn.emplace_back(new GaussianMixture(
|
||||||
{Z(0)}, {X(0), X(1)}, {mode},
|
{Z(0)}, {X(0), X(1)}, {mode},
|
||||||
{GaussianConditional::sharedMeanAndStddev(Z(0), I_1x1, X(0), -I_1x1, X(1),
|
{GaussianConditional::sharedMeanAndStddev(Z(0), I_3x3, X(0), -I_3x3, X(1),
|
||||||
Z_1x1, noise_loose),
|
Z_3x1, noise_loose),
|
||||||
GaussianConditional::sharedMeanAndStddev(Z(0), I_1x1, X(0), -I_1x1, X(1),
|
GaussianConditional::sharedMeanAndStddev(Z(0), I_3x3, X(0), -I_3x3, X(1),
|
||||||
Z_1x1, noise_tight)}));
|
Z_3x1, noise_tight)}));
|
||||||
|
|
||||||
VectorValues vv;
|
VectorValues vv;
|
||||||
vv.insert(Z(0), Z_1x1);
|
vv.insert(Z(0), Z_3x1);
|
||||||
|
|
||||||
auto fg = bn.toFactorGraph(vv);
|
auto fg = bn.toFactorGraph(vv);
|
||||||
|
|
||||||
auto expected_posterior = fg.eliminateSequential();
|
auto expected_posterior = fg.eliminateSequential();
|
||||||
// expected_posterior->print("\n\n\nLikelihood BN:");
|
// expected_posterior->print("\n\n\nLikelihood BN:");
|
||||||
|
|
||||||
std::cout << "\n\n==================\n\n" << std::endl;
|
// std::cout << "\n\n==================\n\n" << std::endl;
|
||||||
|
|
||||||
HybridNonlinearFactorGraph graph;
|
HybridNonlinearFactorGraph graph;
|
||||||
Values initial;
|
Values initial;
|
||||||
|
|
||||||
auto measurement_model = noiseModel::Isotropic::Sigma(1, 0.1);
|
auto measurement_model = noiseModel::Isotropic::Sigma(d, 0.1);
|
||||||
auto motion_model = noiseModel::Isotropic::Sigma(1, 1.0);
|
auto motion_model = noiseModel::Isotropic::Sigma(d, 1.0);
|
||||||
|
|
||||||
graph.emplace_shared<PriorFactor<double>>(X(0), 0.0, measurement_model);
|
graph.emplace_shared<PriorFactor<Vector3>>(X(0), Z_3x1, measurement_model);
|
||||||
graph.emplace_shared<PriorFactor<double>>(X(1), 0.0, measurement_model);
|
graph.emplace_shared<PriorFactor<Vector3>>(X(1), Z_3x1, measurement_model);
|
||||||
|
|
||||||
DiscreteKeys modes;
|
DiscreteKeys modes;
|
||||||
modes.emplace_back(M(0), 2);
|
modes.emplace_back(M(0), 2);
|
||||||
|
|
||||||
auto model0 = std::make_shared<MotionModel>(
|
auto model0 = std::make_shared<BetweenFactor<Vector3>>(
|
||||||
X(0), X(1), 0.0, noiseModel::Isotropic::Sigma(d, noise_loose)),
|
X(0), X(1), Z_3x1, noiseModel::Isotropic::Sigma(d, noise_loose)),
|
||||||
model1 = std::make_shared<MotionModel>(
|
model1 = std::make_shared<BetweenFactor<Vector3>>(
|
||||||
X(0), X(1), 0.0, noiseModel::Isotropic::Sigma(d, noise_tight));
|
X(0), X(1), Z_3x1, noiseModel::Isotropic::Sigma(d, noise_tight));
|
||||||
|
|
||||||
std::vector<NonlinearFactor::shared_ptr> components = {model0, model1};
|
std::vector<NonlinearFactor::shared_ptr> components = {model0, model1};
|
||||||
|
|
||||||
KeyVector keys = {X(0), X(1)};
|
KeyVector keys = {X(0), X(1)};
|
||||||
graph.emplace_shared<MixtureFactor>(keys, modes, components);
|
graph.emplace_shared<MixtureFactor>(keys, modes, components);
|
||||||
|
|
||||||
initial.insert(X(0), 0.0);
|
initial.insert<Vector3>(X(0), Z_3x1);
|
||||||
initial.insert(X(1), 0.0);
|
initial.insert<Vector3>(X(1), Z_3x1);
|
||||||
|
|
||||||
auto gfg = graph.linearize(initial);
|
auto gfg = graph.linearize(initial);
|
||||||
gfg = addConstantTerm(*gfg, M(0), noise_tight, noise_loose, d, 1);
|
gfg = addConstantTerm(*gfg, M(0), noise_tight, noise_loose, d, 1);
|
||||||
|
|
Loading…
Reference in New Issue