51 using namespace gtsam;
59 std::mt19937_64
kRng(42);
75 {std::make_shared<GaussianConditional>(
X(0),
Z_3x1, I_3x3,
X(1), I_3x3),
76 std::make_shared<GaussianConditional>(
X(0), Vector3::Ones(), I_3x3,
X(1),
99 return {std::make_shared<JacobianFactor>(
key, I_3x3,
Z_3x1),
100 std::make_shared<JacobianFactor>(
key, I_3x3, Vector3::Ones())};
118 auto factor = std::dynamic_pointer_cast<TableFactor>(
result.second);
139 auto dc =
result->
at(2)->asDiscrete();
175 const double betweenSigma = 0.3, priorSigma = 0.1;
188 auto hgf = std::dynamic_pointer_cast<HybridGaussianFactor>(
graph.
at(2));
192 auto [factor0, scalar0] = (*hgf)(modeZero);
193 auto [
factor1, scalar1] = (*hgf)(modeOne);
198 auto betweenModel = noiseModel::Isotropic::Sigma(1, betweenSigma);
204 double expectedError0 = 0;
210 double expectedError1 = 0;
232 graph.discretePosterior(continuousValues);
233 const double sum = probPrime0 + probPrime1;
247 auto [gaussianFactor0, actualScalar0] = productFactor(modeZero);
248 EXPECT(gaussianFactor0.size() == 2);
252 auto [gaussianFactor1, actualScalar1] = productFactor(modeOne);
253 EXPECT(gaussianFactor1.size() == 2);
262 EXPECT(conditional->isHybrid());
263 auto p_x0_given_x1_m = conditional->asHybrid();
264 CHECK(p_x0_given_x1_m);
265 EXPECT(HybridGaussianConditional::CheckInvariants(*p_x0_given_x1_m, values1));
271 EXPECT(std::dynamic_pointer_cast<HybridGaussianFactor>(
factor));
272 auto phi_x1_m = std::dynamic_pointer_cast<HybridGaussianFactor>(
factor);
277 (*phi_x1_m)(modeZero).second, 1
e-9);
279 (*phi_x1_m)(modeOne).second, 1
e-9);
283 for (
auto &&
mode : {modeZero, modeOne}) {
284 const auto gc = (*p_x0_given_x1_m)(
mode);
290 double originalError = factors_x0.
error({continuousValues,
mode});
291 const double actualError =
gc->negLogConstant() +
292 gc->error(continuousValues) +
293 gf->error(continuousValues) +
scalar;
308 auto [gaussianFactor_x1_0, actualScalar_x1_0] = productFactor_x1(modeZero);
314 auto [gaussianFactor_x1_1, actualScalar_x1_1] = productFactor_x1(modeOne);
321 auto [conditional_x1, factor_x1] = factors_x1.
eliminate(ordering_x1);
324 CHECK(conditional_x1);
325 EXPECT(conditional_x1->isHybrid());
326 auto p_x1_given_m = conditional_x1->asHybrid();
333 auto phi_x1 = std::dynamic_pointer_cast<TableFactor>(factor_x1);
340 auto hybridBayesNet =
graph.eliminateSequential();
341 CHECK(hybridBayesNet);
347 hybridBayesNet->discretePosterior(continuousValues);
378 hybridBayesNet->discretePosterior(
delta.continuous());
478 auto pruned =
product.removeEmpty();
483 EXPECT(hybridConditional->isHybrid());
486 EXPECT(dynamic_pointer_cast<HybridGaussianFactor>(
factor));
493 Values expected_continuous;
494 expected_continuous.
insert<
double>(
X(0), 0);
495 expected_continuous.
insert<
double>(
X(1), 1);
496 expected_continuous.
insert<
double>(
X(2), 2);
497 expected_continuous.
insert<
double>(
X(3), 4);
498 Values result_continuous =
503 expected_discrete[
M(0)] = 1;
504 expected_discrete[
M(1)] = 1;
530 hybridBayesNet->discretePosterior(
delta.continuous());
538 hybridBayesNet =
graph.eliminateSequential();
541 delta = hybridBayesNet->optimize();
542 graphPosterior =
graph.discretePosterior(
delta.continuous());
543 bnPosterior = hybridBayesNet->discretePosterior(
delta.continuous());
550 const int num_measurements = 1;
556 auto actual = fg.collectProductFactor();
568 const GF
prior = gf->asGaussian();
591 auto compute_ratio = [&](
HybridValues *sample) ->
double {
597 double expected_ratio = compute_ratio(&sample);
600 for (
size_t i = 0;
i < num_samples;
i++) {
602 if (
std::abs(expected_ratio - compute_ratio(&sample)) > 1
e-6)
return false;
612 auto compute_ratio = [&](
HybridValues *sample) ->
double {
618 double expected_ratio = compute_ratio(&sample);
621 for (
size_t i = 0;
i < num_samples;
i++) {
624 if (
std::abs(expected_ratio - compute_ratio(&sample)) > 1
e-6)
return false;
632 const int num_measurements = 1;
646 const auto conditional0 = std::make_shared<GaussianConditional>(
647 X(0),
Vector1(14.1421), I_1x1 * 2.82843),
648 conditional1 = std::make_shared<GaussianConditional>(
649 X(0),
Vector1(10.1379), I_1x1 * 2.02759);
651 mode, std::vector{conditional0, conditional1});
657 const auto posterior = fg.eliminateSequential();
673 std::vector<std::pair<Vector, double>>
parms{{Z_1x1, 3}, {Z_1x1, 0.5}};
678 GaussianConditional::sharedMeanAndStddev(
X(0),
Vector1(5.0), 0.5));
696 const auto conditional0 = std::make_shared<GaussianConditional>(
697 X(0),
Vector1(10.1379), I_1x1 * 2.02759),
698 conditional1 = std::make_shared<GaussianConditional>(
699 X(0),
Vector1(14.1421), I_1x1 * 2.82843);
701 m1, std::vector{conditional0, conditional1});
707 const auto posterior = fg.eliminateSequential();
720 const int num_measurements = 2;
732 const auto conditional0 = std::make_shared<GaussianConditional>(
733 X(0),
Vector1(17.3205), I_1x1 * 3.4641),
734 conditional1 = std::make_shared<GaussianConditional>(
735 X(0),
Vector1(10.274), I_1x1 * 2.0548);
737 mode, std::vector{conditional0, conditional1});
745 const auto posterior = fg.eliminateSequential();
755 const int num_measurements = 2;
756 const bool manyModes =
true;
767 const auto posterior = fg.eliminateSequential();
781 std::vector<std::pair<Vector, double>> measurementModels{{Z_1x1, 3},
783 for (
size_t t : {0, 1, 2}) {
787 X(
t), measurementModels);
794 std::vector<std::pair<Vector, double>> motionModels{{Z_1x1, 0.2},
796 for (
size_t t : {2, 1}) {
801 X(
t - 1), motionModels);
808 bn.
push_back(GaussianConditional::sharedMeanAndStddev(
X(0), Z_1x1, 0.1));
835 fg1->push_back(*bn1);