fpmas 1.6
scheduler.h
Go to the documentation of this file.
1#ifndef SCHEDULER_H
2#define SCHEDULER_H
3
8#include <unordered_map>
9#include <queue>
10
12
13namespace fpmas { namespace scheduler {
23
32 template<typename TaskInterface>
33 class TaskBase : public TaskInterface {
34 private:
35 std::unordered_map<
36 JID,
37 std::list<fpmas::api::scheduler::Task*>::iterator
38 > job_pos;
39
40 public:
45 JID job_id,
46 std::list<fpmas::api::scheduler::Task*>::iterator pos
47 ) override {
48 job_pos[job_id] = pos;
49 }
50
54 std::list<api::scheduler::Task*>::iterator getJobPos(JID job_id) const override {
55 return job_pos.find(job_id)->second;
56 }
57 };
58
64 class VoidTask : public TaskBase<api::scheduler::Task> {
65 public:
69 void run() override {};
70 };
71
72 namespace detail {
73 // TODO 2.0: put this in fpmas::scheduler, rename
74 // fpmas::scheduler::LambdaTask
78 class LambdaTask : public TaskBase<api::scheduler::Task> {
79 private:
80 std::function<void()> fct;
81
82 public:
92 template<typename Lambda_t>
93 LambdaTask(Lambda_t&& lambda_fct)
94 : fct(lambda_fct) {}
95
96 void run() override {
97 fct();
98 }
99 };
100 }
101
108
114 template<typename T>
115 class NodeTask : public TaskBase<api::scheduler::NodeTask<T>> {
116 private:
118
119 public:
126 : _node(node) {
127 }
128
130 return _node;
131 }
132 };
133
139 template<typename T>
140 class LambdaTask : public NodeTask<T> {
141 private:
142 std::function<void()> fct;
143
144 public:
155 template<typename Lambda_t>
158 Lambda_t&& lambda_fct)
159 : NodeTask<T>(node), fct(lambda_fct) {}
160
161 void run() override {
162 fct();
163 }
164 };
165
169 class Job : public api::scheduler::Job {
170 private:
171 static JID job_id;
172 VoidTask voidTask;
173 JID _id;
174 std::list<api::scheduler::Task*> _tasks;
175 api::scheduler::Task* _begin = &voidTask;
176 api::scheduler::Task* _end = &voidTask;
177
178 public:
184 Job() : _id(job_id++) {}
190 Job(std::initializer_list<std::reference_wrapper<api::scheduler::Task>> tasks);
197 Job(
199 std::initializer_list<std::reference_wrapper<api::scheduler::Task>> tasks);
207 Job(
209 std::initializer_list<std::reference_wrapper<api::scheduler::Task>> tasks,
217 Job(
218 std::initializer_list<std::reference_wrapper<api::scheduler::Task>> tasks,
220
221 JID id() const override;
222 void add(api::scheduler::Task&) override;
223 void remove(api::scheduler::Task&) override;
224 std::vector<api::scheduler::Task*> tasks() const override;
225 TaskIterator begin() const override;
226 TaskIterator end() const override;
227
228 void setBeginTask(api::scheduler::Task&) override;
229 void setEndTask(api::scheduler::Task&) override;
230
231 api::scheduler::Task& getBeginTask() const override;
232 api::scheduler::Task& getEndTask() const override;
233 };
234
239 private:
240 std::vector<const api::scheduler::Job*> _jobs;
241 std::vector<SubTimeStep> job_ordering;
242
243 public:
244 void submit(const api::scheduler::Job&, api::scheduler::SubTimeStep sub_time_step) override;
245 void submit(api::scheduler::JobList job_list, api::scheduler::SubTimeStep sub_time_step) override;
246 const std::vector<const api::scheduler::Job*>& jobs() const override;
247 JobIterator begin() const override;
248 JobIterator end() const override;
249 size_t jobCount() override;
250
251 void clear() override;
252 };
253
254
255
260 private:
261 struct SchedulerItem {
262 SubTimeStep sub_step;
263 JobList job_list;
264
265 SchedulerItem(SubTimeStep sub_step, JobList job_list)
266 : sub_step(sub_step), job_list(job_list) {}
267 };
268
269 std::unordered_map<TimeStep, std::vector<SchedulerItem>> unique_jobs;
270 std::map<TimeStep, std::vector<std::pair<Period, SchedulerItem>>>
271 recurring_jobs;
272 std::map<TimeStep, std::vector<std::tuple<Date, Period, SchedulerItem>>>
273 limited_recurring_jobs;
274 void resizeCycle(size_t new_size);
275
276 public:
277 void schedule(api::scheduler::Date date, const api::scheduler::Job&) override;
284 };
285
286}}
287#endif
Definition: distributed_node.h:28
Definition: scheduler.h:223
std::vector< constJob * >::const_iterator JobIterator
Definition: scheduler.h:229
Definition: scheduler.h:135
std::list< Task * >::const_iterator TaskIterator
Definition: scheduler.h:140
Definition: scheduler.h:302
Definition: scheduler.h:76
Definition: scheduler.h:238
const std::vector< const api::scheduler::Job * > & jobs() const override
Definition: scheduler.cpp:97
JobIterator end() const override
Definition: scheduler.cpp:105
size_t jobCount() override
Definition: scheduler.cpp:109
JobIterator begin() const override
Definition: scheduler.cpp:101
void submit(const api::scheduler::Job &, api::scheduler::SubTimeStep sub_time_step) override
Definition: scheduler.cpp:74
void clear() override
Definition: scheduler.cpp:113
Definition: scheduler.h:169
JID id() const override
Definition: scheduler.cpp:36
Job()
Definition: scheduler.h:184
std::vector< api::scheduler::Task * > tasks() const override
Definition: scheduler.cpp:46
void add(api::scheduler::Task &) override
Definition: scheduler.cpp:38
api::scheduler::Task & getEndTask() const override
Definition: scheduler.cpp:62
TaskIterator end() const override
Definition: scheduler.cpp:70
api::scheduler::Task & getBeginTask() const override
Definition: scheduler.cpp:54
void remove(api::scheduler::Task &) override
Definition: scheduler.cpp:42
void setEndTask(api::scheduler::Task &) override
Definition: scheduler.cpp:58
TaskIterator begin() const override
Definition: scheduler.cpp:66
void setBeginTask(api::scheduler::Task &) override
Definition: scheduler.cpp:50
Definition: scheduler.h:140
LambdaTask(api::graph::DistributedNode< T > *node, Lambda_t &&lambda_fct)
Definition: scheduler.h:156
void run() override
Definition: scheduler.h:161
Definition: scheduler.h:115
api::graph::DistributedNode< T > * node() override
Definition: scheduler.h:129
NodeTask(api::graph::DistributedNode< T > *node)
Definition: scheduler.h:125
Definition: scheduler.h:259
void build(api::scheduler::TimeStep step, fpmas::api::scheduler::Epoch &) const override
Definition: scheduler.cpp:171
void schedule(api::scheduler::Date date, const api::scheduler::Job &) override
Definition: scheduler.cpp:118
Definition: scheduler.h:33
std::list< api::scheduler::Task * >::iterator getJobPos(JID job_id) const override
Definition: scheduler.h:54
void setJobPos(JID job_id, std::list< fpmas::api::scheduler::Task * >::iterator pos) override
Definition: scheduler.h:44
Definition: scheduler.h:64
void run() override
Definition: scheduler.h:69
Definition: scheduler.h:78
LambdaTask(Lambda_t &&lambda_fct)
Definition: scheduler.h:93
void run() override
Definition: scheduler.h:96
float Date
Definition: scheduler.h:24
std::vector< std::reference_wrapper< const Job > > JobList
Definition: scheduler.h:215
TimeStep time_step(Date date)
Definition: scheduler.cpp:4
SubTimeStep sub_time_step(Date date)
Definition: scheduler.cpp:8
Date sub_step_end(TimeStep step)
Definition: scheduler.cpp:13
float SubTimeStep
Definition: scheduler.h:33
unsigned long Period
Definition: scheduler.h:16
size_t JID
Definition: scheduler.h:38
unsigned long TimeStep
Definition: scheduler.h:29
TaskBase< api::scheduler::Task > Task
Definition: scheduler.h:107
Definition: fpmas.cpp:3