// 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; }