/** * @file tests/boost_graph/tests.cpp * @author The PARADEVS Development Team * See the AUTHORS or Authors.txt file */ /* * PARADEVS - the multimodeling and simulation environment * This file is a part of the PARADEVS environment * * Copyright (C) 2013-2015 ULCO http://www.univ-litoral.fr * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include using namespace paradevs::common; using namespace paradevs::common::scheduler; using namespace paradevs::pdevs; using namespace paradevs::tests::boost_graph; #include std::ofstream log_file("log"); /* flat models */ template < class GraphBuilder > void flat_heap_test(double duration) { RootCoordinator < DoubleTime, paradevs::pdevs::Coordinator < DoubleTime, SchedulerType, SchedulerHandle, InBuildFlatGraphManager < SchedulerHandle, GraphBuilder > > > rc(0, duration, "root"); rc.run(); } template < class GraphBuilder > void flat_vector_test(double duration) { RootCoordinator < DoubleTime, paradevs::pdevs::Coordinator < DoubleTime, paradevs::common::scheduler::VectorScheduler < paradevs::common::DoubleTime >, paradevs::common::scheduler::NoSchedulerHandle, InBuildFlatGraphManager < paradevs::common::scheduler::NoSchedulerHandle, GraphBuilder > > > rc(0, duration, "root"); rc.run(); } /* partitionning models */ template < class GraphGenerator > void partitionning_heap_test(double duration, int cluster_number, std::string partitioning_method_name, int contraction_coef, bool contraction_coef_flag, GraphGenerator& g) { RootCoordinator < DoubleTime, paradevs::pdevs::Coordinator < DoubleTime, SchedulerType, SchedulerHandle, HeapHierarchicalGraphManager < SchedulerHandle, PartitioningGraphBuilder>, paradevs::common::NoParameters, PartitioningParameters > > rc(0, duration, "root", NoParameters(), PartitioningParameters(cluster_number, partitioning_method_name, contraction_coef, contraction_coef_flag, g)); rc.run(); } template < class GraphGenerator > void partitionning_vector_test(double duration, int cluster_number, std::string partitioning_method_name, int contraction_coef, bool contraction_coef_flag, GraphGenerator& g) { RootCoordinator < DoubleTime, paradevs::pdevs::Coordinator < DoubleTime, paradevs::common::scheduler::VectorScheduler < paradevs::common::DoubleTime >, paradevs::common::scheduler::NoSchedulerHandle, VectorHierarchicalGraphManager < paradevs::common::scheduler::NoSchedulerHandle, PartitioningGraphBuilder >, paradevs::common::NoParameters, PartitioningParameters > > rc(0, duration, "root", NoParameters(), PartitioningParameters(cluster_number, partitioning_method_name, contraction_coef, contraction_coef_flag, g)); rc.run(); } /* iteration for partitionning methods */ template < class GraphGenerator > void test(double duration, std::string partitioning_method_name, unsigned int min, unsigned int max, unsigned int step, bool vector, bool heap, int contraction_coef, bool contraction_coef_flag, GraphGenerator& g) { boost::timer t; int nbr_ite = 10; log_file << "==== " << partitioning_method_name << " with "; if (contraction_coef_flag) { log_file << "/"; } log_file << contraction_coef << " ===" << std::endl; log_file << "n"; if (heap) { log_file << "\t heap"; } if (vector) { log_file << "\t vector"; } log_file << std::endl; if (contraction_coef_flag) { for (unsigned int n = min; n <= max; n += step) { log_file << n << "\t"; if (heap) { double t1 = t.elapsed(); for (unsigned int i = 0; i < nbr_ite; ++i) { partitionning_heap_test(duration, n, partitioning_method_name, contraction_coef, contraction_coef_flag, g); } double t2 = t.elapsed(); log_file << (t2 - t1) / nbr_ite << "\t"; } if (vector) { double t1 = t.elapsed(); for (unsigned int i = 0; i < nbr_ite; ++i) { partitionning_vector_test(duration, n, partitioning_method_name, contraction_coef, contraction_coef_flag, g); } double t2 = t.elapsed(); log_file << (t2 - t1) / nbr_ite << std::endl; } else { log_file << std::endl; } } } else { log_file << contraction_coef << "\t"; if (heap) { double t1 = t.elapsed(); for (unsigned int i = 0; i < nbr_ite; ++i) { partitionning_heap_test(duration, contraction_coef, partitioning_method_name, contraction_coef, contraction_coef_flag, g); } double t2 = t.elapsed(); log_file << (t2 - t1) / nbr_ite << "\t"; } if (vector) { double t1 = t.elapsed(); for (unsigned int i = 0; i < nbr_ite; ++i) { partitionning_vector_test(duration, contraction_coef, partitioning_method_name, contraction_coef, contraction_coef_flag, g); } double t2 = t.elapsed(); log_file << (t2 - t1) / nbr_ite << std::endl; } else { log_file << std::endl; } } } /* 38 nodes graph */ const double duration_38 = 20; void test_flat_38() { boost::timer t; log_file << "== 38 nodes ==" << std::endl; log_file << "flat graph with heap = "; for (unsigned int i = 0; i < 20; ++i) { flat_heap_test< FlatGraphBuilder >(duration_38); } double t2 = t.elapsed(); log_file << t2 / 20 << std::endl; log_file << "flat graph with vector = "; for (unsigned int i = 0; i < 20; ++i) { flat_vector_test< FlatGraphBuilder >(duration_38); } double t3 = t.elapsed(); log_file << (t3 - t2) / 20 << std::endl; } void test_partitioning_38() { ArtificialGraphGenerator g(38); for (int i = 1; i <= 2; ++i) { /*std::cout<<"Méthode ggp"<(duration_38, "ggp", 2, 16, 2, true, true, i, true, g);*/ std::cout<<"Méthode gggp"<(duration_38, "gggp_pond", 2, 16, 2, true, true, i, true, g); std::cout<<"Méthode random"<(duration_38, "random", 2, 16, 2, true, true, i, true, g); } for (int i = 2; i <= 8; i += 2) { test < ArtificialGraphGenerator >(duration_38, "gggp_pond", 0, 0, 0, true, true, i, false, g); } } /* random graph */ const double duration_random = 0; void test_flat_random() { boost::timer t; uint nbr_ite = 20; log_file << "== Random Graph ==" << std::endl; log_file << "flat graph with heap = "; for (unsigned int i = 0; i < nbr_ite; ++i) { flat_heap_test< RandomFlatGraphBuilder >(duration_random); } double t2 = t.elapsed(); /*log_file << t2 / 10 << std::endl; log_file << "flat graph with vector = "; for (unsigned int i = 0; i < 10; ++i) { flat_vector_test< FlatGraphBuilder >(duration_random); } double t3 = t.elapsed();*/ //log_file << (t3 - t2) / 10 << std::endl; log_file << t2 / nbr_ite << std::endl; } void test_partitioning_random() { std::vector < int > levels = {/*5,4,*/ 3, 2 }; int nbr_sommets = 200; int sources = nbr_sommets/100*1; RandomGraphGenerator g(nbr_sommets, levels, sources, 2, 3); /*test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 200, 2, false, true, 5, true, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 200, 2, false, true, 10, true, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 200, 2, false, true, 20, true, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 42, 42, 2, false, true, 40, true, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 50, 2, false, true, 60, true, g);*/ test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 200, 2, false, true, 1 , true, g); /* test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 100, true, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 30, 2, false, true, 200, true, g);*/ /*test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 15, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 20, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 25, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 30, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 35, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 40, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 45, false, g); test < RandomGraphGenerator >(duration_random, "gggp_pond", 2, 32, 2, false, true, 50, false, g);*/ /*test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 5, true, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 10, true, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 20, true, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 40, true, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 60, true, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 80, true, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 30, 2, false, true, 100, true, g);*/ /*test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 15, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 20, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 25, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 30, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 35, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 40, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 45, false, g); test < RandomGraphGenerator >(duration_random, "ggp", 2, 32, 2, false, true, 50, false, g); test < RandomGraphGenerator >(duration_random, "random", 2, 32, 2, false, true, 5, true, g); test < RandomGraphGenerator >(duration_random, "random", 2, 32, 2, false, true, 10, true, g); test < RandomGraphGenerator >(duration_random, "random", 2, 32, 2, false, true, 20, true, g); test < RandomGraphGenerator >(duration_random, "random", 2, 32, 2, false, true, 40, true, g); test < RandomGraphGenerator >(duration_random, "random", 2, 22, 2, false, true, 100, true, g);*/ } const double duration_random_grid = 40; void test_flat_random_grid() { boost::timer t; uint nbr_ite = 10; log_file << "== Random Graph ==" << std::endl; log_file << "flat graph with heap = "; for (unsigned int i = 0; i < nbr_ite; ++i) { flat_heap_test< RandomGridFlatGraphBuilder >(duration_random_grid); } double t2 = t.elapsed(); /*log_file << t2 / 10 << std::endl; log_file << "flat graph with vector = "; for (unsigned int i = 0; i < 10; ++i) { flat_vector_test< FlatGraphBuilder >(duration_random); } double t3 = t.elapsed();*/ //log_file << (t3 - t2) / 10 << std::endl; log_file << t2 / nbr_ite << std::endl; } void test_partitioning_random_grid() { unsigned int side = 90; std::vector> vertex_selection; std::pair tmp; tmp.first = 0; tmp.second = 3; vertex_selection.push_back(tmp); Entiers weight_vertex; weight_vertex.push_back(1); const char *edge_weight; edge_weight = "../../sortie_graphe/tests_grid.txt"; bool rec = false; RandomGridGraphGenerator g(side, vertex_selection, weight_vertex, edge_weight, rec); test < RandomGridGraphGenerator >(duration_random_grid, "gggp_pond", 2, 100, 2, false, true, 80 , true, g); test < RandomGridGraphGenerator >(duration_random_grid, "gggp_pond", 2, 100, 2, false, true, 40 , true, g); } const double duration_random_linked = 30; void test_flat_random_linked() { boost::timer t; uint nbr_ite = 20; log_file << "== Random Linked Graph ==" << std::endl; log_file << "flat graph with heap = "; for (unsigned int i = 0; i < nbr_ite; ++i) { flat_heap_test< RandomLinkedFlatGraphBuilder >(duration_random_linked); } double t2 = t.elapsed(); /*log_file << t2 / 10 << std::endl; log_file << "flat graph with vector = "; for (unsigned int i = 0; i < 10; ++i) { flat_vector_test< FlatGraphBuilder >(duration_random); } double t3 = t.elapsed();*/ //log_file << (t3 - t2) / 10 << std::endl; log_file << t2 / nbr_ite << std::endl; } void test_partitioning_random_linked() { unsigned int levels = 60; int nbr_sommets = 5000; RandomLinkedGraphGenerator g(nbr_sommets, levels, 2, 3); // gggp /*test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 5, true, g);*/ test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 10, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 20, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 40, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 60, true, g); /*test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 80, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 100, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "gggp_pond", 2, 50, 2, false, true, 200, true, g);*/ // ggp /*test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 5, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 10, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 20, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 40, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 60, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 80, true, g); test < RandomLinkedGraphGenerator >(duration_random_linked, "ggp", 2, 50, 2, false, true, 100, true, g);*/ } /* corsen graph */ const double corsen_duration = 20; void test_flat_corsen() { boost::timer t; log_file << "== CORSEN == " << std::endl; log_file << "flat graph with heap = "; for (unsigned int i = 0; i < 20; ++i) { flat_heap_test< CorsenFlatGraphBuilder >(corsen_duration); } double t2 = t.elapsed(); log_file << t2 / 20 << std::endl; log_file << "flat graph with vector = "; for (unsigned int i = 0; i < 20; ++i) { flat_vector_test< CorsenFlatGraphBuilder >(corsen_duration); } double t3 = t.elapsed(); log_file << (t3 - t2) / 20 << std::endl; } void test_partitioning_corsen() { CorsenGraphGenerator g; test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 10, true, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 20, true, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 40, true, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 80, true, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 22, 2, false, true, 200, true, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 30, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 40, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 50, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 60, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 70, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 80, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 90, false, g); test < CorsenGraphGenerator >(corsen_duration, "gggp_pond", 2, 32, 2, false, true, 100, false, g); /*test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 10, true, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 20, true, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 40, true, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 80, true, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 22, 2, false, true, 200, true, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 30, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 40, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 50, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 60, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 70, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 80, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 90, false, g); test < CorsenGraphGenerator >(corsen_duration, "ggp", 2, 32, 2, false, true, 100, false, g); test < CorsenGraphGenerator >(corsen_duration, "random", 2, 32, 2, false, true, 10, true, g); test < CorsenGraphGenerator >(corsen_duration, "random", 2, 32, 2, false, true, 20, true, g); test < CorsenGraphGenerator >(corsen_duration, "random", 2, 32, 2, false, true, 40, true, g); test < CorsenGraphGenerator >(corsen_duration, "random", 2, 32, 2, false, true, 80, true, g); test < CorsenGraphGenerator >(corsen_duration, "random", 2, 22, 2, false, true, 200, true, g);*/ } /* three graph types : 38 nodes, corsen and random */ void test_38() { test_flat_38(); test_partitioning_38(); } void test_corsen() { test_flat_corsen(); test_partitioning_corsen(); } void test_random() { test_flat_random(); test_partitioning_random(); } void test_random_linked() { test_flat_random_linked(); test_partitioning_random_linked(); } void test_random_grid() { test_flat_random_grid(); test_partitioning_random_grid(); } int main() { srand(7262); //std::cout<<"Simulation pour graphe 38"<