TCPSPSuite
overlapping_jobs_generator.hpp
1 #ifndef OVERLAPPING_JOBS_GENERATOR_HPP
2 #define OVERLAPPING_JOBS_GENERATOR_HPP
3 
4 #include "../instance/instance.hpp"
5 #include "../instance/job.hpp"
6 #include "../contrib/intervaltree/src/intervaltree.hpp"
7 #include "../instance/laggraph.hpp"
8 
9 // TODO enforce consistent windows
10 
11 class OverlappingJobsGenerator {
12 private:
13  // forward for friend declaration
14  class const_iterator;
15  friend class const_iterator;
16 
17  template <class Node>
18  class ITreeNodeTraits : public ygg::ITreeNodeTraits<Node> {
19  public:
20  using key_type = unsigned int;
21  static unsigned int
22  get_lower(const Node & n)
23  {
24  return n.get_lower();
25  }
26  static unsigned int
27  get_upper(const Node & n)
28  {
29  return n.get_upper();
30  }
31  };
32 
33  class ITreeNode
34  : public ygg::ITreeNodeBase<ITreeNode, class ITreeNodeTraits<ITreeNode>> {
35  public:
36  ITreeNode(const Job & job) noexcept;
37  unsigned int get_lower() const noexcept;
38  unsigned int get_upper() const noexcept;
39  unsigned int get_jid() const noexcept;
40  private:
41  unsigned int jid;
42  unsigned int lower;
43  unsigned int upper;
44  };
45 
46  const Instance & instance;
47 
48  std::vector<ITreeNode> nodes;
49  std::vector<ITreeNode> dfs;
50  std::vector<size_t> dfs_index;
51  ygg::IntervalTree<ITreeNode, ITreeNodeTraits<ITreeNode>> itree;
52 
53  class OverlappingPair {
54  public:
55  unsigned int jid_a;
56  unsigned int jid_b;
57  };
58 
59  class const_iterator {
60  public:
61  typedef OverlappingPair value_type;
62  typedef const OverlappingPair & const_reference;
63  typedef const OverlappingPair * const_pointer;
64  typedef std::input_iterator_tag
65  iterator_category; // TODO is that the right tag?
66 
67  const_iterator(const OverlappingJobsGenerator & gen);
68  const_iterator(const OverlappingJobsGenerator & gen, bool);
69  ~const_iterator();
70 
71  // TOdO move assignment?
72  // Todo move / copy construction?
73  // const_iterator & operator=(const const_iterator & other);
74 
75  bool operator==(const const_iterator & other) const noexcept;
76  bool operator!=(const const_iterator & other) const noexcept;
77 
78  const_iterator & operator++() noexcept;
79  const_iterator operator++(int) noexcept;
80 
81  const_reference operator*() const;
82  const_pointer operator->() const;
83 
84  private:
85  void advance_a() noexcept;
86  void advance_b() noexcept;
87  void skip_b_forward() noexcept;
88  void push_a_forward() noexcept;
89 
90  OverlappingPair element;
91 
92  const OverlappingJobsGenerator & gen;
93  size_t a_index;
94  ygg::IntervalTree<ITreeNode, ITreeNodeTraits<ITreeNode>>::template QueryResult<ITreeNode> b_qr;
95  decltype(b_qr.begin()) b_iterator;
96  std::vector<std::vector<unsigned int>> predecessors;
97  };
98 
99 
100 public:
101  OverlappingJobsGenerator(const Instance & instance);
102 
103  const_iterator begin() const;
104  const_iterator end() const;
105 };
106 
107 #endif
Instance
a TCPSP instance
Definition: instance.hpp:24
Job
A job of an TCPSP instance.
Definition: job.hpp:21