Browse Source
Added scheduler classes. Added method to model classes that applies a scheduler.
Added scheduler classes. Added method to model classes that applies a scheduler.
Former-commit-id: 73a4be11b2
main
14 changed files with 250 additions and 8 deletions
-
2src/counterexamples/MILPMinimalLabelSetGenerator.h
-
2src/counterexamples/SMTMinimalCommandSetGenerator.h
-
12src/models/AbstractModel.h
-
7src/models/AbstractNondeterministicModel.h
-
11src/models/Ctmc.h
-
12src/models/Ctmdp.h
-
14src/models/Dtmc.h
-
15src/models/Mdp.h
-
24src/storage/PartialScheduler.cpp
-
24src/storage/PartialScheduler.h
-
36src/storage/Scheduler.h
-
21src/storage/TotalScheduler.cpp
-
26src/storage/TotalScheduler.h
-
52src/utility/matrix.h
@ -0,0 +1,24 @@ |
|||||
|
#include "src/storage/PartialScheduler.h"
|
||||
|
#include "src/exceptions/InvalidArgumentException.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
void PartialScheduler::setChoice(uint_fast64_t state, uint_fast64_t choice) { |
||||
|
choices[state] = choice; |
||||
|
} |
||||
|
|
||||
|
bool PartialScheduler::isChoiceDefined(uint_fast64_t state) const { |
||||
|
return choices.find(state) != choices.end(); |
||||
|
} |
||||
|
|
||||
|
uint_fast64_t PartialScheduler::getChoice(uint_fast64_t state) const { |
||||
|
auto stateChoicePair = choices.find(state); |
||||
|
|
||||
|
if (stateChoicePair == choices.end()) { |
||||
|
throw storm::exceptions::InvalidArgumentException() << "Scheduler does not define a choice for state " << state; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} // namespace storage
|
||||
|
} // namespace storm
|
@ -0,0 +1,24 @@ |
|||||
|
#ifndef STORM_STORAGE_PARTIALSCHEDULER_H_ |
||||
|
#define STORM_STORAGE_PARTIALSCHEDULER_H_ |
||||
|
|
||||
|
#include "src/storage/Scheduler.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
class PartialScheduler : public Scheduler { |
||||
|
public: |
||||
|
void setChoice(uint_fast64_t state, uint_fast64_t choice) override; |
||||
|
|
||||
|
bool isChoiceDefined(uint_fast64_t state) const override; |
||||
|
|
||||
|
uint_fast64_t getChoice(uint_fast64_t state) const override; |
||||
|
|
||||
|
private: |
||||
|
// A mapping from all states that have defined choices to their respective choices. |
||||
|
std::unsorted_map<uint_fast64_t, uint_fast64_t> choices; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif /* STORM_STORAGE_PARTIALSCHEDULER_H_ */ |
@ -0,0 +1,36 @@ |
|||||
|
#ifndef STORM_STORAGE_SCHEDULER_H_ |
||||
|
#define STORM_STORAGE_SCHEDULER_H_ |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
/* |
||||
|
* This class is the abstract base class of all scheduler classes. Scheduler classes define which action is chosen in a particular state of a non-deterministic model. |
||||
|
*/ |
||||
|
class Scheduler { |
||||
|
public: |
||||
|
/* |
||||
|
* Sets the choice defined by the scheduler for the given state. |
||||
|
* |
||||
|
* @param state The state for which to set the choice. |
||||
|
* @param choice The choice to set for the given state. |
||||
|
*/ |
||||
|
virtual void setChoice(uint_fast64_t state, uint_fast64_t choice) = 0; |
||||
|
|
||||
|
/* |
||||
|
* Retrieves whether this scheduler defines a choice for the given state. |
||||
|
* |
||||
|
* @param state The state for which to check whether the scheduler defines a choice. |
||||
|
* @return True if the scheduler defines a choice for the given state. |
||||
|
*/ |
||||
|
virtual bool isChoiceDefined(uint_fast64_t state) const = 0; |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves the choice for the given state under the assumption that the scheduler defines a proper choice for the state. |
||||
|
*/ |
||||
|
virtual uint_fast64_t getChoice(uint_fast64_t state) const = 0; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif /* STORM_STORAGE_SCHEDULER_H_ */ |
@ -0,0 +1,21 @@ |
|||||
|
#include "src/storage/TotalScheduler.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
TotalScheduler::TotalScheduler(uint_fast64_t numberOfStates) : choices(numberOfStates) { |
||||
|
// Intentionally left empty.
|
||||
|
} |
||||
|
|
||||
|
void setChoice(uint_fast64_t state, uint_fast64_t choice) override { |
||||
|
choices[state] = choice; |
||||
|
} |
||||
|
|
||||
|
bool isChoiceDefined(uint_fast64_t state) const override { |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
uint_fast64_t getChoice(uint_fast64_t state) const override { |
||||
|
return choices[state]; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,26 @@ |
|||||
|
#ifndef STORM_STORAGE_TOTALSCHEDULER_H_ |
||||
|
#define STORM_STORAGE_TOTALSCHEDULER_H_ |
||||
|
|
||||
|
#include "src/storage/Scheduler.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace storage { |
||||
|
|
||||
|
class TotalScheduler : public Scheduler { |
||||
|
public: |
||||
|
TotalScheduler(uint_fast64_t numberOfStates); |
||||
|
|
||||
|
void setChoice(uint_fast64_t state, uint_fast64_t choice) override; |
||||
|
|
||||
|
bool isChoiceDefined(uint_fast64_t state) const override; |
||||
|
|
||||
|
uint_fast64_t getChoice(uint_fast64_t state) const override; |
||||
|
|
||||
|
private: |
||||
|
// A vector that stores the choice for each state. |
||||
|
std::vector<uint_fast64_t> choices; |
||||
|
}; |
||||
|
} // namespace storage |
||||
|
} // namespace storm |
||||
|
|
||||
|
#endif /* STORM_STORAGE_TOTALSCHEDULER_H_ */ |
@ -0,0 +1,52 @@ |
|||||
|
#ifndef STORM_UTILITY_MATRIX_H_ |
||||
|
#define STORM_UTILITY_MATRIX_H_ |
||||
|
|
||||
|
#include "src/storage/SparseMatrix.h" |
||||
|
#include "src/storage/Scheduler.h" |
||||
|
#include "src/exceptions/InvalidStateException.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace utility { |
||||
|
namespace matrix { |
||||
|
|
||||
|
/*! |
||||
|
* Applies the given scheduler to the given transition matrix. This means that all choices that are not taken by the scheduler are |
||||
|
* dropped from the transition matrix. If a state has no choice enabled, it is equipped with a self-loop instead. |
||||
|
* |
||||
|
* @param transitionMatrix The transition matrix of the original system. |
||||
|
* @param nondeterministicChoiceIndices A vector indicating at which rows the choices for the states begin. |
||||
|
* @param scheduler The scheduler to apply to the system. |
||||
|
* @return A transition matrix that corresponds to all transitions of the given system that are selected by the given scheduler. |
||||
|
*/ |
||||
|
template <typename T> |
||||
|
storm::storage::SparseMatrix<T> applyScheduler(storm::storage::SparseMatrix<T> const& transitionMatrix, std::vector<uint_fast64_t> const& nondeterministicChoiceIndices, storm::storage::Scheduler const& scheduler) { |
||||
|
storm::storage::SparseMatrix<T> result(nondeterministicChoiceIndices.size() - 1, transitionMatrix.getColumnCount()); |
||||
|
|
||||
|
for (uint_fast64_t state = 0; state < nondeterministicChoiceIndices.size() - 1; ++state) { |
||||
|
if (scheduler.isChoiceDefined(state)) { |
||||
|
// Check whether the choice is valid for this state. |
||||
|
uint_fast64_t choice = nondeterministicChoiceIndices[state] + scheduler.getChoice(state); |
||||
|
if (choice >= nondeterministicChoiceIndices[state + 1]) { |
||||
|
throw storm::exceptions::InvalidStateException() << "Scheduler defines illegal choice " << choice << " for state " << state << "."; |
||||
|
} |
||||
|
|
||||
|
// If a valid choice for this state is defined, we copy over the corresponding entries. |
||||
|
typename storm::storage::SparseMatrix<T>::Rows selectedRow = transitionMatrix.getRow(choice); |
||||
|
for (auto entry : selectedRow) { |
||||
|
result.insertNextValue(state, entry.column(), entry.value()); |
||||
|
} |
||||
|
} else { |
||||
|
// If no valid choice for the state is defined, we insert a self-loop. |
||||
|
result.insertNextValue(state, state, storm::utility::constGetOne<T>()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Finalize the matrix creation and return result. |
||||
|
result.finalize(); |
||||
|
return result; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif /* STORM_UTILITY_MATRIX_H_ */ |
Reference in new issue
xxxxxxxxxx