Scheduler
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
stateSpace.cpp
Go to the documentation of this file.
1 
10 #include "stateSpace.h"
11 
12 #include <iostream>
13 #include <cassert>
14 #include <stdexcept>
15 
16 #include "priorityState.h"
17 #include "transitionMatrix.h"
18 #include "rewards.h"
19 #include "action_impl.h"
20 #include "domainModel.h"
21 
22 using namespace Mdp;
23 
24 
25 StateSpace::StateSpace(size_t N, size_t Nprio, std::vector<StateSpaceDimension *> dims, std::vector<PriorityState *> prio)
26  : nbOfStates(N)
27  , nbOfPriorityStates(Nprio)
28  , dimensions(dims)
29  , priorityStates(prio)
30  , internalState(std::vector<int>(dimensions.size()))
31 {
32 }
33 
35 {
36  for (size_t i = 0; i < dimensions.size(); i++)
37  {
38  delete dimensions[i];
39  }
40 }
41 
43 {
44  //embarassingly parallelizable
45  for (unsigned int i = 0; i < dimensions.size(); i++)
46  {
48  assert(dim != nullptr);
49  statePosition_t pos = dim->getPosition();
50  internalState[dim->getIndex()] = pos;
51  }
52 }
53 
55 {
56  return currentExternalState;
57 }
58 
60 {
61  int prio = getPriorityStateInternal();
62  state_t state;
63  if (prio != -1)
64  {
65  state = nbOfStates + prio;
66  }
67  else
68  {
70  state = convertState(internalState);
71  }
72  currentExternalState = state;
73 }
74 
76 {
77  /*FIXME: how to include priority states?*/
78  return dimensions.size();
79 }
80 
81 std::vector<size_t> *StateSpace::factorize(state_t state)
82 {
83  static size_t size = dimensions.size();
84  static std::vector<size_t> vect(size);
85 #if 1
86  static bool init = false;
87  assert(size >= 1);
88  static std::vector<int> multVect(size);
89  if (!init)
90  {
91  multVect[0] = 1;
92  for (size_t i = 0; i < size-1; i++)
93  {
94  multVect[i+1] = multVect[i]*dimensions[i]->getNumberOfPositions();
95  }
96  init = true;
97  }
98  for (ssize_t i = size-1; i >= 0; i--)
99  {
100  vect[i] = state/multVect[i];
101  state %= multVect[i];
102  }
103 #else
104  unsigned int multiplicator = 1;
105  for (size_t i = 0; i < size; i++)
106  {
107  multiplicator *= dimensions[i]->getNumberOfPositions();
108  }
109  for (ssize_t i = size-1; i >= 0; i--)
110  {
111  multiplicator /= dimensions[i]->getNumberOfPositions();
112  vect[i] = state / multiplicator;
113  state = state % multiplicator;
114  }
115 #endif
116  return &vect;
117 }
118 
119 
120 std::vector<size_t> StateSpace::getDimensionSizes()
121 {
122  std::vector<size_t> vect(dimensions.size());
123  for (size_t i = 0; i < dimensions.size(); i++)
124  {
125  vect[i] = dimensions[i]->getNumberOfPositions(); //FIXME: what about priority states ?
126  }
127  return vect;
128 }
129 
130 
131 
133 {
134  state_t state = 0;
135  unsigned int multiplicator = 1;
136  state_t added = 0;
137  static size_t size = dimensions.size();
138  for (size_t i = 0; i < size; i++)
139  {
140  added = iState[i]; /*I think the index should be the same as i ?*/
141  state += added * multiplicator;
142  multiplicator *= dimensions[i]->getNumberOfPositions();
143  if (multiplicator <= 0)
144  throw std::runtime_error("The number of positions of one of the dimensions is not positive");
145  }
146  return state;
147 }
148 
149 
151 {
152  for (size_t i = 0; i < priorityStates.size(); i++)
153  {
154  if (priorityStates[i]->isInState())
155  return i;
156  }
157  return -1;
158 }
159 
161 {
163 }
164 
165 
167 {
168  return domainModel->measureReward();
169 }
170 
171 
172 
173 
174 
175 
176 
177 
178 
virtual statePosition_t getPosition()=0
gets the position of the state along that dimension
std::shared_ptr< DomainModel > domainModel
Definition: stateSpace.h:75
StateInternal internalState
Definition: stateSpace.h:78
virtual std::vector< size_t > * factorize(state_t state)
Definition: stateSpace.cpp:81
std::vector< StateSpaceDimension * > dimensions
Definition: stateSpace.h:72
virtual state_t getState()
Definition: stateSpace.cpp:54
size_t nbOfPriorityStates
Definition: stateSpace.h:71
state_t currentExternalState
Definition: stateSpace.h:76
state_t convertState(StateInternal)
Definition: stateSpace.cpp:132
virtual size_t size()
Definition: stateSpace.cpp:160
Definition: action.h:18
virtual std::vector< size_t > getDimensionSizes()
Definition: stateSpace.cpp:120
size_t nbOfStates
Definition: stateSpace.h:70
int statePosition_t
void updateInternalState()
Definition: stateSpace.cpp:42
virtual double getReward()
Definition: stateSpace.cpp:166
virtual size_t getNbOfDimensions()
Definition: stateSpace.cpp:75
size_t state_t
Definition: state.h:19
std::vector< PriorityState * > priorityStates
Definition: stateSpace.h:73
virtual void updateCurrentState()
Definition: stateSpace.cpp:59
int getPriorityStateInternal()
Definition: stateSpace.cpp:150
this models a dimension in the state space.
std::vector< statePosition_t > StateInternal
Definition: stateSpace.h:24