36 #define RECAST(x) reinterpret_cast< const MultiDimFunctionGraph< GUM_SCALAR >* >(x) 52 template <
typename GUM_SCALAR >
54 GUM_CONSTRUCTOR(
FMDP);
55 __onDestructionDeleteVars = onDestructionDeleteVar;
58 __actionMap.insert(0,
new std::string(
"DEFAULT"));
60 __actionCostTable.insert(0,
nullptr);
61 __actionRewardTable.insert(0,
nullptr);
67 template <
typename GUM_SCALAR >
70 for (
auto iterA = __actionTransitionTable.beginSafe();
71 iterA != __actionTransitionTable.endSafe();
74 for (
auto iterH = (iterA.val())->beginSafe();
75 iterH != (iterA.val())->endSafe();
77 if (iterH.val())
delete iterH.val();
83 for (
auto iterA = __actionCostTable.beginSafe();
84 iterA != __actionCostTable.endSafe();
86 if (iterA.val())
delete iterA.val();
89 for (
auto iterA = __actionRewardTable.beginSafe();
90 iterA != __actionRewardTable.endSafe();
92 if (iterA.val())
delete iterA.val();
95 for (
auto iterId = __actionMap.beginSafe(); iterId != __actionMap.endSafe();
97 delete iterId.second();
100 for (
auto varIter = __main2primed.beginSafe();
101 varIter != __main2primed.endSafe();
103 delete varIter.second();
104 if (__onDestructionDeleteVars)
delete varIter.first();
107 GUM_DESTRUCTOR(
FMDP);
123 template <
typename GUM_SCALAR >
125 if (__varSeq.exists(var))
127 " Variable " << var->
name()
128 <<
" has already been inserted in FMDP.");
131 __varSeq.insert(var);
136 __main2primed.insert(var, primeVar);
152 template <
typename GUM_SCALAR >
154 const std::string& action) {
158 __actionMap.beginSafe();
159 actIter != __actionMap.endSafe();
161 if (*(actIter.second()) == action)
165 <<
" has already been inserted in FMDP with this name.");
167 if (__actionMap.existsFirst(actionId))
169 " An action with same id (" << actionId
170 <<
") has already been inserted.");
172 __actionMap.insert(actionId,
new std::string(action));
174 __actionTransitionTable.insert(actionId,
176 __actionCostTable.insert(actionId,
nullptr);
177 __actionRewardTable.insert(actionId,
nullptr);
179 __actionSeq.insert(actionId);
197 template <
typename GUM_SCALAR >
202 if (!__varSeq.exists(var))
204 " Variable " << var->
name() <<
" has not been declared before.");
206 if (!__actionTransitionTable.exists(actionId))
208 " Action " << actionName(actionId)
209 <<
" has not been declared before.");
211 if (__actionTransitionTable[actionId]->exists(var))
213 " Variable " << var->
name()
214 <<
" already has a transition table in " << actionId
217 __actionTransitionTable[actionId]->insert(var, transition);
225 template <
typename GUM_SCALAR >
229 if (!__actionTransitionTable.exists(actionId))
231 " Action " << actionName(actionId)
232 <<
" has not been declared before.");
234 if (__actionTransitionTable[actionId]->exists(v))
235 return (*__actionTransitionTable[actionId])[v];
237 return (*__actionTransitionTable[0]).exists(v)
238 ? (*__actionTransitionTable[0])[v]
256 template <
typename GUM_SCALAR >
259 if (!__actionCostTable.exists(actionId))
261 " Action " << actionName(actionId)
262 <<
" has not been declared before.");
264 if (__actionCostTable[actionId] !=
nullptr)
266 " Action " << actionName(actionId) <<
" already has a cost table");
268 __actionCostTable[actionId] = cost;
276 template <
typename GUM_SCALAR >
279 if (!__actionCostTable.exists(actionId))
281 " Action " << actionName(actionId)
282 <<
" has not been declared before.");
284 if (__actionCostTable[actionId])
return __actionCostTable[actionId];
285 return __actionCostTable[0];
301 template <
typename GUM_SCALAR >
304 if (!__actionRewardTable.exists(actionId))
306 " Action " << actionName(actionId)
307 <<
" has not been declared before.");
309 if (__actionRewardTable[actionId] !=
nullptr)
311 " Action " << actionName(actionId)
312 <<
" already has a reward table");
314 __actionRewardTable[actionId] = reward;
322 template <
typename GUM_SCALAR >
325 if (!__actionRewardTable.exists(actionId))
327 " Action " << actionName(actionId)
328 <<
" has not been declared before.");
330 if (__actionRewardTable[actionId])
return __actionRewardTable[actionId];
331 return __actionRewardTable[0];
346 template <
typename GUM_SCALAR >
348 if (!__actionMap.existsFirst(actionId))
351 return *(__actionMap.second(actionId));
357 template <
typename GUM_SCALAR >
361 actIter != __actionMap.end();
363 if (*(actIter.second()) == action) {
return actIter.first(); }
369 template <
typename GUM_SCALAR >
371 std::stringstream fmdpCore;
373 for (
auto actionIter = beginActions(); actionIter != endActions();
375 for (
auto varIter = beginVariables(); varIter != endVariables(); ++varIter)
376 if (this->transition(*actionIter, *varIter))
377 fmdpCore <<
RECAST(this->transition(*actionIter, *varIter))->toDot()
379 if (this->reward(*actionIter))
380 fmdpCore <<
RECAST(this->reward(*actionIter))->toDot() << std::endl;
383 for (
auto varIter = beginVariables(); varIter != endVariables(); ++varIter)
384 if (this->transition(0, *varIter))
385 fmdpCore <<
RECAST(this->transition(0, *varIter))->toDot() << std::endl;
386 if (this->reward()) fmdpCore <<
RECAST(this->reward())->toDot() << std::endl;
387 return fmdpCore.str();
391 template <
typename GUM_SCALAR >
394 for (
auto actionIter = beginActions(); actionIter != endActions();
396 for (
auto varIter = beginVariables(); varIter != endVariables(); ++varIter)
397 if (this->transition(*actionIter, *varIter))
398 s += this->transition(*actionIter, *varIter)->realSize();
399 if (this->reward(*actionIter)) s += this->reward(*actionIter)->realSize();
402 for (
auto varIter = beginVariables(); varIter != endVariables(); ++varIter)
403 if (this->transition(0, *varIter))
404 s += this->transition(0, *varIter)->realSize();
405 if (this->reward()) s += this->reward()->realSize();
void setName(const std::string &theValue)
sets the name of the variable
~FMDP()
Default destructor.
Idx actionId(const std::string &) const
Returns action id.
Safe iterators for bijectionIterator.
const std::string & actionName(Idx actionId) const
Returns name of action given in parameter.
virtual DiscreteVariable * clone() const =0
Copy Factory.
void addCostForAction(Idx actionId, const MultiDimImplementation< GUM_SCALAR > *cost)
Adds a cost table to specified action.
This class is used to implement factored decision process.
Base class for discrete random variable.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
The class for generic Hash Tables.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
void addVariable(const DiscreteVariable *var)
Adds a variable to FMDP description.
void addTransitionForAction(Idx actionId, const DiscreteVariable *var, const MultiDimImplementation< GUM_SCALAR > *transition)
Adds a variable transition table to specified action.
const MultiDimImplementation< GUM_SCALAR > * transition(Idx actionId, const DiscreteVariable *v) const
Returns transition associated to given in parameter variable and the given action.
FMDP(bool onDestructionDeleteVar=false)
Default constructor.
Size size() const
Returns the map binding main variables and prime variables.
const MultiDimImplementation< GUM_SCALAR > * reward(Idx actionId=0) const
Returns the reward table of mdp.
void addRewardForAction(Idx actionId, const MultiDimImplementation< GUM_SCALAR > *reward)
Adds a default variable reward.
Unsafe iterators for bijection.
const MultiDimImplementation< GUM_SCALAR > * cost(Idx actionId=0) const
Returns the reward table of mdp.
<agrum/multidim/multiDimImplementation.h>
Size Idx
Type for indexes.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
const std::string & name() const
returns the name of the variable
void addAction(Idx actionId, const std::string &action)
Adds an action to FMDP description.
#define GUM_ERROR(type, msg)
std::string toString() const
Displays the FMDP in a Dot format.