40 using namespace gtsam;
75 const auto pAsia = std::make_shared<DiscreteConditional>(
Asia,
"4/6");
92 std::mt19937_64
rng(42);
134 gc1 =
hgc->choose(one.discrete());
136 GaussianConditional::CheckInvariants(*gc0,
vv);
137 GaussianConditional::CheckInvariants(*gc1,
vv);
138 GaussianConditional::CheckInvariants(*
px,
vv);
139 HybridGaussianConditional::CheckInvariants(*
hgc,
zero);
140 HybridGaussianConditional::CheckInvariants(*
hgc, one);
151 const double logP0 = chosen0.logProbability(
vv) +
log(0.4);
152 const double logP1 = chosen1.logProbability(
vv) +
log(0.6);
169 CHECK(pruned.at(0)->asHybrid());
174 const double error0 = chosen0.error(
vv) + gc0->negLogConstant() -
175 px->negLogConstant() -
log(0.4);
176 const double error1 = chosen1.error(
vv) + gc1->negLogConstant() -
177 px->negLogConstant() -
log(0.6);
211 auto df = std::dynamic_pointer_cast<DecisionTreeFactor>(
result.second);
214 std::vector<double>
ratio(2);
226 auto fgPosterior = fg.discretePosterior(xv);
233 const auto gc = GaussianConditional::sharedMeanAndStddev(
X(0), 2 * I_1x1,
X(1),
238 const auto hgc = std::make_shared<HybridGaussianConditional>(
Asia,
X(1),
parms);
240 const auto prior = std::make_shared<DiscreteConditional>(
Asia,
"99/1");
242 return std::make_shared<HybridConditional>(
c);
256 const double mixtureProbability =
hgc->evaluate(
values);
268 const auto [hybridBayesNet, remainingFactorGraph] =
269 s.linearizedFactorGraph().eliminatePartialSequential(
ordering);
272 assignment[
M(0)] = 1;
273 assignment[
M(1)] = 1;
274 assignment[
M(2)] = 0;
297 const auto [hybridBayesNet, remainingFactorGraph] =
298 s.linearizedFactorGraph().eliminatePartialSequential(
ordering);
301 assignment[
M(0)] = 1;
302 assignment[
M(1)] = 1;
303 assignment[
M(2)] = 1;
311 expected_delta.
insert(make_pair(
X(0), -Vector1::Ones()));
312 expected_delta.
insert(make_pair(
X(1), -Vector1::Ones()));
313 expected_delta.
insert(make_pair(
X(2), -Vector1::Ones()));
314 expected_delta.
insert(make_pair(
X(3), -Vector1::Ones()));
322 Switching s(4, 1.0, 0.1, {0, 1, 2, 3},
"1/1 1/1");
325 s.linearizedFactorGraph().eliminateSequential();
331 expectedAssignment[
M(0)] = 1;
332 expectedAssignment[
M(1)] = 1;
333 expectedAssignment[
M(2)] = 1;
337 expectedValues.
insert(
X(0), -Vector1::Ones());
338 expectedValues.
insert(
X(1), -Vector1::Ones());
339 expectedValues.
insert(
X(2), -Vector1::Ones());
340 expectedValues.
insert(
X(3), -Vector1::Ones());
362 s.linearizedFactorGraph().eliminateSequential();
369 auto discretePosterior = posterior->discretePosterior(
delta.continuous());
373 std::vector<double> leaves = {0.095516068, 0.31800092, 0.27798511, 0.3084979};
379 double logProbability = 0;
380 logProbability += posterior->at(0)->asHybrid()->logProbability(hybridValues);
381 logProbability += posterior->at(1)->asHybrid()->logProbability(hybridValues);
382 logProbability += posterior->at(2)->asHybrid()->logProbability(hybridValues);
384 posterior->at(3)->asDiscrete()->logProbability(hybridValues);
386 posterior->at(4)->asDiscrete()->logProbability(hybridValues);
395 [](
double error) { return exp(-error); })
399 double density =
exp(logProbability + negLogConstant) / normalizer;
409 s.linearizedFactorGraph().eliminateSequential();
416 auto prunedBayesNet = posterior->prune(2);
430 s.linearizedFactorGraph().eliminateSequential();
437 const double pruneDeadVariables = 0.99;
438 auto prunedBayesNet = posterior->prune(2, pruneDeadVariables);
441 EXPECT(prunedBayesNet.at(0)->isHybrid());
445 EXPECT(prunedBayesNet.at(1)->isContinuous());
448 EXPECT(prunedBayesNet.at(0)->isHybrid());
452 auto joint = prunedBayesNet.at(3)->asDiscrete();
463 s.linearizedFactorGraph().eliminateSequential();
475 std::vector<double> pruned_leaves = {0.0, 0.50758422, 0.0, 0.49241578};
481 double pruned_logProbability = 0;
482 pruned_logProbability +=
483 prunedBayesNet.
at(0)->asHybrid()->logProbability(hybridValues);
484 pruned_logProbability +=
485 prunedBayesNet.
at(1)->asHybrid()->logProbability(hybridValues);
486 pruned_logProbability +=
487 prunedBayesNet.
at(2)->asHybrid()->logProbability(hybridValues);
488 pruned_logProbability +=
489 prunedBayesNet.
at(3)->asDiscrete()->logProbability(hybridValues);
494 double pruned_normalizer =
496 [](
double error) { return exp(-error); })
498 double pruned_density =
499 exp(pruned_logProbability + pruned_negLogConstant) / pruned_normalizer;
509 s.linearizedFactorGraph().eliminateSequential();
513 for (
auto&& conditional : posterior->discreteMarginal()) {
514 joint = joint * (*conditional);
517 size_t maxNrLeaves = 3;
519 prunedDecisionTree.
prune(maxNrLeaves);
521 #ifdef GTSAM_DT_MERGING
532 std::vector<double>{0, 0, 0, 0.28739288, 0, 0.43106901, 0, 0.2815381});
536 auto pruned = posterior->prune(maxNrLeaves);
540 double probability) ->
double {
543 if (prunedDecisionTree(choices) == 0) {
552 CHECK(pruned.at(4)->asDiscrete());
553 auto pruned_discrete_conditionals = pruned.at(4)->asDiscrete();
554 auto discrete_conditional_tree =
555 std::dynamic_pointer_cast<DecisionTreeFactor::ADT>(
556 pruned_discrete_conditionals);
559 discrete_conditional_tree->apply(checker);
571 std::make_shared<BetweenFactor<double>>(
X(0),
X(1), 0,
noise_model);
573 std::make_shared<BetweenFactor<double>>(
X(0),
X(1), 1,
noise_model);
576 std::vector<NoiseModelFactor::shared_ptr>{zero_motion, one_motion});
582 double z0 = 0.0,
z1 = 1.0;
592 std::mt19937_64 gen(11);
595 vector<double> discrete_samples;
598 size_t num_samples = 1000;
599 for (
size_t i = 0;
i < num_samples;
i++) {
603 discrete_samples.push_back(sample.
discrete().at(
M(0)));
616 double discrete_sum =
617 std::accumulate(discrete_samples.begin(), discrete_samples.end(),
618 decltype(discrete_samples)::value_type(0));
623 #if __APPLE__ || _WIN32
640 Key z0 =
Z(0), f01 =
F(0);
645 auto prior_model = noiseModel::Isotropic::Sigma(1, 1
e-1);
646 auto measurement_model = noiseModel::Isotropic::Sigma(1, 2.0);
657 double sigma0 = 1e2,
sigma1 = 1
e-2;
658 auto model0 = noiseModel::Isotropic::Sigma(1, sigma0);
660 auto c0 = make_shared<GaussianConditional>(f01,
Vector1(
mu), I_1x1,
x1, I_1x1,
662 c1 = make_shared<GaussianConditional>(f01,
Vector1(
mu), I_1x1,
x1, I_1x1,
672 given.insert(f01,
Vector1(0.0));