HybridBayesTree.cpp
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
28 
29 namespace gtsam {
30 
31 // Instantiate base class
32 template class BayesTreeCliqueBase<HybridBayesTreeClique,
33  HybridGaussianFactorGraph>;
34 template class BayesTree<HybridBayesTreeClique>;
35 
36 /* ************************************************************************* */
37 bool HybridBayesTree::equals(const This& other, double tol) const {
38  return Base::equals(other, tol);
39 }
40 
41 /* ************************************************************************* */
43  DiscreteBayesNet dbn;
44  DiscreteValues mpe;
45 
46  auto root = roots_.at(0);
47  // Access the clique and get the underlying hybrid conditional
48  HybridConditional::shared_ptr root_conditional = root->conditional();
49 
50  // The root should be discrete only, we compute the MPE
51  if (root_conditional->isDiscrete()) {
52  dbn.push_back(root_conditional->asDiscrete());
53  mpe = DiscreteFactorGraph(dbn).optimize();
54  } else {
55  throw std::runtime_error(
56  "HybridBayesTree root is not discrete-only. Please check elimination "
57  "ordering or use continuous factor graph.");
58  }
59 
61  return HybridValues(values, mpe);
62 }
63 
64 /* ************************************************************************* */
74  // The gaussian bayes tree that will be recursively created.
76  // Flag indicating if all the nodes are valid. Used in optimize().
77  bool valid_;
78 
87  const GaussianBayesTree::sharedNode& parentClique,
88  GaussianBayesTree* gbt, bool valid = true)
89  : assignment_(assignment),
90  parentClique_(parentClique),
91  gaussianbayesTree_(gbt),
92  valid_(valid) {}
93 
94  bool isValid() const { return valid_; }
95 
105  const HybridBayesTree::sharedNode& node,
107  // Extract the gaussian conditional from the Hybrid clique
108  HybridConditional::shared_ptr hybrid_conditional = node->conditional();
109 
111  if (hybrid_conditional->isHybrid()) {
112  conditional = (*hybrid_conditional->asMixture())(parentData.assignment_);
113  } else if (hybrid_conditional->isContinuous()) {
114  conditional = hybrid_conditional->asGaussian();
115  } else {
116  // Discrete only conditional, so we set to empty gaussian conditional
117  conditional = std::make_shared<GaussianConditional>();
118  }
119 
121  if (conditional) {
122  // Create the GaussianClique for the current node
123  clique = std::make_shared<GaussianBayesTree::Node>(conditional);
124  // Add the current clique to the GaussianBayesTree.
125  parentData.gaussianbayesTree_->addClique(clique,
126  parentData.parentClique_);
127  } else {
128  parentData.valid_ = false;
129  }
130 
131  // Create new HybridAssignmentData where the current node is the parent
132  // This will be passed down to the children nodes
133  HybridAssignmentData data(parentData.assignment_, clique,
134  parentData.gaussianbayesTree_, parentData.valid_);
135  return data;
136  }
137 };
138 
139 /* *************************************************************************
140  */
142  const DiscreteValues& assignment) const {
143  GaussianBayesTree gbt;
144  HybridAssignmentData rootData(assignment, 0, &gbt);
145  {
146  treeTraversal::no_op visitorPost;
147  // Limits OpenMP threads since we're mixing TBB and OpenMP
148  TbbOpenMPMixedScope threadLimiter;
151  visitorPost);
152  }
153 
154  if (!rootData.isValid()) {
155  return GaussianBayesTree();
156  }
157  return gbt;
158 }
159 
160 /* *************************************************************************
161  */
163  GaussianBayesTree gbt = this->choose(assignment);
164  // If empty GaussianBayesTree, means a clique is pruned hence invalid
165  if (gbt.size() == 0) {
166  return VectorValues();
167  }
168  VectorValues result = gbt.optimize();
169 
170  // Return the optimized bayes net result.
171  return result;
172 }
173 
174 /* ************************************************************************* */
175 void HybridBayesTree::prune(const size_t maxNrLeaves) {
176  auto discreteProbs = this->roots_.at(0)->conditional()->asDiscrete();
177 
178  DecisionTreeFactor prunedDiscreteProbs = discreteProbs->prune(maxNrLeaves);
179  discreteProbs->root_ = prunedDiscreteProbs.root_;
180 
182  struct HybridPrunerData {
184  DecisionTreeFactor prunedDiscreteProbs;
185  HybridPrunerData(const DecisionTreeFactor& prunedDiscreteProbs,
186  const HybridBayesTree::sharedNode& parentClique)
187  : prunedDiscreteProbs(prunedDiscreteProbs) {}
188 
197  static HybridPrunerData AssignmentPreOrderVisitor(
199  HybridPrunerData& parentData) {
200  // Get the conditional
201  HybridConditional::shared_ptr conditional = clique->conditional();
202 
203  // If conditional is hybrid, we prune it.
204  if (conditional->isHybrid()) {
205  auto gaussianMixture = conditional->asMixture();
206 
207  gaussianMixture->prune(parentData.prunedDiscreteProbs);
208  }
209  return parentData;
210  }
211  };
212 
213  HybridPrunerData rootData(prunedDiscreteProbs, 0);
214  {
215  treeTraversal::no_op visitorPost;
216  // Limits OpenMP threads since we're mixing TBB and OpenMP
217  TbbOpenMPMixedScope threadLimiter;
219  *this, rootData, HybridPrunerData::AssignmentPreOrderVisitor,
220  visitorPost);
221  }
222 }
223 
224 } // namespace gtsam
gtsam::HybridConditional::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: HybridConditional.h:65
DiscreteBayesNet.h
gtsam::DecisionTreeFactor
Definition: DecisionTreeFactor.h:44
gtsam::HybridAssignmentData::isValid
bool isValid() const
Definition: HybridBayesTree.cpp:94
gtsam::HybridValues
Definition: HybridValues.h:38
gtsam::DiscreteFactorGraph
Definition: DiscreteFactorGraph.h:98
treeTraversal-inst.h
DiscreteFactorGraph.h
gtsam::BayesTree< HybridBayesTreeClique >::roots_
Roots roots_
Definition: BayesTree.h:103
gtsam::HybridAssignmentData::HybridAssignmentData
HybridAssignmentData(const DiscreteValues &assignment, const GaussianBayesTree::sharedNode &parentClique, GaussianBayesTree *gbt, bool valid=true)
Construct a new Hybrid Assignment Data object.
Definition: HybridBayesTree.cpp:86
gtsam::HybridBayesTree
Definition: HybridBayesTree.h:62
gtsam::DecisionTreeFactor::prune
DecisionTreeFactor prune(size_t maxNrAssignments) const
Prune the decision tree of discrete variables.
Definition: DecisionTreeFactor.cpp:371
HybridBayesNet.h
A Bayes net of Gaussian Conditionals indexed by discrete keys.
gtsam::HybridAssignmentData::assignment_
const DiscreteValues assignment_
Definition: HybridBayesTree.cpp:72
GaussianJunctionTree.h
result
Values result
Definition: OdometryOptimize.cpp:8
gtsam::HybridAssignmentData::AssignmentPreOrderVisitor
static HybridAssignmentData AssignmentPreOrderVisitor(const HybridBayesTree::sharedNode &node, HybridAssignmentData &parentData)
A function used during tree traversal that operates on each node before visiting the node's children.
Definition: HybridBayesTree.cpp:104
gtsam::DecisionTree::root_
NodePtr root_
A DecisionTree just contains the root. TODO(dellaert): make protected.
Definition: DecisionTree.h:150
data
int data[]
Definition: Map_placement_new.cpp:1
parentData
DATA & parentData
Definition: treeTraversal-inst.h:45
gtsam::DiscreteBayesNet
Definition: DiscreteBayesNet.h:38
gtsam::VectorValues
Definition: VectorValues.h:74
gtsam::BayesTree< HybridBayesTreeClique >::clique
const sharedClique & clique(Key j) const
Definition: BayesTree.h:155
gtsam::HybridBayesTree::optimize
HybridValues optimize() const
Optimize the hybrid Bayes tree by computing the MPE for the current set of discrete variables and usi...
Definition: HybridBayesTree.cpp:42
HybridBayesTree.h
Hybrid Bayes Tree, the result of eliminating a HybridJunctionTree.
gtsam::GaussianBayesTree::optimize
VectorValues optimize() const
Definition: GaussianBayesTree.cpp:67
gtsam::HybridAssignmentData::gaussianbayesTree_
GaussianBayesTree * gaussianbayesTree_
Definition: HybridBayesTree.cpp:75
gtsam::HybridBayesTree::choose
GaussianBayesTree choose(const DiscreteValues &assignment) const
Get the Gaussian Bayes Tree which corresponds to a specific discrete value assignment.
Definition: HybridBayesTree.cpp:141
gtsam::treeTraversal::DepthFirstForestParallel
void DepthFirstForestParallel(FOREST &forest, DATA &rootData, VISITOR_PRE &visitorPre, VISITOR_POST &visitorPost, int problemSizeThreshold=10)
Definition: treeTraversal-inst.h:156
gtsam
traits
Definition: chartTesting.h:28
gtsam::GaussianBayesTree
Definition: GaussianBayesTree.h:49
gtsam::BayesTree::size
size_t size() const
Definition: BayesTree-inst.h:133
gtsam::DiscreteValues
Definition: DiscreteValues.h:34
leaf::values
leaf::MyValues values
gtsam::FactorGraph::push_back
IsDerived< DERIVEDFACTOR > push_back(std::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
Definition: FactorGraph.h:147
gtsam::GaussianConditional::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: GaussianConditional.h:46
gtsam::tol
const G double tol
Definition: Group.h:79
gtsam::HybridAssignmentData
Helper class for Depth First Forest traversal on the HybridBayesTree.
Definition: HybridBayesTree.cpp:71
gtsam::BayesTree< GaussianBayesTreeClique >::sharedNode
sharedClique sharedNode
Synonym for sharedClique (TODO: remove)
Definition: BayesTree.h:76
gtsam::HybridBayesTree::prune
void prune(const size_t maxNumberLeaves)
Prune the underlying Bayes tree.
Definition: HybridBayesTree.cpp:175
gtsam::BayesTree< HybridBayesTreeClique >::equals
bool equals(const This &other, double tol=1e-9) const
Definition: BayesTree-inst.h:269
BayesTreeCliqueBase-inst.h
Base class for cliques of a BayesTree.
gtsam::DiscreteFactorGraph::optimize
DiscreteValues optimize(OptionalOrderingType orderingType={}) const
Find the maximum probable explanation (MPE) by doing max-product.
Definition: DiscreteFactorGraph.cpp:189
BayesTree-inst.h
Bayes Tree is a tree of cliques of a Bayes Chain.
gtsam::HybridAssignmentData::valid_
bool valid_
Definition: HybridBayesTree.cpp:77
gtsam::TbbOpenMPMixedScope
Definition: types.h:162
gtsam::HybridAssignmentData::parentClique_
GaussianBayesTree::sharedNode parentClique_
Definition: HybridBayesTree.cpp:73
gtsam::HybridBayesTree::equals
bool equals(const This &other, double tol=1e-9) const
Definition: HybridBayesTree.cpp:37
pybind_wrapper_test_script.other
other
Definition: pybind_wrapper_test_script.py:42


gtsam
Author(s):
autogenerated on Tue Jun 25 2024 03:01:00