DiscreteConditional.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 
19 #include <gtsam/base/Testable.h>
20 #include <gtsam/base/debug.h>
21 #include <gtsam/base/utilities.h>
23 #include <gtsam/discrete/Ring.h>
26 
27 #include <algorithm>
28 #include <cassert>
29 #include <random>
30 #include <set>
31 #include <stdexcept>
32 #include <string>
33 #include <utility>
34 #include <vector>
35 
36 using namespace std;
37 using std::pair;
38 using std::stringstream;
39 using std::vector;
40 namespace gtsam {
41 
42 // Instantiate base class
43 template class GTSAM_EXPORT
45 
46 /* ************************************************************************** */
47 DiscreteConditional::DiscreteConditional(const size_t nrFrontals,
48  const DiscreteFactor& f)
49  : BaseFactor((f / f.sum(nrFrontals))->toDecisionTreeFactor()),
50  BaseConditional(nrFrontals) {}
51 
52 /* ************************************************************************** */
54  const DiscreteKeys& keys,
55  const ADT& potentials)
56  : BaseFactor(keys, potentials), BaseConditional(nrFrontals) {}
57 
58 /* ************************************************************************** */
60  const DecisionTreeFactor& marginal)
61  : BaseFactor(joint / marginal),
62  BaseConditional(joint.size() - marginal.size()) {}
63 
64 /* ************************************************************************** */
66  const DecisionTreeFactor& marginal,
67  const Ordering& orderedKeys)
68  : DiscreteConditional(joint, marginal) {
69  keys_.clear();
70  keys_.insert(keys_.end(), orderedKeys.begin(), orderedKeys.end());
71 }
72 
73 /* ************************************************************************** */
75  : BaseFactor(signature.discreteKeys(), signature.cpt()),
76  BaseConditional(1) {}
77 
78 /* ************************************************************************** */
80  const DiscreteConditional& other) const {
81  // If the root is a nullptr, we have a TableDistribution
82  // TODO(Varun) Revisit this hack after RSS2025 submission
83  if (!other.root_) {
84  DiscreteConditional dc(other.nrFrontals(), other.toDecisionTreeFactor());
85  return dc * (*this);
86  }
87 
88  // Take union of frontal keys
89  std::set<Key> newFrontals;
90  for (auto&& key : this->frontals()) newFrontals.insert(key);
91  for (auto&& key : other.frontals()) newFrontals.insert(key);
92 
93  // Check if frontals overlapped
94  if (nrFrontals() + other.nrFrontals() > newFrontals.size())
95  throw std::invalid_argument(
96  "DiscreteConditional::operator* called with overlapping frontal keys.");
97 
98  // Now, add cardinalities.
100  for (auto&& key : frontals())
101  discreteKeys.emplace_back(key, cardinality(key));
102  for (auto&& key : other.frontals())
103  discreteKeys.emplace_back(key, other.cardinality(key));
104 
105  // Sort
106  std::sort(discreteKeys.begin(), discreteKeys.end());
107 
108  // Add parents to set, to make them unique
109  std::set<DiscreteKey> parents;
110  for (auto&& key : this->parents())
111  if (!newFrontals.count(key)) parents.emplace(key, cardinality(key));
112  for (auto&& key : other.parents())
113  if (!newFrontals.count(key)) parents.emplace(key, other.cardinality(key));
114 
115  // Finally, add parents to keys, in order
116  for (auto&& dk : parents) discreteKeys.push_back(dk);
117 
119  return DiscreteConditional(newFrontals.size(), discreteKeys, product);
120 }
121 
122 /* ************************************************************************** */
124  if (nrParents() > 0)
125  throw std::invalid_argument(
126  "DiscreteConditional::marginal: single argument version only valid for "
127  "fully specified joint distributions (i.e., no parents).");
128 
129  // Calculate the keys as the frontal keys without the given key.
131 
132  // Calculate sum
133  ADT adt(*this);
134  for (auto&& k : frontals())
135  if (k != key) adt = adt.sum(k, cardinality(k));
136 
137  // Return new factor
138  return DiscreteConditional(1, discreteKeys, adt);
139 }
140 
141 /* ************************************************************************** */
142 void DiscreteConditional::print(const string& s,
143  const KeyFormatter& formatter) const {
144  cout << s << " P( ";
145  for (const_iterator it = beginFrontals(); it != endFrontals(); ++it) {
146  cout << formatter(*it) << " ";
147  }
148  if (nrParents()) {
149  cout << "| ";
150  for (const_iterator it = beginParents(); it != endParents(); ++it) {
151  cout << formatter(*it) << " ";
152  }
153  }
154  cout << "):\n";
155  ADT::print("", formatter);
156  cout << endl;
157 }
158 
159 /* ************************************************************************** */
161  double tol) const {
162  if (!dynamic_cast<const BaseFactor*>(&other)) {
163  return false;
164  } else {
165  const BaseFactor& f(static_cast<const BaseFactor&>(other));
166  return BaseFactor::equals(f, tol);
167  }
168 }
169 
170 /* ************************************************************************** */
172  const DiscreteValues& given, bool forceComplete) const {
173  // Get the big decision tree with all the levels, and then go down the
174  // branches based on the value of the parent variables.
175  DiscreteConditional::ADT adt(*this);
176  size_t value;
177  for (Key j : parents()) {
178  try {
179  value = given.at(j);
180  adt = adt.choose(j, value); // ADT keeps getting smaller.
181  } catch (std::out_of_range&) {
182  if (forceComplete) {
183  given.print("parentsValues: ");
184  throw runtime_error(
185  "DiscreteConditional::choose: parent value missing");
186  }
187  }
188  }
189  return adt;
190 }
191 
192 /* ************************************************************************** */
194  const DiscreteValues& given) const {
195  ADT adt = choose(given, false); // P(F|S=given)
196 
197  // Collect all keys not in given.
198  DiscreteKeys dKeys;
199  for (Key j : frontals()) {
200  dKeys.emplace_back(j, this->cardinality(j));
201  }
202  for (size_t i = nrFrontals(); i < size(); i++) {
203  Key j = keys_[i];
204  if (given.count(j) == 0) {
205  dKeys.emplace_back(j, this->cardinality(j));
206  }
207  }
208  return std::make_shared<DiscreteConditional>(nrFrontals(), dKeys, adt);
209 }
210 
211 /* ************************************************************************** */
213  const DiscreteValues& frontalValues) const {
214  // Get the big decision tree with all the levels, and then go down the
215  // branches based on the value of the frontal variables.
216  ADT adt(*this);
217  size_t value;
218  for (Key j : frontals()) {
219  try {
220  value = frontalValues.at(j);
221  adt = adt.choose(j, value); // ADT keeps getting smaller.
222  } catch (exception&) {
223  frontalValues.print("frontalValues: ");
224  throw runtime_error("DiscreteConditional::choose: frontal value missing");
225  }
226  }
227 
228  // Convert ADT to factor.
230  for (Key j : parents()) {
231  discreteKeys.emplace_back(j, this->cardinality(j));
232  }
233  return std::make_shared<DecisionTreeFactor>(discreteKeys, adt);
234 }
235 
236 /* ****************************************************************************/
238  size_t frontal) const {
239  if (nrFrontals() != 1)
240  throw std::invalid_argument(
241  "Single value likelihood can only be invoked on single-variable "
242  "conditional");
244  values.emplace(keys_[0], frontal);
245  return likelihood(values);
246 }
247 
248 /* ************************************************************************** */
249 size_t DiscreteConditional::argmax(const DiscreteValues& parentsValues) const {
250  ADT pFS = choose(parentsValues, true); // P(F|S=parentsValues)
251 
252  // Initialize
253  size_t maxValue = 0;
254  double maxP = 0;
255  DiscreteValues values = parentsValues;
256 
257  assert(nrFrontals() == 1);
258  Key j = firstFrontalKey();
259  for (size_t value = 0; value < cardinality(j); value++) {
260  values[j] = value;
261  double pValueS = (*this)(values);
262  // Update MPE solution if better
263  if (pValueS > maxP) {
264  maxP = pValueS;
265  maxValue = value;
266  }
267  }
268  return maxValue;
269 }
270 
271 /* ************************************************************************** */
273  std::mt19937_64* rng) const {
274  // throw if more than one frontal:
275  if (nrFrontals() != 1) {
276  throw std::invalid_argument(
277  "DiscreteConditional::sampleInPlace can only be called on single "
278  "variable conditionals");
279  }
280  Key j = firstFrontalKey();
281  // throw if values already contains j:
282  if (values->count(j) > 0) {
283  throw std::invalid_argument(
284  "DiscreteConditional::sampleInPlace: values already contains j");
285  }
286  size_t sampled = sample(*values, rng); // Sample variable given parents
287  (*values)[j] = sampled; // store result in partial solution
288 }
289 
290 /* ************************************************************************** */
291 size_t DiscreteConditional::sample(const DiscreteValues& parentsValues,
292  std::mt19937_64* rng) const {
293  // Get the correct conditional distribution
294  ADT pFS = choose(parentsValues, true); // P(F|S=parentsValues)
295 
296  // TODO(Duy): only works for one key now, seems horribly slow this way
297  if (nrFrontals() != 1) {
298  throw std::invalid_argument(
299  "DiscreteConditional::sample can only be called on single variable "
300  "conditionals");
301  }
302  Key key = firstFrontalKey();
303  size_t nj = cardinality(key);
304  vector<double> p(nj);
306  for (size_t value = 0; value < nj; value++) {
307  frontals[key] = value;
308  p[value] = pFS(frontals); // P(F=value|S=parentsValues)
309  if (p[value] == 1.0) {
310  return value; // shortcut exit
311  }
312  }
313 
314  // Check if rng is nullptr, then assign default
315  rng = (rng == nullptr) ? &kRandomNumberGenerator : rng;
316 
317  std::discrete_distribution<size_t> distribution(p.begin(), p.end());
318  return distribution(*rng);
319 }
320 
321 /* ************************************************************************** */
322 size_t DiscreteConditional::sample(size_t parent_value,
323  std::mt19937_64* rng) const {
324  if (nrParents() != 1)
325  throw std::invalid_argument(
326  "Single value sample() can only be invoked on single-parent "
327  "conditional");
329  values.emplace(keys_.back(), parent_value);
330  return sample(values, rng);
331 }
332 
333 /* ************************************************************************** */
334 size_t DiscreteConditional::sample(std::mt19937_64* rng) const {
335  if (nrParents() != 0)
336  throw std::invalid_argument(
337  "sample() can only be invoked on no-parent prior");
339  return sample(values, rng);
340 }
341 
342 /* ************************************************************************* */
343 vector<DiscreteValues> DiscreteConditional::frontalAssignments() const {
344  vector<pair<Key, size_t>> pairs;
345  for (Key key : frontals()) pairs.emplace_back(key, cardinalities_.at(key));
346  vector<pair<Key, size_t>> rpairs(pairs.rbegin(), pairs.rend());
347  return DiscreteValues::CartesianProduct(rpairs);
348 }
349 
350 /* ************************************************************************* */
351 vector<DiscreteValues> DiscreteConditional::allAssignments() const {
352  vector<pair<Key, size_t>> pairs;
353  for (Key key : parents()) pairs.emplace_back(key, cardinalities_.at(key));
354  for (Key key : frontals()) pairs.emplace_back(key, cardinalities_.at(key));
355  vector<pair<Key, size_t>> rpairs(pairs.rbegin(), pairs.rend());
356  return DiscreteValues::CartesianProduct(rpairs);
357 }
358 
359 /* ************************************************************************* */
360 // Print out signature.
361 static void streamSignature(const DiscreteConditional& conditional,
362  const KeyFormatter& keyFormatter,
363  stringstream* ss) {
364  *ss << "P(";
365  bool first = true;
366  for (Key key : conditional.frontals()) {
367  if (!first) *ss << ",";
368  *ss << keyFormatter(key);
369  first = false;
370  }
371  if (conditional.nrParents() > 0) {
372  *ss << "|";
373  bool first = true;
374  for (Key parent : conditional.parents()) {
375  if (!first) *ss << ",";
376  *ss << keyFormatter(parent);
377  first = false;
378  }
379  }
380  *ss << "):";
381 }
382 
383 /* ************************************************************************* */
384 std::string DiscreteConditional::markdown(const KeyFormatter& keyFormatter,
385  const Names& names) const {
386  stringstream ss;
387  ss << " *";
388  streamSignature(*this, keyFormatter, &ss);
389  ss << "*\n" << std::endl;
390  if (nrParents() == 0) {
391  // We have no parents, call factor method.
392  ss << BaseFactor::markdown(keyFormatter, names);
393  return ss.str();
394  }
395 
396  // Print out header.
397  ss << "|";
398  for (Key parent : parents()) {
399  ss << "*" << keyFormatter(parent) << "*|";
400  }
401 
402  auto frontalAssignments = this->frontalAssignments();
403  for (const auto& a : frontalAssignments) {
404  for (auto&& it = beginFrontals(); it != endFrontals(); ++it) {
405  size_t index = a.at(*it);
406  ss << DiscreteValues::Translate(names, *it, index);
407  }
408  ss << "|";
409  }
410  ss << "\n";
411 
412  // Print out separator with alignment hints.
413  ss << "|";
414  size_t n = frontalAssignments.size();
415  for (size_t j = 0; j < nrParents() + n; j++) ss << ":-:|";
416  ss << "\n";
417 
418  // Print out all rows.
419  size_t count = 0;
420  for (const auto& a : allAssignments()) {
421  if (count == 0) {
422  ss << "|";
423  for (auto&& it = beginParents(); it != endParents(); ++it) {
424  size_t index = a.at(*it);
425  ss << DiscreteValues::Translate(names, *it, index) << "|";
426  }
427  }
428  ss << operator()(a) << "|";
429  count = (count + 1) % n;
430  if (count == 0) ss << "\n";
431  }
432  return ss.str();
433 }
434 
435 /* ************************************************************************ */
436 string DiscreteConditional::html(const KeyFormatter& keyFormatter,
437  const Names& names) const {
438  stringstream ss;
439  ss << "<div>\n<p> <i>";
440  streamSignature(*this, keyFormatter, &ss);
441  ss << "</i></p>\n";
442  if (nrParents() == 0) {
443  // We have no parents, call factor method.
444  ss << BaseFactor::html(keyFormatter, names);
445  return ss.str();
446  }
447 
448  // Print out preamble.
449  ss << "<table class='DiscreteConditional'>\n <thead>\n";
450 
451  // Print out header row.
452  ss << " <tr>";
453  for (Key parent : parents()) {
454  ss << "<th><i>" << keyFormatter(parent) << "</i></th>";
455  }
456  auto frontalAssignments = this->frontalAssignments();
457  for (const auto& a : frontalAssignments) {
458  ss << "<th>";
459  for (auto&& it = beginFrontals(); it != endFrontals(); ++it) {
460  size_t index = a.at(*it);
461  ss << DiscreteValues::Translate(names, *it, index);
462  }
463  ss << "</th>";
464  }
465  ss << "</tr>\n";
466 
467  // Finish header and start body.
468  ss << " </thead>\n <tbody>\n";
469 
470  // Output all rows, one per assignment:
471  size_t count = 0, n = frontalAssignments.size();
472  for (const auto& a : allAssignments()) {
473  if (count == 0) {
474  ss << " <tr>";
475  for (auto&& it = beginParents(); it != endParents(); ++it) {
476  size_t index = a.at(*it);
477  ss << "<th>" << DiscreteValues::Translate(names, *it, index) << "</th>";
478  }
479  }
480  ss << "<td>" << operator()(a) << "</td>"; // value
481  count = (count + 1) % n;
482  if (count == 0) ss << "</tr>\n";
483  }
484 
485  // Finish up
486  ss << " </tbody>\n</table>\n</div>";
487  return ss.str();
488 }
489 
490 /* ************************************************************************* */
492  return this->operator()(x.discrete());
493 }
494 
495 /* ************************************************************************* */
497  const Ordering& keys) const {
498  return BaseFactor::max(keys);
499 }
500 
501 /* ************************************************************************* */
502 void DiscreteConditional::prune(size_t maxNrAssignments) {
503  // Get as DiscreteConditional so the probabilities are normalized
504  DiscreteConditional pruned(nrFrontals(), BaseFactor::prune(maxNrAssignments));
505  this->root_ = pruned.root_;
506 }
507 
508 /* ************************************************************************ */
511  for (auto [key, value] : given) {
512  tree = tree.choose(key, value);
513  }
514 
515  // Get the leftover DiscreteKey frontals
517  std::for_each(this->frontals().begin(), this->frontals().end(), [&](Key key) {
518  // Check if frontal key exists in given, if not add to new frontals
519  if (given.count(key) == 0) {
520  frontals.emplace_back(key, this->cardinalities_.at(key));
521  }
522  });
523  // Get the leftover DiscreteKey parents
525  std::for_each(this->parents().begin(), this->parents().end(), [&](Key key) {
526  // Check if parent key exists in given, if not add to new parents
527  if (given.count(key) == 0) {
528  parents.emplace_back(key, this->cardinalities_.at(key));
529  }
530  });
531 
532  DiscreteKeys allDkeys(frontals);
533  allDkeys.insert(allDkeys.end(), parents.begin(), parents.end());
534 
535  // Update the conditional
536  this->keys_ = allDkeys.indices();
537  this->cardinalities_ = allDkeys.cardinalities();
538  this->root_ = tree.root_;
539  this->nrFrontals_ = frontals.size();
540 }
541 
542 /* ************************************************************************* */
543 double DiscreteConditional::negLogConstant() const { return 0.0; }
544 
545 /* ************************************************************************* */
546 
547 } // namespace gtsam
gtsam::DiscreteValues::print
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const
print required by Testable.
Definition: DiscreteValues.cpp:43
gtsam::DecisionTreeFactor
Definition: DecisionTreeFactor.h:45
gtsam::HybridValues
Definition: HybridValues.h:37
rng
static std::mt19937 rng
Definition: timeFactorOverhead.cpp:31
s
RealScalar s
Definition: level1_cplx_impl.h:126
Testable.h
Concept check for values that can be used in unit tests.
keys
const KeyVector keys
Definition: testRegularImplicitSchurFactor.cpp:40
tree
Definition: testExpression.cpp:212
gtsam::DiscreteFactor::cardinalities_
std::map< Key, size_t > cardinalities_
Map of Keys and their cardinalities.
Definition: DiscreteFactor.h:57
x
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition: gnuplot_common_settings.hh:12
gtsam::DiscreteConditional::operator*
DiscreteConditional operator*(const DiscreteConditional &other) const
Combine two conditionals, yielding a new conditional with the union of the frontal keys,...
Definition: DiscreteConditional.cpp:79
gtsam::DecisionTreeFactor::prune
DecisionTreeFactor prune(size_t maxNrAssignments) const
Prune the decision tree of discrete variables.
Definition: DecisionTreeFactor.cpp:512
gtsam::DiscreteConditional::equals
bool equals(const DiscreteFactor &other, double tol=1e-9) const override
GTSAM-style equals.
Definition: DiscreteConditional.cpp:160
formatter
const KeyFormatter & formatter
Definition: treeTraversal-inst.h:204
different_sigmas::values
HybridValues values
Definition: testHybridBayesNet.cpp:247
gtsam::DiscreteKeys
DiscreteKeys is a set of keys that can be assembled using the & operator.
Definition: DiscreteKey.h:41
DiscreteConditional.h
gtsam::DiscreteConditional::markdown
std::string markdown(const KeyFormatter &keyFormatter=DefaultKeyFormatter, const Names &names={}) const override
Render as markdown table.
Definition: DiscreteConditional.cpp:384
gtsam::DecisionTree::choose
DecisionTree choose(const L &label, size_t index) const
Definition: DecisionTree.h:391
gtsam::Factor::begin
const_iterator begin() const
Definition: Factor.h:146
gtsam::DecisionTreeFactor::shared_ptr
std::shared_ptr< DecisionTreeFactor > shared_ptr
Definition: DecisionTreeFactor.h:51
gtsam::DiscreteConditional::html
std::string html(const KeyFormatter &keyFormatter=DefaultKeyFormatter, const Names &names={}) const override
Render as html table.
Definition: DiscreteConditional.cpp:436
utilities.h
Ring::mul
static double mul(const double &a, const double &b)
Definition: Ring.h:31
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::operator()
double operator()(const HybridValues &x) const
Evaluate probability density, sugar.
Definition: Conditional.h:163
gtsam::AlgebraicDecisionTree< Key >
size
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
ss
static std::stringstream ss
Definition: testBTree.cpp:31
n
int n
Definition: BiCGSTAB_simple.cpp:1
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::endParents
DecisionTreeFactor ::const_iterator endParents() const
Definition: Conditional.h:189
gtsam::DiscreteConditional::marginal
DiscreteConditional marginal(Key key) const
Definition: DiscreteConditional.cpp:123
gtsam::DiscreteConditional::allAssignments
std::vector< DiscreteValues > allAssignments() const
Return all assignments for frontal and parent variables.
Definition: DiscreteConditional.cpp:351
gtsam::DecisionTree< Key, double >::root_
NodePtr root_
A DecisionTree just contains the root. TODO(dellaert): make protected.
Definition: DecisionTree.h:149
gtsam::DiscreteConditional::print
void print(const std::string &s="Discrete Conditional: ", const KeyFormatter &formatter=DefaultKeyFormatter) const override
GTSAM-style print.
Definition: DiscreteConditional.cpp:142
j
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2
gtsam::DiscreteValues::CartesianProduct
static std::vector< DiscreteValues > CartesianProduct(const DiscreteKeys &keys)
Return a vector of DiscreteValues, one for each possible combination of values.
Definition: DiscreteValues.h:148
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::endFrontals
DecisionTreeFactor ::const_iterator endFrontals() const
Definition: Conditional.h:183
gtsam::KeyFormatter
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
Signature.h
signatures for conditional densities
gtsam::DiscreteConditional::frontalAssignments
std::vector< DiscreteValues > frontalAssignments() const
Return all assignments for frontal variables.
Definition: DiscreteConditional.cpp:343
gtsam::streamSignature
static void streamSignature(const DiscreteConditional &conditional, const KeyFormatter &keyFormatter, stringstream *ss)
Definition: DiscreteConditional.cpp:361
gtsam::DecisionTreeFactor::equals
bool equals(const DiscreteFactor &other, double tol=1e-9) const override
equality
Definition: DecisionTreeFactor.cpp:46
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::nrFrontals_
size_t nrFrontals_
Definition: Conditional.h:67
gtsam::DiscreteConditional::sampleInPlace
void sampleInPlace(DiscreteValues *parentsValues, std::mt19937_64 *rng=nullptr) const
Sample in place with optional PRNG, stores result in partial solution.
Definition: DiscreteConditional.cpp:272
gtsam::DiscreteConditional::negLogConstant
double negLogConstant() const override
Definition: DiscreteConditional.cpp:543
gtsam::DiscreteConditional::evaluate
double evaluate(const HybridValues &x) const override
Definition: DiscreteConditional.cpp:491
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::beginFrontals
DecisionTreeFactor ::const_iterator beginFrontals() const
Definition: Conditional.h:180
gtsam::DiscreteConditional::argmax
size_t argmax(const DiscreteValues &parentsValues=DiscreteValues()) const
Return assignment for single frontal variable that maximizes value.
Definition: DiscreteConditional.cpp:249
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >
gtsam::DecisionTree< Key, double >::apply
DecisionTree apply(const Unary &op) const
Definition: DecisionTree-inl.h:1003
gtsam::Factor::end
const_iterator end() const
Definition: Factor.h:149
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::parents
Parents parents() const
Definition: Conditional.h:148
gtsam::DiscreteConditional::likelihood
DecisionTreeFactor::shared_ptr likelihood(const DiscreteValues &frontalValues) const
Definition: DiscreteConditional.cpp:212
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::nrFrontals
size_t nrFrontals() const
Definition: Conditional.h:131
gtsam::AlgebraicDecisionTree::sum
double sum() const
Compute sum of all values.
Definition: AlgebraicDecisionTree.h:211
key
const gtsam::Symbol key('X', 0)
gtsam::DiscreteConditional::shared_ptr
std::shared_ptr< This > shared_ptr
shared_ptr to this class
Definition: DiscreteConditional.h:44
tree::f
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Definition: testExpression.cpp:218
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::beginParents
DecisionTreeFactor ::const_iterator beginParents() const
Definition: Conditional.h:186
gtsam::DiscreteFactor::cardinality
size_t cardinality(Key j) const
Definition: DiscreteFactor.h:99
process_shonan_timing_results.names
dictionary names
Definition: process_shonan_timing_results.py:175
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::firstFrontalKey
Key firstFrontalKey() const
Definition: Conditional.h:137
gtsam::DiscreteConditional
Definition: DiscreteConditional.h:38
a
ArrayXXi a
Definition: Array_initializer_list_23_cxx11.cpp:1
gtsam::Factor::const_iterator
KeyVector::const_iterator const_iterator
Const iterator over keys.
Definition: Factor.h:83
gtsam
traits
Definition: ABC.h:17
gtsam::DecisionTreeFactor::max
double max() const override
Find the maximum value in the factor.
Definition: DecisionTreeFactor.h:211
gtsam::Factor::keys_
KeyVector keys_
The keys involved in this factor.
Definition: Factor.h:88
gtsam::DiscreteFactor::shared_ptr
std::shared_ptr< DiscreteFactor > shared_ptr
shared_ptr to this class
Definition: DiscreteFactor.h:45
kRandomNumberGenerator
static std::mt19937_64 kRandomNumberGenerator(42)
Global default pseudo-random number generator object. In wrappers we can access std::mt19937_64 via g...
gtsam::DiscreteFactor::Names
DiscreteValues::Names Names
Translation table from values to strings.
Definition: DiscreteFactor.h:190
gtsam::DiscreteValues
Definition: DiscreteValues.h:34
gtsam::AlgebraicDecisionTree< Key >::print
void print(const std::string &s="", const typename Base::LabelFormatter &labelFormatter=&DefaultFormatter) const
print method customized to value type double.
Definition: AlgebraicDecisionTree.h:254
gtsam::Factor::keys
const KeyVector & keys() const
Access the factor's involved variable keys.
Definition: Factor.h:143
std
Definition: BFloat16.h:88
gtsam::HybridValues::discrete
const DiscreteValues & discrete() const
Return the discrete values.
Definition: HybridValues.cpp:57
p
float * p
Definition: Tutorial_Map_using.cpp:9
Ring.h
Real Ring definition.
gtsam::DecisionTreeFactor::html
std::string html(const KeyFormatter &keyFormatter=DefaultKeyFormatter, const Names &names={}) const override
Render as html table.
Definition: DecisionTreeFactor.cpp:351
product
void product(const MatrixType &m)
Definition: product.h:20
gtsam::DiscreteConditional::DiscreteConditional
DiscreteConditional()
Default constructor needed for serialization.
Definition: DiscreteConditional.h:55
gtsam::tol
const G double tol
Definition: Group.h:79
gtsam::DiscreteConditional::choose
shared_ptr choose(const DiscreteValues &given) const
< DiscreteValues version
Definition: DiscreteConditional.cpp:193
gtsam::DiscreteFactor::discreteKeys
DiscreteKeys discreteKeys() const
Return all the discrete keys associated with this factor.
Definition: DiscreteFactor.cpp:37
gtsam::DiscreteFactor
Definition: DiscreteFactor.h:40
gtsam::DiscreteValues::Translate
static std::string Translate(const Names &names, Key key, size_t index)
Translate an integer index value for given key to a string.
Definition: DiscreteValues.cpp:96
gtsam::DiscreteConditional::sample
virtual size_t sample(const DiscreteValues &parentsValues, std::mt19937_64 *rng=nullptr) const
Definition: DiscreteConditional.cpp:291
gtsam::Factor::size
size_t size() const
Definition: Factor.h:160
gtsam::Key
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:97
gtsam::DiscreteConditional::removeDiscreteModes
void removeDiscreteModes(const DiscreteValues &given)
Remove the discrete modes whose assignments are given to us. Only applies to discrete conditionals.
Definition: DiscreteConditional.cpp:509
HybridValues.h
gtsam::Ordering
Definition: inference/Ordering.h:33
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::frontals
Frontals frontals() const
Definition: Conditional.h:145
gtsam::DecisionTreeFactor::markdown
std::string markdown(const KeyFormatter &keyFormatter=DefaultKeyFormatter, const Names &names={}) const override
Render as markdown table.
Definition: DecisionTreeFactor.cpp:320
gtsam::Conditional< DecisionTreeFactor, DiscreteConditional >::nrParents
size_t nrParents() const
Definition: Conditional.h:134
test_callbacks.value
value
Definition: test_callbacks.py:162
gtsam::Signature
Definition: Signature.h:54
i
int i
Definition: BiCGSTAB_step_by_step.cpp:9
pybind_wrapper_test_script.other
other
Definition: pybind_wrapper_test_script.py:42
k
static constexpr double k
Definition: GEKF_Rot3Example.cpp:31
debug.h
Global debugging flags.
gtsam::DiscreteConditional::prune
virtual void prune(size_t maxNrAssignments)
Prune the conditional.
Definition: DiscreteConditional.cpp:502


gtsam
Author(s):
autogenerated on Wed May 28 2025 03:01:13