dcsam
Factored inference for discrete-continuous smoothing and mapping
DiscreteMarginalsOrdered.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <gtsam/discrete/DiscreteFactorGraph.h>
12 #include <gtsam/discrete/DiscreteMarginals.h>
13 
14 #include <utility>
15 
16 #include "DCSAM_types.h"
17 
18 namespace dcsam {
19 
23 class DiscreteMarginalsOrdered : public gtsam::DiscreteMarginals {
24  public:
25  using Base = gtsam::DiscreteMarginals;
26  DiscreteMarginalsOrdered(const gtsam::DiscreteFactorGraph &graph,
27  const gtsam::Ordering::OrderingType &orderingType =
28  gtsam::Ordering::OrderingType::NATURAL)
29  : Base(gtsam::DiscreteFactorGraph()) {
30  gtsam::Ordering ordering;
31  if (orderingType == gtsam::Ordering::OrderingType::COLAMD) {
32  ordering = gtsam::Ordering::Colamd(graph);
33  } else if (orderingType == gtsam::Ordering::OrderingType::METIS) {
34  ordering = gtsam::Ordering::Metis(graph);
35  } else {
36  ordering = gtsam::Ordering::Natural(graph);
37  }
38  bayesTree_ = graph.eliminateMultifrontal(ordering, CustomEliminateDiscrete);
39  }
40 
41  static std::pair<gtsam::DiscreteConditional::shared_ptr,
42  gtsam::DecisionTreeFactor::shared_ptr>
43  CustomEliminateDiscrete(const gtsam::DiscreteFactorGraph &factors,
44  const gtsam::Ordering &frontalKeys) {
45  // PRODUCT: multiply all factors.
46  gtsam::DecisionTreeFactor product;
47  for (auto &factor : factors) {
48  if (!factor) {
49  std::cout << "Null factor in eliminate" << std::endl;
50  } else {
51  // Unsure why factors is getting a nullptr. Try simply ignoring:
52  product = (*factor) * product;
53  }
54  }
55 
56  // sum out frontals to get the factor on the separator.
57  gtsam::DecisionTreeFactor::shared_ptr sum = product.sum(frontalKeys);
58 
59  // NOTE: Sum keys seems to be empty often - is this normal?
60  // Ordering keys for the conditional so that frontalKeys is in front.
61  gtsam::Ordering orderedKeys;
62  orderedKeys.insert(orderedKeys.end(), frontalKeys.begin(),
63  frontalKeys.end());
64  orderedKeys.insert(orderedKeys.end(), sum->keys().begin(),
65  sum->keys().end());
66 
67  gtsam::DiscreteConditional::shared_ptr cond(
68  new gtsam::DiscreteConditional(product, *sum, orderedKeys));
69 
70  return std::make_pair(cond, sum);
71  }
72 };
73 
74 } // namespace dcsam
Some convenient types for DCSAM.
Simple discrete marginals class allowing specific ordering.
Definition: DiscreteMarginalsOrdered.h:23
gtsam::DiscreteMarginals Base
Definition: DiscreteMarginalsOrdered.h:25
DiscreteMarginalsOrdered(const gtsam::DiscreteFactorGraph &graph, const gtsam::Ordering::OrderingType &orderingType=gtsam::Ordering::OrderingType::NATURAL)
Definition: DiscreteMarginalsOrdered.h:26
static std::pair< gtsam::DiscreteConditional::shared_ptr, gtsam::DecisionTreeFactor::shared_ptr > CustomEliminateDiscrete(const gtsam::DiscreteFactorGraph &factors, const gtsam::Ordering &frontalKeys)
Definition: DiscreteMarginalsOrdered.h:43
Definition: DCContinuousFactor.h:24