diff options
Diffstat (limited to '')
-rw-r--r-- | ml/dlib/dlib/test/graph_labeler.cpp | 472 |
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; + + +} + + + + |