summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/test/graph_labeler.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ml/dlib/dlib/test/graph_labeler.cpp472
1 files changed, 472 insertions, 0 deletions
diff --git a/ml/dlib/dlib/test/graph_labeler.cpp b/ml/dlib/dlib/test/graph_labeler.cpp
new file mode 100644
index 000000000..112873896
--- /dev/null
+++ b/ml/dlib/dlib/test/graph_labeler.cpp
@@ -0,0 +1,472 @@
+// Copyright (C) 2012 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#include <sstream>
+#include <string>
+#include <cstdlib>
+#include <ctime>
+#include <dlib/svm_threaded.h>
+#include <dlib/data_io.h>
+
+#include "tester.h"
+
+namespace
+{
+
+ using namespace test;
+ using namespace dlib;
+ using namespace std;
+
+
+
+ logger dlog("test.graph_cuts");
+
+
+ template <
+ typename graph_type,
+ typename samples_type,
+ typename labels_type
+ >
+ void make_data(
+ samples_type& samples,
+ labels_type& labels
+ )
+ {
+ //samples.clear();
+ //labels.clear();
+
+ std::vector<bool> label;
+ graph_type g;
+
+ // ---------------------------
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data = 0, 0, 1; label[0] = true;
+ g.node(1).data = 0, 0, 1; label[1] = true;
+ g.node(2).data = 0, 1, 0; label[2] = false;
+ g.node(3).data = 0, 1, 0; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ edge(g,0,1) = 1, 1;
+ edge(g,1,2) = 1, 1;
+ edge(g,2,3) = 1, 1;
+ edge(g,3,0) = 1, 1;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+
+ g.clear();
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data = 0, 0, 1; label[0] = true;
+ g.node(1).data = 0, 0, 0; label[1] = true;
+ g.node(2).data = 0, 1, 0; label[2] = false;
+ g.node(3).data = 0, 0, 0; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ edge(g,0,1) = 1, 0;
+ edge(g,1,2) = 0, 1;
+ edge(g,2,3) = 1, 0;
+ edge(g,3,0) = 0, 1;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+
+ g.clear();
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data = 0, 1, 0; label[0] = false;
+ g.node(1).data = 0, 1, 0; label[1] = false;
+ g.node(2).data = 0, 1, 0; label[2] = false;
+ g.node(3).data = 0, 0, 0; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ edge(g,0,1) = 1, 0;
+ edge(g,1,2) = 0, 1;
+ edge(g,2,3) = 1, 0;
+ edge(g,3,0) = 0, 1;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+ }
+
+
+
+
+ template <
+ typename graph_type,
+ typename samples_type,
+ typename labels_type
+ >
+ void make_data_sparse(
+ samples_type& samples,
+ labels_type& labels
+ )
+ {
+ //samples.clear();
+ //labels.clear();
+
+ std::vector<bool> label;
+ graph_type g;
+ typename graph_type::edge_type v;
+
+ // ---------------------------
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data[2] = 1; label[0] = true;
+ g.node(1).data[2] = 1; label[1] = true;
+ g.node(2).data[1] = 1; label[2] = false;
+ g.node(3).data[1] = 1; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+ g.add_edge(3,1);
+
+ v[0] = 1; v[1] = 1;
+ edge(g,0,1) = v;
+ edge(g,1,2) = v;
+ edge(g,2,3) = v;
+ edge(g,3,0) = v;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+
+ g.clear();
+ g.set_number_of_nodes(5);
+ label.resize(g.number_of_nodes());
+ g.node(0).data[2] = 1; label[0] = true;
+ g.node(1).data[0] = 0; label[1] = true;
+ g.node(2).data[1] = 1; label[2] = false;
+ g.node(3).data[0] = 0; label[3] = false;
+ label[4] = true;
+
+ g.add_edge(0,1);
+ g.add_edge(1,4);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ edge(g,0,1)[0] = 1;
+ edge(g,1,4)[0] = 1;
+ edge(g,1,2)[1] = 1;
+ edge(g,2,3)[0] = 1;
+ edge(g,3,0)[1] = 1;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+
+ g.clear();
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data[1] = 1; label[0] = false;
+ g.node(1).data[1] = 1; label[1] = false;
+ g.node(2).data[1] = 1; label[2] = false;
+ g.node(3).data[1] = 0; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ edge(g,0,1)[0] = 1;
+ edge(g,1,2)[1] = 1;
+ edge(g,2,3)[0] = 1;
+ edge(g,3,0)[1] = 1;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+ }
+
+
+
+
+
+
+ template <
+ typename graph_type,
+ typename samples_type,
+ typename labels_type
+ >
+ void make_data2(
+ samples_type& samples,
+ labels_type& labels
+ )
+ {
+ //samples.clear();
+ //labels.clear();
+
+ std::vector<bool> label;
+ graph_type g;
+
+ // ---------------------------
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data = 0, 0, 1; label[0] = true;
+ g.node(1).data = 0, 0, 1; label[1] = true;
+ g.node(2).data = 0, 1, 0; label[2] = false;
+ g.node(3).data = 0, 1, 0; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ edge(g,0,1) = 1, 1;
+ edge(g,1,2) = 1, 1;
+ edge(g,2,3) = 1, 1;
+ edge(g,3,0) = 1, 1;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+ }
+
+
+
+
+ template <
+ typename graph_type,
+ typename samples_type,
+ typename labels_type
+ >
+ void make_data2_sparse(
+ samples_type& samples,
+ labels_type& labels
+ )
+ {
+ //samples.clear();
+ //labels.clear();
+
+ std::vector<bool> label;
+ graph_type g;
+ typename graph_type::edge_type v;
+
+ // ---------------------------
+ g.set_number_of_nodes(4);
+ label.resize(g.number_of_nodes());
+ g.node(0).data[2] = 1; label[0] = true;
+ g.node(1).data[2] = 1; label[1] = true;
+ g.node(2).data[1] = 1; label[2] = false;
+ g.node(3).data[1] = 1; label[3] = false;
+
+ g.add_edge(0,1);
+ g.add_edge(1,2);
+ g.add_edge(2,3);
+ g.add_edge(3,0);
+
+ v[0] = 1; v[1] = 1;
+ edge(g,0,1) = v;
+ edge(g,1,2) = v;
+ edge(g,2,3) = v;
+ edge(g,3,0) = v;
+ samples.push_back(g);
+ labels.push_back(label);
+ // ---------------------------
+
+ }
+
+
+
+
+
+ template <
+ typename node_vector_type,
+ typename edge_vector_type,
+ typename vector_type,
+ typename graph_type
+ >
+ void test1(
+ const dlib::array<graph_type>& samples,
+ const std::vector<std::vector<bool> >& labels
+ )
+ {
+ dlog << LINFO << "begin test1()";
+
+ structural_graph_labeling_trainer<vector_type> trainer;
+ //trainer.be_verbose();
+ trainer.set_epsilon(1e-12);
+ graph_labeler<vector_type> labeler = trainer.train(samples, labels);
+
+
+ // test serialization code for the labeler.
+ std::ostringstream sout;
+ serialize(labeler, sout);
+ std::istringstream sin(sout.str());
+ labeler = graph_labeler<vector_type>();
+ deserialize(labeler, sin);
+
+ std::vector<bool> temp;
+ for (unsigned long k = 0; k < samples.size(); ++k)
+ {
+ temp = labeler(samples[k]);
+ for (unsigned long i = 0; i < temp.size(); ++i)
+ {
+ const bool true_label = (labels[k][i] != 0);
+ const bool pred_label = (temp[i] != 0);
+ DLIB_TEST(true_label == pred_label);
+ }
+ }
+
+ matrix<double> cv;
+
+ cv = test_graph_labeling_function(labeler, samples, labels);
+ DLIB_TEST(sum(cv) == 2);
+ cv = cross_validate_graph_labeling_trainer(trainer, samples, labels, 4);
+ DLIB_TEST(sum(cv) == 2);
+
+ dlog << LINFO << "edge weights: " << trans(sparse_to_dense(labeler.get_edge_weights()));
+ dlog << LINFO << "node weights: " << trans(sparse_to_dense(labeler.get_node_weights()));
+ }
+
+
+
+ class graph_labeling_tester : public tester
+ {
+ public:
+ graph_labeling_tester (
+ ) :
+ tester ("test_graph_labeling",
+ "Runs tests on the graph labeling component.")
+ {}
+
+ void perform_test (
+ )
+ {
+ print_spinner();
+ // test with dense vectors
+ {
+ typedef matrix<double,3,1> node_vector_type;
+ typedef matrix<double,2,1> edge_vector_type;
+ typedef matrix<double,0,1> vector_type;
+ typedef dlib::graph<node_vector_type, edge_vector_type>::kernel_1a_c graph_type;
+
+ dlib::array<graph_type> samples;
+ std::vector<std::vector<bool> > labels;
+
+ make_data<graph_type>(samples, labels);
+ make_data<graph_type>(samples, labels);
+ make_data<graph_type>(samples, labels);
+ make_data<graph_type>(samples, labels);
+
+
+ test1<node_vector_type,edge_vector_type,vector_type>(samples, labels);
+ }
+ print_spinner();
+ // test with dense vectors and sparse vectors together
+ {
+ typedef matrix<double,3,1> node_vector_type;
+ typedef matrix<double,2,1> edge_vector_type;
+ typedef std::map<unsigned long,double> vector_type;
+ typedef dlib::graph<node_vector_type, edge_vector_type>::kernel_1a_c graph_type;
+
+ dlib::array<graph_type> samples;
+ std::vector<std::vector<bool> > labels;
+
+ make_data<graph_type>(samples, labels);
+ make_data<graph_type>(samples, labels);
+ make_data<graph_type>(samples, labels);
+ make_data<graph_type>(samples, labels);
+
+
+ test1<node_vector_type,edge_vector_type,vector_type>(samples, labels);
+ }
+ print_spinner();
+ // test with sparse vectors
+ {
+ typedef std::vector<std::pair<unsigned long,double> > vector_type;
+ typedef std::map<unsigned long, double> edge_vector_type;
+ typedef std::map<unsigned long, double> node_vector_type;
+ typedef dlib::graph<node_vector_type, edge_vector_type>::kernel_1a_c graph_type;
+
+ dlib::array<graph_type> samples;
+ std::vector<std::vector<bool> > labels;
+
+ make_data_sparse<graph_type>(samples, labels);
+ make_data_sparse<graph_type>(samples, labels);
+ make_data_sparse<graph_type>(samples, labels);
+ make_data_sparse<graph_type>(samples, labels);
+
+
+ test1<node_vector_type,edge_vector_type,vector_type>(samples, labels);
+ }
+
+
+
+ print_spinner();
+ // test with dense vectors
+ {
+ typedef matrix<double,3,1> node_vector_type;
+ typedef matrix<double,2,1> edge_vector_type;
+ typedef matrix<double,0,1> vector_type;
+ typedef dlib::graph<node_vector_type, edge_vector_type>::kernel_1a_c graph_type;
+
+ dlib::array<graph_type> samples;
+ std::vector<std::vector<bool> > labels;
+
+ make_data2<graph_type>(samples, labels);
+ make_data2<graph_type>(samples, labels);
+ make_data2<graph_type>(samples, labels);
+ make_data2<graph_type>(samples, labels);
+
+
+ test1<node_vector_type,edge_vector_type,vector_type>(samples, labels);
+ }
+ print_spinner();
+ // test with sparse vectors
+ {
+ typedef std::vector<std::pair<unsigned long,double> > vector_type;
+ typedef std::map<unsigned long, double> edge_vector_type;
+ typedef std::map<unsigned long, double> node_vector_type;
+ typedef dlib::graph<node_vector_type, edge_vector_type>::kernel_1a_c graph_type;
+
+ dlib::array<graph_type> samples;
+ std::vector<std::vector<bool> > labels;
+
+ make_data2_sparse<graph_type>(samples, labels);
+ make_data2_sparse<graph_type>(samples, labels);
+ make_data2_sparse<graph_type>(samples, labels);
+ make_data2_sparse<graph_type>(samples, labels);
+
+
+ test1<node_vector_type,edge_vector_type,vector_type>(samples, labels);
+ }
+ print_spinner();
+ // test with sparse vectors and dense mix
+ {
+ typedef matrix<double,0,1> vector_type;
+ typedef std::map<unsigned long, double> edge_vector_type;
+ typedef std::map<unsigned long, double> node_vector_type;
+ typedef dlib::graph<node_vector_type, edge_vector_type>::kernel_1a_c graph_type;
+
+ dlib::array<graph_type> samples;
+ std::vector<std::vector<bool> > labels;
+
+ make_data2_sparse<graph_type>(samples, labels);
+ make_data2_sparse<graph_type>(samples, labels);
+ make_data2_sparse<graph_type>(samples, labels);
+ make_data2_sparse<graph_type>(samples, labels);
+
+
+ test1<node_vector_type,edge_vector_type,vector_type>(samples, labels);
+ }
+ }
+ } a;
+
+
+}
+
+
+
+