50 lines
2.2 KiB
50 lines
2.2 KiB
#include "src/generator/PrismStateLabelingGenerator.h"
|
|
|
|
#include "src/generator/CompressedState.h"
|
|
|
|
#include "src/storage/expressions/ExpressionEvaluator.h"
|
|
|
|
namespace storm {
|
|
namespace generator {
|
|
|
|
template<typename ValueType, typename StateType>
|
|
PrismStateLabelingGenerator<ValueType, StateType>::PrismStateLabelingGenerator(storm::prism::Program const& program, VariableInformation const& variableInformation) : program(program), variableInformation(variableInformation) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
template<typename ValueType, typename StateType>
|
|
storm::models::sparse::StateLabeling PrismStateLabelingGenerator<ValueType, StateType>::generate(storm::storage::BitVectorHashMap<StateType> const& states, std::vector<StateType> const& initialStateIndices) {
|
|
std::vector<storm::prism::Label> const& labels = program.getLabels();
|
|
|
|
storm::expressions::ExpressionEvaluator<ValueType> evaluator(program.getManager());
|
|
storm::models::sparse::StateLabeling result(states.size());
|
|
|
|
// Initialize labeling.
|
|
for (auto const& label : labels) {
|
|
result.addLabel(label.getName());
|
|
}
|
|
for (auto const& stateIndexPair : states) {
|
|
unpackStateIntoEvaluator(stateIndexPair.first, variableInformation, evaluator);
|
|
|
|
for (auto const& label : labels) {
|
|
// Add label to state, if the corresponding expression is true.
|
|
if (evaluator.asBool(label.getStatePredicateExpression())) {
|
|
result.addLabelToState(label.getName(), stateIndexPair.second);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Also label the initial state with the special label "init".
|
|
result.addLabel("init");
|
|
for (auto index : initialStateIndices) {
|
|
result.addLabelToState("init", index);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
template class PrismStateLabelingGenerator<double, uint32_t>;
|
|
template class PrismStateLabelingGenerator<storm::RationalFunction, uint32_t>;
|
|
|
|
}
|
|
}
|