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
tempestpy_adaptions
dehnert
11 years ago
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_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue