Scheduler
rlDisciplineBuilderHelper.cpp
Go to the documentation of this file.
1 
11 
12 #include <cassert>
13 
14 #include <utils/math.h>
15 
16 #include <mdp/builder.h>
17 #include <mdp/mdpModel.h>
18 #include <mdp/actionDimension.h>
19 
20 #include <scheduler/system.h>
21 #include <scheduler/process.h>
22 #include <scheduler/queue.h>
23 
24 #include "actions.h"
25 #include "configuration.h"
26 #include "domainModel.h"
30 
31 using namespace RlScheduler;
32 
33 
34 
35 
36 
37 
38 
40 {
41 #define ACTION_DIMS 0 //FIXME: not working because of the do-while loop... the dynamic cast fails...
42 #if ACTION_DIMS
43  Mdp::ActionDimension *processDimension = new Mdp::ActionDimension;
44 #endif
45  for (size_t i = 0; i < getNbOfTasks(); i++)
46  {
47 #if ACTION_DIMS
48  processDimension->addAction(new Action(i));
49 #else
50  builder->addAction(new Action(i));
51 #endif
52  }
53 #if ACTION_DIMS
54  processDimension->addAction(new SleepAction());
55  builder->addActionDimension(processDimension);
56 #else
57  builder->addAction(new SleepAction());
58 #endif
59 }
60 
61 
62 
63 void RlDisciplineBuilderHelper::addStates(Mdp::Builder *builder, std::shared_ptr<Configuration> conf)
64 {
65  addTaskStates(builder);
66  addTimeStates(builder, conf);
67  addTemperatureStates(builder, conf);
68 }
69 
70 void RlDisciplineBuilderHelper::addTemperatureStates(Mdp::Builder *builder, std::shared_ptr<Configuration> conf)
71 {
72  if (useTemperatureStates(conf))
73  {
74  int nbOfPos = conf->getIntValue("rlDiscipline", "nbTemperatureStates");
75  builder->addDimension(new TemperatureDimension(nbOfPos));
76  }
77 }
78 bool RlDisciplineBuilderHelper::useTemperatureStates(std::shared_ptr<Configuration> conf)
79 {
80  return conf->getBoolValue("rlDiscipline", "temperatureState", false);
81 }
82 
83 void RlDisciplineBuilderHelper::addTimeStates(Mdp::Builder *builder, std::shared_ptr<Configuration> conf)
84 {
85  if (!useTimeStates(conf))
86  return;
87  int nbTimeZones = 0;
88  std::vector<std::shared_ptr<Scheduler::Process>>
90  assert(processes.size() > 0);
91  double hyperperiod = (double) lcm(processes);
92  for (size_t i = 0; i < processes.size(); i++)
93  {
94  nbTimeZones += hyperperiod/processes[i]->getPeriod();
95  }
96  builder->addDimension(new TimeDimension(nbTimeZones));
97 }
98 
99 
100 bool RlDisciplineBuilderHelper::useTimeStates(std::shared_ptr<Configuration> conf)
101 {
102  return conf->getBoolValue("rlDiscipline","timeState", false);
103 }
104 
106 {
107  for (size_t i = 0; i < getNbOfTasks(); i++)
108  {
109  builder->addDimension(new TaskDimension(i));
110  }
111 }
112 
114 {
116 }
117 
118 
119 
120 double RlDisciplineBuilderHelper::lcm(std::vector<std::shared_ptr<Scheduler::Process>> processes)
121 {
122 
123  static const double eps = 0.000001;
124  std::vector<int> array(processes.size());
125  for (size_t i = 0; i < processes.size(); i++)
126  {
127  assert(processes[i]->getPeriod() <= floor(processes[i]->getPeriod()) + eps);
128  array[i] = (int) floor(processes[i]->getPeriod());
129  }
130  return Utils::lcm(array);
131 
132  return 0.0;
133 }
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
static void addTimeStates(Mdp::Builder *builder, std::shared_ptr< Configuration > conf)
int lcm(std::vector< int > array)
Definition: math.cpp:19
void addAction(Action *action)
Definition: builder.cpp:20
static bool useTimeStates(std::shared_ptr< Configuration > conf)
static System * getInstance()
Definition: system.cpp:28
void addDimension(StateSpaceDimension *dimension)
Definition: builder.cpp:35
static double lcm(std::vector< std::shared_ptr< Scheduler::Process >>)
static bool useTemperatureStates(std::shared_ptr< Configuration > conf)
void addActionDimension(ActionDimension *dim)
Definition: builder.cpp:45
static void addStates(Mdp::Builder *builder, std::shared_ptr< Configuration > conf)
static void addActions(Mdp::Builder *builder)
void addAction(Action *)
static void addTaskStates(Mdp::Builder *builder)
std::vector< std::shared_ptr< Process > > getStaticTaskSet()
get the list of real-time tasks in the system
Definition: system.cpp:133
static void addTemperatureStates(Mdp::Builder *builder, std::shared_ptr< Configuration > conf)