GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
BayesNet-inst.h
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 #pragma once
20 
23 
24 #include <fstream>
25 #include <string>
26 
27 namespace gtsam {
28 
29 /* ************************************************************************* */
30 template <class CONDITIONAL>
31 void BayesNet<CONDITIONAL>::print(const std::string& s,
32  const KeyFormatter& formatter) const {
33  std::cout << (s.empty() ? "" : s + " ") << std::endl;
34  std::cout << "size: " << this->size() << std::endl;
35  for (size_t i = 0; i < this->size(); i++) {
36  const auto& conditional = this->at(i);
37  std::stringstream ss;
38  ss << "conditional " << i << ": ";
39  if (conditional) conditional->print(ss.str(), formatter);
40  }
41 }
42 
43 /* ************************************************************************* */
44 template <class CONDITIONAL>
45 void BayesNet<CONDITIONAL>::dot(std::ostream& os,
46  const KeyFormatter& keyFormatter,
47  const DotWriter& writer) const {
48  writer.digraphPreamble(&os);
49 
50  // Create nodes for each variable in the graph
51  for (Key key : this->keys()) {
52  auto position = writer.variablePos(key);
53  writer.drawVariable(key, keyFormatter, position, &os);
54  }
55  os << "\n";
56 
57  // Reverse order as typically Bayes nets stored in reverse topological sort.
58  for (auto it = std::make_reverse_iterator(this->end());
59  it != std::make_reverse_iterator(this->begin()); ++it) {
60  const auto& conditional = *it;
61  auto frontals = conditional->frontals();
62  const Key me = frontals.front();
63  auto parents = conditional->parents();
64  for (const Key& p : parents) {
65  os << " var" << p << "->var" << me << "\n";
66  }
67  }
68 
69  os << "}";
70  std::flush(os);
71 }
72 
73 /* ************************************************************************* */
74 template <class CONDITIONAL>
75 std::string BayesNet<CONDITIONAL>::dot(const KeyFormatter& keyFormatter,
76  const DotWriter& writer) const {
77  std::stringstream ss;
78  dot(ss, keyFormatter, writer);
79  return ss.str();
80 }
81 
82 /* ************************************************************************* */
83 template <class CONDITIONAL>
84 void BayesNet<CONDITIONAL>::saveGraph(const std::string& filename,
85  const KeyFormatter& keyFormatter,
86  const DotWriter& writer) const {
87  std::ofstream of(filename.c_str());
88  dot(of, keyFormatter, writer);
89  of.close();
90 }
91 
92 /* ************************************************************************* */
93 template <class CONDITIONAL>
95  double sum = 0.;
96  for (const auto& gc : *this) {
97  if (gc) sum += gc->logProbability(x);
98  }
99  return sum;
100 }
101 
102 /* ************************************************************************* */
103 template <class CONDITIONAL>
104 double BayesNet<CONDITIONAL>::evaluate(const HybridValues& x) const {
105  return exp(-logProbability(x));
106 }
107 
108 /* ************************************************************************* */
109 
110 } // namespace gtsam
Definition: HybridValues.h:38
double dot(const V1 &a, const V2 &b)
Definition: Vector.h:195
std::optional< Vector2 > variablePos(Key key) const
Return variable position or none.
Definition: BayesNet.h:35
void dot(std::ostream &os, const KeyFormatter &keyFormatter=DefaultKeyFormatter, const DotWriter &writer=DotWriter()) const
Output to graphviz format, stream version.
Definition: BayesNet-inst.h:45
Bayes network.
void digraphPreamble(std::ostream *os) const
Write out preamble for digraph, including size.
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
DotWriter is a helper class for writing graphviz .dot files.
Definition: DotWriter.h:36
Definition: chartTesting.h:28
void drawVariable(Key key, const KeyFormatter &keyFormatter, const std::optional< Vector2 > &position, std::ostream *os) const
Create a variable dot fragment.
void saveGraph(const std::string &filename, const KeyFormatter &keyFormatter=DefaultKeyFormatter, const DotWriter &writer=DotWriter()) const
output to file with graphviz format.
Definition: BayesNet-inst.h:84
Factor Graph Base Class.
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
void print(const std::string &s="BayesNet", const KeyFormatter &formatter=DefaultKeyFormatter) const override
Definition: BayesNet-inst.h:31