1 #ifndef TCPSPSUITE_SWAG_HPP
2 #define TCPSPSUITE_SWAG_HPP
4 #include "../datastructures/fast_reset_vector.hpp"
5 #include "../datastructures/skyline_interface.hpp"
6 #include "../instance/job.hpp"
7 #include "../instance/solution.hpp"
8 #include "../instance/traits.hpp"
9 #include "../manager/solvers.hpp"
10 #include "../manager/timer.hpp"
11 #include "../util/log.hpp"
12 #include "elitepoolscorer.hpp"
13 #include "matrixedgescorer.hpp"
23 class AdditionalResultStorage;
27 template <
unsigned int>
36 Edge(Job::JobId target,
size_t rev_index_in,
bool permanent)
37 : t(target), rev_index(rev_index_in)
39 this->set_permanent(permanent);
40 this->set_marked(
false);
43 Edge() : t(0), rev_index(0) {}
49 is_permanent() const noexcept
51 return this->flags[FLAG_INDEX_PERMANENT];
55 is_marked() const noexcept
57 return this->flags[FLAG_INDEX_MARKED];
60 set_marked(
bool value) noexcept
62 this->flags[FLAG_INDEX_MARKED] = value;
66 is_seen() const noexcept
68 return this->flags[FLAG_INDEX_SEEN];
71 set_seen(
bool value) noexcept
73 this->flags[FLAG_INDEX_SEEN] = value;
78 set_permanent(
bool value) noexcept
80 this->flags[FLAG_INDEX_PERMANENT] = value;
84 static constexpr
size_t FLAG_INDEX_PERMANENT = 0;
85 static constexpr
size_t FLAG_INDEX_MARKED = 1;
86 static constexpr
size_t FLAG_INDEX_SEEN = 2;
95 template <
bool use_mes,
bool use_eps>
98 SWAGSolver(
const Instance & instance, AdditionalResultStorage & additional,
99 const SolverConfig & sconf);
106 void graph_insert_edge(Job::JobId s, Job::JobId t,
107 bool permanent =
false) noexcept;
108 void graph_delete_edge(
Job::JobId s,
size_t s_adj_list_index) noexcept;
109 void graph_delete_edge(Edge * e) noexcept;
111 void initialize_graph() noexcept;
112 void initialize_times() noexcept;
113 void initialize_skyline() noexcept;
117 void push_es_forward(
bool force_complete,
bool range_changed) noexcept;
118 void rebuild_es_forward() noexcept;
121 void push_lf_backward(
bool force_complete,
bool range_changed) noexcept;
122 void rebuild_lf_backward() noexcept;
124 void insert_edge(
Job::JobId s,
Job::JobId t,
bool force_complete) noexcept;
126 void delete_edge(Edge * e) noexcept;
127 void delete_edge(
Job::JobId s,
size_t s_adj_list_index) noexcept;
129 bool iteration_insert_edge(
bool force_complete) noexcept;
130 void iteration_regenerate_candidates() noexcept;
131 void iteration_unstick() noexcept;
132 void iteration_propagate(
bool complete,
bool range_changed) noexcept;
133 void iteration() noexcept;
134 void reset() noexcept;
137 void build_candidate_jobs() noexcept;
139 void build_candidate_edges() noexcept;
140 void build_candidate_edges_batched() noexcept;
144 void create_new_candidate_edges() noexcept;
145 unsigned int find_edges_to_delete_backwards(
Job::JobId t,
unsigned int amount,
147 void edgedel_update_current_values_backwards(
Job::JobId t);
149 unsigned int find_edges_to_delete_forwards(
Job::JobId s,
unsigned int amount,
151 void edgedel_update_current_values_forwards(
Job::JobId s);
155 void dbg_verify_graph();
156 void dbg_verify_cycle_free();
157 void dbg_verify_solution();
158 void dbg_verify_times();
159 void dbg_generate_dot(std::ostringstream & buf);
160 void dbg_print_graph();
161 void dbg_write_graph(std::
string filename);
162 void dbg_print_adjacencies();
163 void dbg_verify_active_range();
165 void dbg_verify_values_during_forwards_bfs();
166 void dbg_verify_values_during_backwards_bfs();
167 void dbg_verify_limits_during_partial_propagation();
168 void dbg_verify_correctly_partially_propagated();
172 const SolverConfig & sconf;
173 AdditionalResultStorage & additional;
174 bool disaggregate_time;
175 double intermediate_interval;
176 double intermediate_score_interval;
177 size_t deletion_trials;
178 size_t deletion_max_depth;
179 size_t deletions_before_reset;
180 size_t force_complete_push_after;
181 size_t force_range_check_after;
182 bool randomize_edge_candidates;
183 size_t edge_candidate_batchsize;
184 double deletion_undermove_penalty;
186 size_t deletions_remaining;
187 size_t last_complete_push;
188 size_t last_range_check;
191 std::vector<std::vector<Edge>> adjacency_list;
192 std::vector<std::vector<ReverseEdge>> rev_adjacency_list;
196 std::vector<
unsigned int> earliest_starts;
197 std::vector<
unsigned int> latest_finishs;
199 std::vector<
unsigned int> base_earliest_starts;
200 std::vector<
unsigned int> base_latest_finishs;
201 std::vector<std::vector<Edge>> base_adjacency_list;
202 std::vector<std::vector<ReverseEdge>> base_rev_adjacency_list;
205 std::vector<
unsigned int> best_start_times;
210 utilities::OptionalMember<MatrixEdgeScorer, use_mes> mes;
211 utilities::OptionalMember<ElitePoolScorer, use_eps> eps;
215 size_t iteration_count;
216 size_t insertion_count;
217 size_t solution_count;
218 size_t deletion_count;
222 double skyline_update_time;
223 double propagate_time;
225 double job_selection_time;
226 double edge_selection_time;
231 double last_log_time;
232 size_t last_log_iteration;
235 double intermediate_score_last_time;
236 size_t intermediate_score_number;
239 std::vector<decltype(
Job().get_duration())> durations;
240 std::vector<decltype(
Job().get_deadline())> deadlines;
241 std::vector<decltype(
Job().get_release())> releases;
242 const
size_t job_count;
245 std::vector<
Job::JobId> candidates_buf;
246 utilities::ConditionalMember<
247 std::vector<std::tuple<
double,
Job::JobId,
Job::JobId>>,
248 std::vector<std::pair<
Job::JobId,
Job::JobId>>, use_mes || use_eps>
250 std::vector<std::pair<
Job::JobId,
unsigned int>> active_jobs_buf;
252 std::pair<
unsigned int,
unsigned int> active_range;
255 std::vector<
Job::JobId> push_lf_backward_queue;
256 std::vector<
Job::JobId> push_lf_backward_out_of_range;
257 std::vector<
Job::JobId> push_es_forward_queue;
258 std::vector<
Job::JobId> push_es_forward_out_of_range;
261 std::vector<
Job::JobId> rebuild_es_forward_queue;
262 std::vector<
Job::JobId> rebuild_lf_backward_queue;
264 std::vector<
Job::JobId> changed_nodes_buf;
265 FastResetVector<
bool> node_moved_buf;
272 std::vector<std::vector<
size_t>> forward_deletion_buckets;
275 std::vector<std::vector<
size_t>> reverse_deletion_buckets;
278 std::vector<std::vector<std::pair<
size_t,
size_t>>> forward_pointers_changed;
281 std::vector<std::vector<std::pair<
size_t,
size_t>>> reverse_pointers_changed;
296 EdgeBFSEntry(Edge * e_in,
size_t depth_in) : e(e_in), depth(depth_in) {}
297 EdgeBFSEntry() : e(nullptr), depth(0) {}
318 FastResetVector<bool> edgedel_vertex_seen;
319 std::vector<Edge *> edgedel_edge_seen;
322 std::vector<unsigned int> edgedel_current_value;
323 std::vector<Job::JobId> edgedel_sorted_by_start_buf;
324 std::vector<Job::JobId> edgedel_sorted_by_end_buf;
328 std::deque<EdgeBFSEntry> bfs_buf;
329 std::deque<Job::JobId> rebuild_queue;
334 std::vector<Edge *> bfs_pruned_buffer;
335 std::vector<Job::JobId> bfs_ran_out_of_buffer;
337 std::vector<Edge *> delete_backwards_edges_buf;
338 std::vector<Edge *> delete_forwards_edges_buf;
350 SWAGSolver(
const Instance & instance, AdditionalResultStorage & additional,
351 const SolverConfig & sconf);
354 static std::string get_id();
355 Maybe<double> get_lower_bound();
356 static const Traits & get_requirements();
360 static const Traits required_traits;
362 std::tuple<detail::SWAGSolver<false, false>, detail::SWAGSolver<false, true>,
363 detail::SWAGSolver<true, false>, detail::SWAGSolver<true, true>>
372 struct registry_hook<solvers::get_free_N<swag::SWAGSolver>()>
374 constexpr
static unsigned int my_N = solvers::get_free_N<swag::SWAGSolver>();
379 return solvers::register_class<swag::SWAGSolver, my_N>{}();
385 #endif // TCPSPSUITE_SWAG_HPP