From 2d210329f2aa7e909a5ebc447ccad4a4e7a91db3 Mon Sep 17 00:00:00 2001 From: Francisc Date: Thu, 8 Aug 2013 19:24:02 +0300 Subject: [PATCH] modified benchmarking function to support .environment files --- Visibility_2/test/Visibility_2/benchmark.cpp | 26 +++- .../Visibility_2/include/CGAL/test_utils.h | 142 ++++++------------ 2 files changed, 64 insertions(+), 104 deletions(-) diff --git a/Visibility_2/test/Visibility_2/benchmark.cpp b/Visibility_2/test/Visibility_2/benchmark.cpp index ffcf9e0d1af..0228f41e6aa 100644 --- a/Visibility_2/test/Visibility_2/benchmark.cpp +++ b/Visibility_2/test/Visibility_2/benchmark.cpp @@ -27,13 +27,14 @@ #include #include #include +#include #include #include #include #include -int main() { +int main(int argc, char* argv[]) { { typedef CGAL::Gmpq Number_type; typedef CGAL::Cartesian Kernel; @@ -45,12 +46,25 @@ int main() { Simple_polygon_visibility_2; typedef CGAL::Naive_visibility_2 Naive_visibility_2; + typedef CGAL::Triangular_expansion_visibility_2 + Triangular_expansion_visibility_2; - Simple_polygon_visibility_2 simple_visibility; - Naive_visibility_2 naive_visibility; - const CGAL::Query_choice qchoice = CGAL::FACE; - CGAL::benchmark - (simple_visibility, naive_visibility, qchoice, 1, 0); + if (argc == 2) { + Simple_polygon_visibility_2 simple_visibility; + Naive_visibility_2 naive_visibility; + Triangular_expansion_visibility_2 triangular_visibility; + const CGAL::Query_choice qchoice = CGAL::FACE; + std::string input_arr_file(argv[1]); + std::ifstream input(input_arr_file.c_str()); + CGAL::benchmark + (naive_visibility, triangular_visibility, qchoice, input); + // CGAL::benchmark + // (simple_visibility, triangular_visibility, qchoice, input); + } + else { + std::cout << "Usage: ./benchmark [filename]\n"; + exit(0); + } } return 0; } diff --git a/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h b/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h index 7d7e4e36ed6..d6eb7c12696 100644 --- a/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h +++ b/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h @@ -351,7 +351,8 @@ void run_tests(int case_number_simple, int case_number_non_simple) { Visibility_2 visibility; bool one_failed = false; - if (Visibility_2::Supports_simple_polygon_tag::value) { + if (Visibility_2::Supports_simple_polygon_tag::value + && case_number_simple >= 1) { int cnt = 0; int cnt_passed = 0; std::cout << " Running simple polygon test cases...\n"; @@ -385,10 +386,12 @@ void run_tests(int case_number_simple, int case_number_non_simple) { } std::cout << ")" << std::endl; } - if (Visibility_2::Supports_general_polygon_tag::value) { + if (Visibility_2::Supports_general_polygon_tag::value + && case_number_non_simple >= 1) { + int cnt = 0; int cnt_passed = 0; - std::cout << " Running non-simple polygon test cases...\n"; + std::cout << " Running non-simple polygon test cases...\n"; for (int i = 1 ; i <= case_number_non_simple ; i++) { std::string input_arr_file("data/test_non_simple_polygon_"); input_arr_file += num2string(i); @@ -466,9 +469,9 @@ void create_arrangement_from_file(_Arrangement_2 &arr, std::ifstream& input) { } template -void create_polygons_from_file(_Arrangement_2 &arr, std::ifstream& input) { - typedef _Arrangement_2 Arrangement_2; - typedef typename Arrangement_2::Geometry_traits_2 Geometry_traits_2; +void create_arrangement_from_env_file(_Arrangement_2 &arr, std::ifstream& input) { + typedef _Arrangement_2 Arrangement_2; + typedef typename Arrangement_2::Geometry_traits_2 Geometry_traits_2; typedef typename Geometry_traits_2::Segment_2 Segment_2; typedef typename Geometry_traits_2::Point_2 Point_2; typedef typename Geometry_traits_2::FT Number_type; @@ -481,12 +484,15 @@ void create_polygons_from_file(_Arrangement_2 &arr, std::ifstream& input) { std::stringstream convert(line); int number_of_polygons; convert >> number_of_polygons; - for (int i = 0; i != number_of_polygons; i++) { + for (int i = 0 ; i < number_of_polygons ; i++) { std::vector points; std::vector segments; - int number_of_vertex; - input >> number_of_vertex; - for (int j = 0; j != number_of_vertex-1; j++) { + + std::getline(input, line); + std::stringstream convert(line); + int number_of_vertices; + convert >> number_of_vertices; + for (int j = 0; j < number_of_vertices; j++) { std::getline(input, line); std::string n1, n2; std::istringstream iss(line); @@ -494,14 +500,12 @@ void create_polygons_from_file(_Arrangement_2 &arr, std::ifstream& input) { points.push_back(Point_2(string2num(n1), string2num(n2))); } - for (int j = 0; j != number_of_vertex-1; j++) { - + for (int j = 0; j < number_of_vertices-1 ; j++) { segments.push_back(Segment_2(points[j], points[j+1])); } segments.push_back(Segment_2(points.front(), points.back())); CGAL::insert(arr, segments.begin(), segments.end()); } - } else { std::cout<<"Can't open the file. Check the file name."; @@ -604,14 +608,14 @@ void benchmark_one_unit(Visibility_2_fst visibility_fst, timer.start(); visibility_fst.attach(arr); timer.stop(); - std::cout << " Time to attach to first object: " + std::cout << "Time to attach to first object: " << GREEN << timer.time() << " sec" << RESET << std::endl; timer.reset(); timer.start(); visibility_snd.attach(arr); timer.stop(); - std::cout << " Time to attach to second object: " + std::cout << "Time to attach to second object: " << GREEN << timer.time() << " sec" << RESET << std::endl; typename Input_arrangement_2::Face_const_iterator fit; @@ -638,7 +642,8 @@ void benchmark_one_unit(Visibility_2_fst visibility_fst, (he->source()->point(), he->target()->point()); break; case FACE: - Ccb_halfedge_const_circulator curr_next = circ; + Ccb_halfedge_const_circulator curr_next = curr; + curr_next++; Halfedge_const_handle he_next = curr_next; Point_2 p1 = he->source()->point(); Point_2 p2 = he->target()->point(); @@ -656,7 +661,7 @@ void benchmark_one_unit(Visibility_2_fst visibility_fst, curr++; continue; } - std::cout << " Running with qpoint: " + std::cout << "Running with qpoint: " << RED << curr_query_pt << RESET << std::endl; Input_arrangement_2 out_arr_fst, out_arr_snd; timer.reset(); @@ -670,7 +675,7 @@ void benchmark_one_unit(Visibility_2_fst visibility_fst, } timer.stop(); - std::cout << " Time to compute visibility region using first object: " + std::cout << " Time to compute visibility region using first object: " << GREEN << timer.time() << " sec" << RESET << std::endl; timer.reset(); @@ -683,103 +688,44 @@ void benchmark_one_unit(Visibility_2_fst visibility_fst, } timer.stop(); - std::cout << " Time to compute visibility region using second object: " + std::cout << " Time to compute visibility region using second object: " << GREEN << timer.time() << " sec" << RESET << std::endl; -// visibility_fst.print_arrangement(out_arr_fst); - // visibility_fst.print_arrangement(out_arr_snd); + assert(true == (CGAL::test_are_equal (out_arr_fst, out_arr_snd))); } while (++curr != circ); } + template void benchmark(Visibility_2_fst &visibility_fst, - Visibility_2_snd &visibility_snd, - const Query_choice &choice, - int case_number_simple, - int case_number_non_simple) { + Visibility_2_snd &visibility_snd, + const Query_choice &choice, + std::ifstream &input) { typedef typename Visibility_2_fst::Input_arrangement_2 Input_arrangement_2; typedef typename Input_arrangement_2::Halfedge_handle Halfedge_handle; typedef typename Input_arrangement_2::Geometry_traits_2 Geometry_traits_2; - typedef typename Input_arrangement_2::Ccb_halfedge_circulator - Ccb_halfedge_circulator; + typedef typename Input_arrangement_2::Edge_iterator Edge_iterator; typedef typename Geometry_traits_2::Point_2 Point_2; - typedef typename Geometry_traits_2::FT Number_type; + typedef typename Geometry_traits_2::Segment_2 Segment_2; - bool one_failed = false; - if (Visibility_2_fst::Supports_simple_polygon_tag::value - && Visibility_2_snd::Supports_simple_polygon_tag::value) { + Input_arrangement_2 arr; + create_arrangement_from_env_file(arr, input); + if (Visibility_2_fst::Supports_general_polygon_tag::value + && Visibility_2_snd::Supports_general_polygon_tag::value) { - std::cout << "Benchmarking simple polygon test cases...\n"; - for (int i = 1 ; i <= case_number_simple ; i++) { - std::string input_arr_file("data/test_simple_polygon_"); - input_arr_file += num2string(i); - input_arr_file += ".dat"; - std::cout << " Benchmarking test " - << GREEN << input_arr_file << RESET << std::endl; - std::ifstream input(input_arr_file.c_str()); - std::string curr_line; - while (std::getline(input, curr_line)) { - if (curr_line[0] != '#' && curr_line[0] != '/') - break; - } - std::stringstream convert(curr_line); - std::string x, y; - convert >> x >> y; - Point_2 query_pt(string2num(x), - string2num(y)); - std::getline(input, curr_line); - std::string x1, y1; - std::istringstream iss(curr_line); - iss >> x1 >> y1; - Point_2 reference_pt(string2num(x1), - string2num(y1)); - std::getline(input, curr_line); - Input_arrangement_2 arr; - create_arrangement_from_dat_file(input, arr); - // CGAL::Visibility_2::print_arrangement(arr); - benchmark_one_unit(visibility_fst, - visibility_snd, - arr, - choice); - } + benchmark_one_unit(visibility_fst, + visibility_snd, + arr, + choice); } - if (Visibility_2_fst::Supports_general_polygon_tag::value - && Visibility_2_snd::Supports_general_polygon_tag::value) { - - std::cout << "Benchmarking non-simple polygon test cases...\n"; - for (int i = 1 ; i <= case_number_non_simple ; i++) { - std::string input_arr_file("data/test_non_simple_polygon_"); - input_arr_file += num2string(i); - input_arr_file += ".dat"; - std::cout << " Running test " - << GREEN << input_arr_file << RESET << std::endl; - std::ifstream input(input_arr_file.c_str()); - std::string curr_line; - while (std::getline(input, curr_line)) { - if (curr_line[0] != '#' && curr_line[0] != '/') - break; - } - std::stringstream convert(curr_line); - std::string x, y; - convert >> x >> y; - Point_2 query_pt(string2num(x), - string2num(y)); - std::getline(input, curr_line); - std::string x1, y1; - std::istringstream iss(curr_line); - iss >> x1 >> y1; - Point_2 reference_pt(string2num(x1), - string2num(y1)); - std::getline(input, curr_line); - Input_arrangement_2 arr; - create_arrangement_from_dat_file(input, arr); - benchmark_one_unit(visibility_fst, - visibility_snd, - arr, - choice); + else { // Only run the benchmark on the outter loop of the arrangement + Edge_iterator eit; + Input_arrangement_2 arr_trimmed; + for (eit = arr.edges_end() ; eit != arr.edges_end() ; eit++) { +// Segment_2 seg = } } }