-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbenchmark.cpp
143 lines (117 loc) · 4.71 KB
/
benchmark.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//
// Solves a set of instances and print statistics.
//
// Created by Yannic Lieder on 06.08.20.
//
#include <filesystem>
#include <iostream>
#include <vector>
#include <boost/program_options.hpp>
#include "get_time_str.h"
#include "upper_bound/upper_bound_solver.h"
#include "serialization.h"
namespace fs = std::filesystem;
namespace po = boost::program_options;
std::string hline() {
return std::string(80, '*');
}
void run_benchmark(std::string const & input_dir, std::string const & instance_set, std::string const & output_dir,
bool visualize, int max_size) {
std::string directory = input_dir + "/" + instance_set;
std::cout << hline() << std::endl;
std::cout << "BENCHMARK " << instance_set << std::endl;
std::cout << "Input directory: " << input_dir << std::endl;
std::cout << "Output directory: " << output_dir << std::endl;
std::cout << "Start time: " << get_time_str("%Y-%m-%d %H:%M:%S") << std::endl;
std::cout << hline() << std::endl;
std::vector<Pattern> patterns = {
Pattern::SMALL_TRIANGLE,
Pattern::RADIUS,
Pattern::DUCT,
Pattern::HISTOGRAM,
Pattern::NON_CONVEX_VERTEX,
Pattern::CONVEX_SUBPOLYGON,
Pattern::EDGE_EXTENSION,
};
int n_solved = 0;
int n_unsolved = 0;
std::vector<std::string> unsolved;
if (!fs::is_directory(directory)) {
std::cerr << "Not a directory: " << directory << std::endl;
return;
}
int i = 0;
using recursive_directory_iterator = std::filesystem::recursive_directory_iterator;
for (const auto & file : recursive_directory_iterator(directory)) {
if (!fs::is_regular_file(file) || file.path().extension() != ".pol") {
// Skip directories
continue;
}
auto polygon = serialization::read_file<Kernel>(file);
if (max_size > 0 && polygon.size() > max_size) {
continue;
}
fs::path rel_path = fs::relative(file.path(), fs::path(input_dir));
std::string rel_dir = fs::path(rel_path).remove_filename();
std::string filename = fs::path(rel_path).stem();
std::cout << i++ << ". " << rel_path << std::flush;
UpperBoundSolver solver = UpperBoundSolver(polygon, patterns);
solver.set_visualize(visualize);
solver.set_output(output_dir, filename, rel_dir);
std::pair<bool, Polygon> result = solver.solve();
if (std::get<0>(result)) {
++n_solved;
std::cout << " -> solved" << std::endl;
} else {
++n_unsolved;
std::cout << " -> unsolved" << std::endl;
unsolved.push_back(rel_path);
}
}
std::cout << hline() << std::endl;
std::cout << "FINISH BENCHMARK " << instance_set << std::endl;
std::cout << "End time: " << get_time_str("%Y-%m-%d %H:%M:%S") << std::endl;
std::cout << "Solved: " << n_solved << std::endl;
std::cout << "Unsolved: " << n_unsolved << std::endl;
std::cout << "Total: " << (n_solved + n_unsolved) << std::endl;
if (n_unsolved > 0) {
std::cout << "Unsolved instances:" << std::endl;
for (auto const &instance: unsolved) {
std::cout << "\t" << instance << std::endl;
}
}
std::cout << hline() << std::endl;
}
struct Options {
bool visualize = false;
std::string output_dir = "out";
std::string base_dir;
std::vector<std::string> instance_sets;
int max_size = 0;
};
void parse_args(int argc, char* argv[], Options &ops) {
po::options_description desc;
desc.add_options()
("visualize,v", po::bool_switch(&ops.visualize), "Save svg image for every partitioning step")
("output,o", po::value<std::string>(&ops.output_dir), "Specify output directory")
("base_dir,b", po::value<std::string>(&ops.base_dir), "Instance base directory")
("instance_set,i", po::value<std::vector<std::string>>(&ops.instance_sets)->required(),
"The instance directory, relative to the base directory")
("max_size,m", po::value<int>(&ops.max_size),
"Consider only instances with a size less than or equal to max size")
;
po::positional_options_description pdesc;
pdesc.add("instance_set", -1);
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).
options(desc).positional(pdesc).run(), vm);
po::notify(vm);
}
int main(int argc, char* argv[]) {
Options options;
parse_args(argc, argv, options);
options.output_dir += "/benchmark_" + get_time_str();
for (auto const & set: options.instance_sets) {
run_benchmark(options.base_dir, set, options.output_dir, options.visualize, options.max_size);
}
}