summaryrefslogtreecommitdiffstats
path: root/src/ml/dlib/examples/bayes_net_from_disk_ex.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 12:08:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 12:08:18 +0000
commit5da14042f70711ea5cf66e034699730335462f66 (patch)
tree0f6354ccac934ed87a2d555f45be4c831cf92f4a /src/ml/dlib/examples/bayes_net_from_disk_ex.cpp
parentReleasing debian version 1.44.3-2. (diff)
downloadnetdata-5da14042f70711ea5cf66e034699730335462f66.tar.xz
netdata-5da14042f70711ea5cf66e034699730335462f66.zip
Merging upstream version 1.45.3+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/ml/dlib/examples/bayes_net_from_disk_ex.cpp')
-rw-r--r--src/ml/dlib/examples/bayes_net_from_disk_ex.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/ml/dlib/examples/bayes_net_from_disk_ex.cpp b/src/ml/dlib/examples/bayes_net_from_disk_ex.cpp
new file mode 100644
index 000000000..eaab5881a
--- /dev/null
+++ b/src/ml/dlib/examples/bayes_net_from_disk_ex.cpp
@@ -0,0 +1,83 @@
+// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
+/*
+ This is an example illustrating the use of the Bayesian Network
+ inference utilities found in the dlib C++ library. In this example
+ we load a saved Bayesian Network from disk.
+*/
+
+
+#include <dlib/bayes_utils.h>
+#include <dlib/graph_utils.h>
+#include <dlib/graph.h>
+#include <dlib/directed_graph.h>
+#include <iostream>
+#include <fstream>
+
+
+using namespace dlib;
+using namespace std;
+
+// ----------------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ try
+ {
+ // This statement declares a bayesian network called bn. Note that a bayesian network
+ // in the dlib world is just a directed_graph object that contains a special kind
+ // of node called a bayes_node.
+ directed_graph<bayes_node>::kernel_1a_c bn;
+
+ if (argc != 2)
+ {
+ cout << "You must supply a file name on the command line. The file should "
+ << "contain a serialized Bayesian Network" << endl;
+ return 1;
+ }
+
+ ifstream fin(argv[1],ios::binary);
+
+ // Note that the saved networks produced by the bayes_net_gui_ex.cpp example can be deserialized
+ // into a network. So you can make your networks using that GUI if you like.
+ cout << "Loading the network from disk..." << endl;
+ deserialize(bn, fin);
+
+ cout << "Number of nodes in the network: " << bn.number_of_nodes() << endl;
+
+ // Let's compute some probability values using the loaded network using the join tree (aka. Junction
+ // Tree) algorithm.
+
+ // First we need to create an undirected graph which contains set objects at each node and
+ // edge. This long declaration does the trick.
+ typedef graph<dlib::set<unsigned long>::compare_1b_c, dlib::set<unsigned long>::compare_1b_c>::kernel_1a_c join_tree_type;
+ join_tree_type join_tree;
+
+ // Now we need to populate the join_tree with data from our bayesian network. The next two
+ // function calls do this. Explaining exactly what they do is outside the scope of this
+ // example. Just think of them as filling join_tree with information that is useful
+ // later on for dealing with our bayesian network.
+ create_moral_graph(bn, join_tree);
+ create_join_tree(join_tree, join_tree);
+
+ // Now we have a proper join_tree we can use it to obtain a solution to our
+ // bayesian network. Doing this is as simple as declaring an instance of
+ // the bayesian_network_join_tree object as follows:
+ bayesian_network_join_tree solution(bn, join_tree);
+
+
+ // now print out the probabilities for each node
+ cout << "Using the join tree algorithm:\n";
+ for (unsigned long i = 0; i < bn.number_of_nodes(); ++i)
+ {
+ // print out the probability distribution for node i.
+ cout << "p(node " << i <<") = " << solution.probability(i);
+ }
+ }
+ catch (exception& e)
+ {
+ cout << "exception thrown: " << e.what() << endl;
+ return 1;
+ }
+}
+
+