gtsam
Loading...
Searching...
No Matches
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
18
19#pragma once
20
23
24#include <fstream>
25#include <string>
26
27namespace gtsam {
28
29/* ************************************************************************* */
30template <class CONDITIONAL>
31void 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/* ************************************************************************* */
44template <class CONDITIONAL>
45void 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/* ************************************************************************* */
74template <class CONDITIONAL>
75std::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/* ************************************************************************* */
83template <class CONDITIONAL>
84void 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/* ************************************************************************* */
93template <class CONDITIONAL>
94double BayesNet<CONDITIONAL>::logProbability(const HybridValues& x) const {
95 double sum = 0.;
96 for (const auto& gc : *this) {
97 if (gc) sum += gc->logProbability(x);
98 }
99 return sum;
100}
101
102/* ************************************************************************* */
103template <class CONDITIONAL>
104double BayesNet<CONDITIONAL>::evaluate(const HybridValues& x) const {
105 return exp(-logProbability(x));
106}
107
108/* ************************************************************************* */
109
110} // namespace gtsam
Bayes network.
Factor Graph Base Class.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
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
double dot(const V1 &a, const V2 &b)
Dot product.
Definition Vector.h:191
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
HybridValues represents a collection of DiscreteValues and VectorValues.
Definition HybridValues.h:37
void print(const std::string &s="BayesNet", const KeyFormatter &formatter=DefaultKeyFormatter) const override
print out graph
Definition BayesNet-inst.h:31
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
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
size_t size() const
Definition FactorGraph.h:297
const_iterator end() const
Definition FactorGraph.h:342
const_iterator begin() const
Definition FactorGraph.h:339
const sharedFactor at(size_t i) const
Definition FactorGraph.h:306
DotWriter is a helper class for writing graphviz .dot files.
Definition DotWriter.h:36
void drawVariable(Key key, const KeyFormatter &keyFormatter, const std::optional< Vector2 > &position, std::ostream *os) const
Create a variable dot fragment.
Definition DotWriter.cpp:42
void digraphPreamble(std::ostream *os) const
Write out preamble for digraph, including size.
Definition DotWriter.cpp:36
std::optional< Vector2 > variablePos(Key key) const
Return variable position or none.
Definition DotWriter.cpp:79