43 using namespace gtsam;
61 linearizationPoint.insert<
double>(
X(0), 0);
83 auto f0 = std::make_shared<PriorFactor<Pose2>>(
84 1,
Pose2(), noiseModel::Isotropic::Sigma(3, 0.001));
88 auto f1 = std::make_shared<BetweenFactor<Pose2>>(
89 1, 2,
Pose2(), noiseModel::Isotropic::Sigma(3, 0.1));
102 auto nonlinearFactor = std::make_shared<BetweenFactor<double>>();
105 auto discreteFactor = std::make_shared<DecisionTreeFactor>();
108 auto dcFactor = std::make_shared<HybridNonlinearFactor>();
123 std::make_shared<MotionModel>(
X(0),
X(1), 1.0,
noise_model)};
134 auto nonlinearFactor = std::make_shared<BetweenFactor<double>>(
135 X(0),
X(1), 0.0, Isotropic::Sigma(1, 0.1));
137 auto discreteFactor = std::make_shared<DecisionTreeFactor>();
140 auto dcFactor = std::make_shared<HybridNonlinearFactor>(
m1,
components);
143 Values linearizationPoint;
144 linearizationPoint.
insert<
double>(
X(0), 0);
145 linearizationPoint.
insert<
double>(
X(1), 1);
162 auto nonlinearFactor = std::make_shared<BetweenFactor<double>>();
169 auto discreteFactor = std::make_shared<DecisionTreeFactor>();
176 auto dcFactor = std::make_shared<HybridNonlinearFactor>();
184 auto gaussianFactor = std::make_shared<JacobianFactor>();
204 auto noise = noiseModel::Isotropic::Sigma(3, 1.0);
223 auto error_tree =
graph.errorTree(
s.linearizationPoint);
225 auto dkeys =
graph.discreteKeys();
229 auto assignments = DiscreteValues::CartesianProduct(discrete_keys);
230 std::vector<double> leaves(assignments.size());
232 for (
size_t i = 0;
i < assignments.size(); ++
i) {
238 double temp = leaves[1];
239 leaves[1] = leaves[2];
264 *
self.nonlinearFactorGraph().linearize(
self.linearizationPoint);
277 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
287 TEST(GaussianElimination, Eliminate_x0) {
312 TEST(HybridsGaussianElimination, Eliminate_x1) {
335 Values linearizationPoint) {
339 auto between_x0_x1 = std::make_shared<MotionModel>(
X(0),
X(1),
between,
340 Isotropic::Sigma(1, 1.0));
350 TEST(HybridGaussianElimination, EliminateHybrid_2_Variable) {
353 auto factors =
self.linearizedFactorGraph();
358 const auto [hybridConditional, factorOnModes] =
361 auto hybridGaussianConditional =
362 dynamic_pointer_cast<HybridGaussianConditional>(
363 hybridConditional->inner());
365 CHECK(hybridGaussianConditional);
372 auto discreteFactor = dynamic_pointer_cast<TableFactor>(factorOnModes);
373 CHECK(discreteFactor);
385 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
388 const auto [hybridBayesNet, remainingFactorGraph] =
389 self.linearizedFactorGraph().eliminatePartialSequential(
ordering);
391 CHECK(hybridBayesNet);
400 CHECK(remainingFactorGraph);
414 self.linearizationPoint);
420 self.linearizationPoint);
426 self.linearizationPoint);
432 self.linearizationPoint);
445 fg.
add(
self.linearizedFactorGraph());
449 self.linearizedFactorGraph().eliminateSequential();
472 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
475 const auto [hybridBayesNet_partial, remainingFactorGraph_partial] =
476 self.linearizedFactorGraph().eliminatePartialSequential(
ordering);
479 remainingFactorGraph_partial->discreteFactors();
482 for (
size_t k = 0; k <
self.K - 1; k++)
ordering.push_back(
M(k));
489 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
490 for (
size_t k = 0; k <
self.K - 1; k++)
ordering.push_back(
M(k));
494 self.linearizedFactorGraph().eliminateSequential(
ordering);
496 CHECK(hybridBayesNet);
511 dynamic_pointer_cast<DiscreteConditional>(hybridBayesNet->at(3)->inner())
512 ->equals(*discreteBayesNet.at(0)));
519 .
equals(*discreteBayesNet.at(1)));
532 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
535 const auto [hybridBayesNet, remainingFactorGraph] =
536 linearizedFactorGraph.eliminatePartialSequential(
ordering);
539 std::cout << std::setprecision(6);
541 #ifdef GTSAM_DT_MERGING
542 string expected_hybridFactorGraph = R
"(
572 HybridGaussianFactor:
600 HybridGaussianFactor:
647 string expected_hybridFactorGraph = R
"(
677 HybridGaussianFactor:
705 HybridGaussianFactor:
758 string expected_hybridBayesNet = R
"(
760 conditional 0: P( x0 | x1 m0)
761 Discrete Keys = (m0, 2),
762 logNormalizationConstant: 1.38862
767 S[x1] = [ -0.0995037 ]
769 logNormalizationConstant: 1.38862
774 S[x1] = [ -0.0995037 ]
776 logNormalizationConstant: 1.38862
779 conditional 1: P( x1 | x2 m0 m1)
780 Discrete Keys = (m0, 2), (m1, 2),
781 logNormalizationConstant: 1.3935
787 S[x2] = [ -0.0990196 ]
789 logNormalizationConstant: 1.3935
794 S[x2] = [ -0.0990196 ]
796 logNormalizationConstant: 1.3935
802 S[x2] = [ -0.0990196 ]
804 logNormalizationConstant: 1.3935
809 S[x2] = [ -0.0990196 ]
811 logNormalizationConstant: 1.3935
814 conditional 2: P( x2 | m0 m1)
815 Discrete Keys = (m0, 2), (m1, 2),
816 logNormalizationConstant: 1.38857
825 logNormalizationConstant: 1.38857
833 logNormalizationConstant: 1.38857
842 logNormalizationConstant: 1.38857
850 logNormalizationConstant: 1.38857
870 auto priorNoise = noiseModel::Diagonal::Sigmas(
878 auto noise_model = noiseModel::Isotropic::Sigma(3, 1.0);
879 std::vector<NoiseModelFactor::shared_ptr> motion_models = {
880 std::make_shared<PlanarMotionModel>(
X(0),
X(1),
Pose2(0, 0, 0),
887 auto measurementNoise = noiseModel::Diagonal::Sigmas(
890 Rot2 bearing11 = Rot2::fromDegrees(45), bearing22 = Rot2::fromDegrees(90);
891 double range11 =
std::sqrt(4.0 + 4.0), range22 = 2.0;
895 X(0),
L(0), bearing11, range11, measurementNoise);
897 X(1),
L(1), bearing22, range22, measurementNoise);
901 initialEstimate.insert(
X(0),
Pose2(0.5, 0.0, 0.2));
902 initialEstimate.insert(
X(1),
Pose2(2.3, 0.1, -0.2));
903 initialEstimate.insert(
L(0),
Point2(1.8, 2.1));
904 initialEstimate.insert(
L(1),
Point2(4.1, 1.8));
912 const auto [hybridBayesNet, remainingFactorGraph] =
932 const std::vector<double> &
means,
const std::vector<double> &
sigmas,
933 DiscreteKey &
m1,
double x0_measurement,
double measurement_noise = 1
e-3) {
934 auto model0 = noiseModel::Isotropic::Sigma(1,
sigmas[0]);
935 auto model1 = noiseModel::Isotropic::Sigma(1,
sigmas[1]);
936 auto prior_noise = noiseModel::Isotropic::Sigma(1, measurement_noise);
939 std::make_shared<BetweenFactor<double>>(
X(0),
X(1),
means[0], model0);
941 std::make_shared<BetweenFactor<double>>(
X(0),
X(1),
means[1],
model1);
946 std::vector<NonlinearFactorValuePair>
factors{{
f0, 0.0}, {
f1, 0.0}};
973 double x0 = 0.0,
x1 = 1.75;
977 std::vector<double>
means = {0.0, 2.0},
sigmas = {1
e-0, 1
e-0};
1006 auto prior_noise = noiseModel::Isotropic::Sigma(1, 1
e-3);
1049 double x0 = 1.0,
x1 = 1.0;
1053 std::vector<double>
means = {0.0, 0.0},
sigmas = {1e2, 1
e-2};
1060 auto hbn = hgfg->eliminateSequential();
1081 double x0 = 0.0,
x1 = 0.8;
1085 std::vector<double>
means = {0.0, 1.0},
sigmas = {1
e-2, 1
e-2};
1087 double prior_sigma = 1
e-2;
1092 X(1), 1.2, noiseModel::Isotropic::Sigma(1, prior_sigma)));
1097 auto hbn = hgfg->eliminateSequential();
1102 Values expected_first_result;
1103 expected_first_result.
insert(
X(0), 0.0666666666667);
1104 expected_first_result.
insert(
X(1), 1.13333333333);
1110 hbn = hgfg->eliminateSequential();
1111 delta = hbn->optimize();