|
|
@ -106,17 +106,17 @@ namespace storm { |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType, typename IndexType> |
|
|
|
ExplicitPrismModelBuilder<ValueType, IndexType>::Options::Options() : buildCommandLabels(false), buildAllRewardModels(true), rewardModelsToBuild(), constantDefinitions(), buildAllLabels(true), labelsToBuild(), expressionLabels(), terminalStates() { |
|
|
|
ExplicitPrismModelBuilder<ValueType, IndexType>::Options::Options() : buildCommandLabels(false), buildAllRewardModels(true), rewardModelsToBuild(), constantDefinitions(), buildAllLabels(true), labelsToBuild(), expressionLabels(), terminalStates(), negatedTerminalStates() { |
|
|
|
// Intentionally left empty.
|
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType, typename IndexType> |
|
|
|
ExplicitPrismModelBuilder<ValueType, IndexType>::Options::Options(storm::logic::Formula const& formula) : buildCommandLabels(false), buildAllRewardModels(false), rewardModelsToBuild(), constantDefinitions(), buildAllLabels(false), labelsToBuild(std::set<std::string>()), expressionLabels(std::vector<storm::expressions::Expression>()), terminalStates() { |
|
|
|
ExplicitPrismModelBuilder<ValueType, IndexType>::Options::Options(storm::logic::Formula const& formula) : buildCommandLabels(false), buildAllRewardModels(false), rewardModelsToBuild(), constantDefinitions(), buildAllLabels(false), labelsToBuild(std::set<std::string>()), expressionLabels(std::vector<storm::expressions::Expression>()), terminalStates(), negatedTerminalStates() { |
|
|
|
this->preserveFormula(formula); |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType, typename IndexType> |
|
|
|
ExplicitPrismModelBuilder<ValueType, IndexType>::Options::Options(std::vector<std::shared_ptr<storm::logic::Formula>> const& formulas) : buildCommandLabels(false), buildAllRewardModels(false), rewardModelsToBuild(), constantDefinitions(), buildAllLabels(false), labelsToBuild(), expressionLabels(), terminalStates() { |
|
|
|
ExplicitPrismModelBuilder<ValueType, IndexType>::Options::Options(std::vector<std::shared_ptr<storm::logic::Formula>> const& formulas) : buildCommandLabels(false), buildAllRewardModels(false), rewardModelsToBuild(), constantDefinitions(), buildAllLabels(false), labelsToBuild(), expressionLabels(), terminalStates(), negatedTerminalStates() { |
|
|
|
if (formulas.empty()) { |
|
|
|
this->buildAllRewardModels = true; |
|
|
|
this->buildAllLabels = true; |
|
|
@ -142,10 +142,16 @@ namespace storm { |
|
|
|
this->setTerminalStatesFromFormula(sub); |
|
|
|
} |
|
|
|
} else if (formula.isUntilFormula()) { |
|
|
|
storm::logic::Formula const& right = formula.asUntilFormula().getLeftSubformula(); |
|
|
|
storm::logic::Formula const& right = formula.asUntilFormula().getRightSubformula(); |
|
|
|
if (right.isAtomicExpressionFormula() || right.isAtomicLabelFormula()) { |
|
|
|
this->setTerminalStatesFromFormula(right); |
|
|
|
} |
|
|
|
storm::logic::Formula const& left = formula.asUntilFormula().getLeftSubformula(); |
|
|
|
if (left.isAtomicExpressionFormula()) { |
|
|
|
negatedTerminalStates = left.asAtomicExpressionFormula().getExpression(); |
|
|
|
} else if (left.isAtomicLabelFormula()) { |
|
|
|
negatedTerminalStates = left.asAtomicLabelFormula().getLabel(); |
|
|
|
} |
|
|
|
} else if (formula.isProbabilityOperatorFormula()) { |
|
|
|
storm::logic::Formula const& sub = formula.asProbabilityOperatorFormula().getSubformula(); |
|
|
|
if (sub.isEventuallyFormula() || sub.isUntilFormula()) { |
|
|
@ -160,6 +166,9 @@ namespace storm { |
|
|
|
if (terminalStates) { |
|
|
|
terminalStates.reset(); |
|
|
|
} |
|
|
|
if (negatedTerminalStates) { |
|
|
|
negatedTerminalStates.reset(); |
|
|
|
} |
|
|
|
|
|
|
|
// If we are not required to build all reward models, we determine the reward models we need to build.
|
|
|
|
if (!buildAllRewardModels) { |
|
|
@ -932,7 +941,8 @@ namespace storm { |
|
|
|
rewardModelBuilders.emplace_back(deterministicModel, rewardModel.get().hasStateRewards(), rewardModel.get().hasStateActionRewards(), rewardModel.get().hasTransitionRewards()); |
|
|
|
} |
|
|
|
|
|
|
|
// If we were asked to treat some states as terminal states, we cut away their transitions now.
|
|
|
|
// If we were asked to treat some states as terminal states, we determine an expression characterizing the
|
|
|
|
// terminal states of the model that we pass on to the matrix building routine.
|
|
|
|
boost::optional<storm::expressions::Expression> terminalExpression; |
|
|
|
if (options.terminalStates) { |
|
|
|
if (options.terminalStates.get().type() == typeid(storm::expressions::Expression)) { |
|
|
@ -942,9 +952,27 @@ namespace storm { |
|
|
|
terminalExpression = program.getLabelExpression(labelName); |
|
|
|
} |
|
|
|
} |
|
|
|
if (options.negatedTerminalStates) { |
|
|
|
if (options.negatedTerminalStates.get().type() == typeid(storm::expressions::Expression)) { |
|
|
|
if (terminalExpression) { |
|
|
|
terminalExpression = terminalExpression.get() || !boost::get<storm::expressions::Expression>(options.negatedTerminalStates.get()); |
|
|
|
} else { |
|
|
|
terminalExpression = !boost::get<storm::expressions::Expression>(options.negatedTerminalStates.get()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
std::string const& labelName = boost::get<std::string>(options.negatedTerminalStates.get()); |
|
|
|
if (terminalExpression) { |
|
|
|
terminalExpression = terminalExpression.get() || !program.getLabelExpression(labelName); |
|
|
|
} else { |
|
|
|
terminalExpression = !program.getLabelExpression(labelName); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (terminalExpression) { |
|
|
|
STORM_LOG_TRACE("Making the states satisfying " << terminalExpression.get() << " terminal."); |
|
|
|
} |
|
|
|
|
|
|
|
modelComponents.choiceLabeling = buildMatrices(program, variableInformation, selectedRewardModels, stateInformation, options.buildCommandLabels, deterministicModel, discreteTimeModel, transitionMatrixBuilder, rewardModelBuilders, terminalExpression); |
|
|
|
|
|
|
|
modelComponents.transitionMatrix = transitionMatrixBuilder.build(); |
|
|
|
|
|
|
|
// Now finalize all reward models.
|
|
|
|