5 #ifndef TCPSPSUITE_SKYLINE_HPP
6 #define TCPSPSUITE_SKYLINE_HPP
8 #include "../contrib/intervaltree/src/dynamic_segment_tree.hpp"
9 #include "../instance/job.hpp"
10 #include "../instance/resource.hpp"
11 #include "../util/template_magic.hpp"
12 #include "generated_config.hpp"
14 #include <boost/container/flat_set.hpp>
15 #include <boost/hana.hpp>
22 namespace hana = boost::hana;
25 using MaxRange = std::pair<unsigned int, unsigned int>;
29 SkyLineEvent(
const Instance * instance) : usage(instance) {}
42 operator==(
const SkyLineEvent & other)
const noexcept
44 return (this->usage == other.usage) && (this->where == other.where) &&
45 (this->start == other.start);
50 class SkyLineIterator;
55 template <
bool support_iteration>
56 class ArraySkyLineBase {
60 typedef ptrdiff_t difference_type;
61 typedef SkyLineEvent value_type;
62 typedef const SkyLineEvent & reference;
63 typedef const SkyLineEvent * pointer;
64 typedef std::input_iterator_tag iterator_category;
67 iterator(const iterator & other) noexcept;
68 iterator(iterator && other) noexcept;
69 iterator(ArraySkyLineBase * sl,
size_t time_index) noexcept;
71 iterator & operator=(const iterator & other) noexcept;
72 iterator & operator=(iterator && other) noexcept;
74 bool operator==(const iterator & other) const noexcept;
75 bool operator!=(const iterator & other) const noexcept;
77 iterator & operator++() noexcept;
78 iterator operator++(
int) noexcept;
79 iterator & operator+=(
size_t steps) noexcept;
80 iterator operator+(
size_t steps) const noexcept;
82 iterator & operator--() noexcept;
83 iterator operator--(
int) noexcept;
84 iterator & operator-=(
size_t steps) noexcept;
85 iterator operator-(
size_t steps) const noexcept;
87 reference operator*() const noexcept;
88 pointer operator->() const noexcept;
94 void update_ev() noexcept;
95 void update_resource_amount(
bool went_forward) noexcept;
97 ArraySkyLineBase * sl;
102 operator()(
const std::pair<bool, Job::JobId> & lhs,
103 const std::pair<bool, Job::JobId> & rhs)
const noexcept
105 if (lhs.first != rhs.first) {
108 return lhs.second < rhs.second;
112 typename boost::container::flat_set<std::pair<bool, Job::JobId>,
113 event_compare>::iterator event_it;
119 ArraySkyLineBase(
const Instance * instance);
121 void remove_job(
const Job & job) noexcept;
122 void remove_job(Job::JobId jid) noexcept;
123 void insert_job(
const Job & job,
unsigned int pos) noexcept;
124 void insert_job(Job::JobId jid,
unsigned int pos) noexcept;
125 void set_pos(
const Job & job,
unsigned int pos) noexcept;
126 void set_pos(Job::JobId jid,
unsigned int pos) noexcept;
128 Resources get_maximum() noexcept;
129 Resources get_maximum(
unsigned int l,
unsigned int r) noexcept;
131 using MaxRange = std::pair<
unsigned int,
unsigned int>;
133 MaxRange get_maximum_range() const noexcept;
134 MaxRange get_maximum_range(
unsigned int l,
unsigned int r) const noexcept;
136 iterator begin() noexcept;
137 iterator end() noexcept;
139 iterator lower_bound(
unsigned int x) noexcept;
140 iterator upper_bound(
unsigned int x) noexcept;
147 std::vector<std::vector<
double>> usage;
151 std::vector<boost::container::flat_set<std::pair<
bool,
Job::JobId>>>;
152 utilities::OptionalMember<EventVector, support_iteration> events;
154 std::vector<
unsigned int> start_times;
157 template <
bool ranged,
bool single_resource>
158 class TreeSkyLineBase {
163 constexpr
static auto
166 if constexpr (single_resource) {
167 return hana::type_c<double>;
169 return hana::type_c<Resources>;
173 using ValueType =
typename decltype(compute_value_type())::type;
178 constexpr
static auto
179 compute_combiner_type()
181 if constexpr (!ranged) {
182 return hana::type_c<ygg::MaxCombiner<unsigned int, ValueType>>;
184 return hana::type_c<ygg::RangedMaxCombiner<unsigned int, ValueType>>;
188 using MaxCombiner =
typename decltype(compute_combiner_type())::type;
189 using Combiners = ygg::CombinerPack<unsigned int, ValueType, MaxCombiner>;
191 #ifdef YGG_STORE_SEQUENCE_DST
192 class SequenceInterface {
194 using ValueT = ValueType;
196 template <
class Node>
198 get_value(
const Node & n)
203 using TreeOptions = ygg::TreeOptions<
204 ygg::TreeFlags::MULTIPLE, ygg::TreeFlags::CONSTANT_TIME_SIZE,
205 ygg::TreeFlags::template BENCHMARK_SEQUENCE_INTERFACE<SequenceInterface>>;
207 using TreeOptions = ygg::DefaultOptions;
211 :
public ygg::DynSegTreeNodeBase<unsigned int, ValueType, ValueType,
212 Combiners, ygg::UseDefaultZipTree> {
220 class JobNodeTraits :
public ygg::DynSegTreeNodeTraits<Node> {
222 static unsigned int get_lower(
const Node & job);
223 static unsigned int get_upper(
const Node & job);
224 static const ValueType & get_value(
const Node & job);
226 using Tree = ygg::DynamicSegmentTree<Node, JobNodeTraits, Combiners,
227 TreeOptions, ygg::UseDefaultZipTree>;
233 using SubIterator = decltype(t.begin());
236 typedef ptrdiff_t difference_type;
237 typedef SkyLineEvent value_type;
238 typedef const SkyLineEvent & reference;
239 typedef const SkyLineEvent * pointer;
240 typedef std::forward_iterator_tag iterator_category;
243 iterator(
const iterator & other);
244 iterator(iterator && other);
245 iterator(Tree * t,
const Instance * instance, SubIterator sub_it);
247 iterator & operator=(
const iterator & other);
248 iterator & operator=(iterator && other);
252 bool operator==(
const iterator & other)
const;
253 bool operator!=(
const iterator & other)
const;
255 iterator & operator++();
256 iterator operator++(
int);
257 iterator & operator+=(
size_t steps);
258 iterator operator+(
size_t steps)
const;
260 iterator & operator--();
261 iterator operator--(
int);
262 iterator & operator-=(
size_t steps);
263 iterator operator-(
size_t steps)
const;
265 reference operator*()
const;
266 pointer operator->()
const;
272 void update_event() noexcept;
273 void update_resource_amount(
bool went_forward) noexcept;
278 const Node * ev_node;
281 TreeSkyLineBase(const
Instance * instance);
283 void remove_job(const
Job & job) noexcept;
284 void remove_job(
Job::JobId jid) noexcept;
285 void insert_job(const
Job & job,
unsigned int pos) noexcept;
286 void insert_job(
Job::JobId jid,
unsigned int pos) noexcept;
287 void set_pos(const
Job & job,
unsigned int pos) noexcept;
288 void set_pos(
Job::JobId jid,
unsigned int pos) noexcept;
290 ValueType get_maximum();
291 ValueType get_maximum(
unsigned int l,
unsigned int r);
293 using MaxRange = std::pair<
unsigned int,
unsigned int>;
295 MaxRange get_maximum_range() const noexcept;
296 MaxRange get_maximum_range(
unsigned int l,
unsigned int r) const noexcept;
301 iterator lower_bound(
unsigned int x);
302 iterator upper_bound(
unsigned int x);
306 std::vector<Node> nodes;
311 #include "skyline_interface.hpp"
317 using TreeSkyLine = TreeSkyLineBase<false, false>;
318 using RangedTreeSkyLine = TreeSkyLineBase<true, false>;
319 using SingleTreeSkyLine = TreeSkyLineBase<false, true>;
320 using SingleRangedTreeSkyLine = TreeSkyLineBase<true, true>;
322 using ArraySkyLine = ArraySkyLineBase<false>;
323 using IteratorArraySkyLine = ArraySkyLineBase<true>;
327 #endif // TCPSPSUITE_SKYLINE_HPP