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<MixtureFactor>();
123 auto nonlinearFactor = std::make_shared<BetweenFactor<double>>(
124 X(0),
X(1), 0.0, Isotropic::Sigma(1, 0.1));
126 auto discreteFactor = std::make_shared<DecisionTreeFactor>();
130 auto noise_model = noiseModel::Isotropic::Sigma(1, 1.0);
131 auto still = std::make_shared<MotionModel>(
X(0),
X(1), 0.0, noise_model),
132 moving = std::make_shared<MotionModel>(
X(0),
X(1), 1.0, noise_model);
134 std::vector<MotionModel::shared_ptr> components = {still, moving};
135 auto dcFactor = std::make_shared<MixtureFactor>(
139 Values linearizationPoint;
140 linearizationPoint.
insert<
double>(
X(0), 0);
141 linearizationPoint.
insert<
double>(
X(1), 1);
157 auto nonlinearFactor = std::make_shared<BetweenFactor<double>>(
158 X(0),
X(1), 0.0, Isotropic::Sigma(1, 0.1));
159 auto discreteFactor = std::make_shared<DecisionTreeFactor>();
161 auto noise_model = noiseModel::Isotropic::Sigma(1, 1.0);
162 auto still = std::make_shared<MotionModel>(
X(0),
X(1), 0.0, noise_model),
163 moving = std::make_shared<MotionModel>(
X(0),
X(1), 1.0, noise_model);
165 std::vector<MotionModel::shared_ptr> components = {still, moving};
173 contKeys = {
X(0),
X(1),
X(2)};
184 auto nonlinearFactor = std::make_shared<BetweenFactor<double>>();
191 auto discreteFactor = std::make_shared<DecisionTreeFactor>();
198 auto dcFactor = std::make_shared<MixtureFactor>();
206 auto gaussianFactor = std::make_shared<JacobianFactor>();
226 auto noise = noiseModel::Isotropic::Sigma(3, 1.0);
255 *
self.nonlinearFactorGraph.linearize(
self.linearizationPoint);
268 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
278 TEST(GaussianElimination, Eliminate_x0) {
303 TEST(HybridsGaussianElimination, Eliminate_x1) {
326 Values linearizationPoint) {
330 auto between_x0_x1 = std::make_shared<MotionModel>(
X(0),
X(1),
between,
331 Isotropic::Sigma(1, 1.0));
341 TEST(HybridGaussianElimination, EliminateHybrid_2_Variable) {
344 auto factors =
self.linearizedFactorGraph;
349 const auto [hybridConditionalMixture, factorOnModes] =
352 auto gaussianConditionalMixture =
353 dynamic_pointer_cast<GaussianMixture>(hybridConditionalMixture->inner());
355 CHECK(gaussianConditionalMixture);
362 auto discreteFactor = dynamic_pointer_cast<DecisionTreeFactor>(factorOnModes);
363 CHECK(discreteFactor);
365 EXPECT(discreteFactor->root_->isLeaf() ==
false);
378 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
381 const auto [hybridBayesNet, remainingFactorGraph] =
382 linearizedFactorGraph.eliminatePartialSequential(
ordering);
384 CHECK(hybridBayesNet);
393 CHECK(remainingFactorGraph);
405 fg.
add(
self.linearizedFactorGraph);
409 self.linearizedFactorGraph.eliminateSequential();
433 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
436 const auto [hybridBayesNet_partial, remainingFactorGraph_partial] =
437 linearizedFactorGraph.eliminatePartialSequential(
ordering);
441 for (
auto& factor : (*remainingFactorGraph_partial)) {
442 auto df = dynamic_pointer_cast<DiscreteFactor>(factor);
448 for (
size_t k = 0; k <
self.K - 1; k++)
ordering.push_back(
M(k));
455 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
456 for (
size_t k = 0; k <
self.K - 1; k++)
ordering.push_back(
M(k));
460 linearizedFactorGraph.eliminateSequential(
ordering);
462 CHECK(hybridBayesNet);
477 dynamic_pointer_cast<DiscreteConditional>(hybridBayesNet->at(3)->inner())
478 ->equals(*discreteBayesNet.
at(0)));
483 dynamic_pointer_cast<DiscreteConditional>(hybridBayesNet->at(4)->inner())
484 ->equals(*discreteBayesNet.
at(1)));
497 for (
size_t k = 0; k <
self.K; k++)
ordering.push_back(
X(k));
500 const auto [hybridBayesNet, remainingFactorGraph] =
501 linearizedFactorGraph.eliminatePartialSequential(
ordering);
503 #ifdef GTSAM_DT_MERGING
504 string expected_hybridFactorGraph = R
"(
575 factor 6: P( m1 | m0 ):
586 string expected_hybridFactorGraph = R
"(
659 factor 6: P( m1 | m0 ):
674 string expected_hybridBayesNet = R
"(
676 conditional 0: Hybrid P( x0 | x1 m0)
677 Discrete Keys = (m0, 2),
681 S[x1] = [ -0.0995037 ]
687 S[x1] = [ -0.0995037 ]
691 conditional 1: Hybrid P( x1 | x2 m0 m1)
692 Discrete Keys = (m0, 2), (m1, 2),
697 S[x2] = [ -0.0990196 ]
703 S[x2] = [ -0.0990196 ]
710 S[x2] = [ -0.0990196 ]
716 S[x2] = [ -0.0990196 ]
720 conditional 2: Hybrid P( x2 | m0 m1)
721 Discrete Keys = (m0, 2), (m1, 2),
770 auto priorNoise = noiseModel::Diagonal::Sigmas(
779 auto noise_model = noiseModel::Isotropic::Sigma(3, 1.0);
780 auto still = std::make_shared<PlanarMotionModel>(
X(0),
X(1),
Pose2(0, 0, 0),
782 moving = std::make_shared<PlanarMotionModel>(
X(0),
X(1),
odometry,
784 std::vector<PlanarMotionModel::shared_ptr> motion_models = {still, moving};
790 auto measurementNoise = noiseModel::Diagonal::Sigmas(
793 Rot2 bearing11 = Rot2::fromDegrees(45), bearing22 = Rot2::fromDegrees(90);
794 double range11 =
std::sqrt(4.0 + 4.0), range22 = 2.0;
798 X(0),
L(0), bearing11, range11, measurementNoise);
800 X(1),
L(1), bearing22, range22, measurementNoise);
804 initialEstimate.insert(
X(0),
Pose2(0.5, 0.0, 0.2));
805 initialEstimate.insert(
X(1),
Pose2(2.3, 0.1, -0.2));
806 initialEstimate.insert(
L(0),
Point2(1.8, 2.1));
807 initialEstimate.insert(
L(1),
Point2(4.1, 1.8));
815 const auto [hybridBayesNet, remainingFactorGraph] =