51 rewardModels.push_back(rewardModel);
57 rewardModels.push_back(this->program.
getRewardModel(rewardModelName));
59 STORM_LOG_THROW(rewardModelName.empty(), storm::exceptions::InvalidArgumentException,
60 "Cannot build unknown reward model '" << rewardModelName <<
"'.");
62 "Reference to standard reward model is ambiguous.");
68 if (rewardModels.empty() && !this->options.getRewardModelNames().empty()) {
74 for (
auto const& rewardModel : rewardModels) {
75 hasStateActionRewards |= rewardModel.get().hasStateActionRewards();
81 if (expressionOrLabelAndBool.first.isExpression()) {
82 this->terminalStates.push_back(std::make_pair(expressionOrLabelAndBool.first.getExpression(), expressionOrLabelAndBool.second));
84 if (program.
hasLabel(expressionOrLabelAndBool.first.getLabel())) {
85 this->terminalStates.push_back(
86 std::make_pair(this->program.
getLabelExpression(expressionOrLabelAndBool.first.getLabel()), expressionOrLabelAndBool.second));
89 STORM_LOG_THROW(this->isSpecialLabel(expressionOrLabelAndBool.first.getLabel()), storm::exceptions::InvalidArgumentException,
90 "Terminal states refer to illegal label '" << expressionOrLabelAndBool.first.getLabel() <<
"'.");
102template<
typename ValueType,
typename StateType>
108template<
typename ValueType,
typename StateType>
109void PrismNextStateGenerator<ValueType, StateType>::checkValid()
const {
112 std::vector<std::reference_wrapper<storm::prism::Constant const>> undefinedConstants = program.
getUndefinedConstants();
113 std::stringstream stream;
114 bool printComma =
false;
115 for (
auto const& constant : undefinedConstants) {
121 stream << constant.get().getName() <<
" (" << constant.get().getType() <<
")";
124 STORM_LOG_THROW(
false, storm::exceptions::InvalidArgumentException,
"Program still contains these undefined constants: " + stream.str() +
".");
128 "The program contains undefined constants that appear in some places other than update probabilities and reward value expressions, "
129 "which is not admitted. Undefined constants are: "
134template<
typename ValueType,
typename StateType>
136 switch (program.getModelType()) {
150 STORM_LOG_THROW(
false, storm::exceptions::WrongFormatException,
"Invalid model type.");
154template<
typename ValueType,
typename StateType>
156 return program.isDeterministicModel();
159template<
typename ValueType,
typename StateType>
161 return program.isDiscreteTimeModel();
164template<
typename ValueType,
typename StateType>
166 return program.isPartiallyObservable();
169template<
typename ValueType,
typename StateType>
171 std::vector<StateType> initialStateIndices;
174 if (program.hasInitialConstruct() && program.getInitialStatesExpression().isTrue()) {
176 std::vector<std::vector<uint64_t>> allValues;
178 STORM_LOG_ASSERT(intVar.lowerBound <= intVar.upperBound,
"Expecting variable with non-empty set of possible values.");
182 uint64_t intEndIndex = allValues.size();
184 allValues.resize(allValues.size() + this->variableInformation.booleanVariables.size(),
185 std::vector<uint64_t>({static_cast<uint64_t>(0), static_cast<uint64_t>(1)}));
187 std::vector<std::vector<uint64_t>::const_iterator> its;
188 std::vector<std::vector<uint64_t>::const_iterator> ites;
189 for (
auto const& valVec : allValues) {
190 its.push_back(valVec.cbegin());
191 ites.push_back(valVec.cend());
198 [
this, &initialState, &intEndIndex](uint64_t index, uint64_t value) {
200 if (index < intEndIndex) {
203 initialState.
setFromInt(intVar.bitOffset, intVar.bitWidth, value);
209 initialState.
set(boolVar.bitOffset,
static_cast<bool>(value));
212 [&stateToIdCallback, &initialStateIndices, &initialState]() {
214 StateType
id = stateToIdCallback(initialState);
215 initialStateIndices.push_back(
id);
218 STORM_LOG_DEBUG(
"Enumerated " << initialStateIndices.size() <<
" initial states using brute force enumeration.");
222 std::unique_ptr<storm::solver::SmtSolver>
solver = factory.
create(program.getManager());
224 std::vector<storm::expressions::Expression> rangeExpressions = program.getAllRangeExpressions();
225 for (
auto const& expression : rangeExpressions) {
228 solver->add(program.getInitialStatesExpression());
238 std::shared_ptr<storm::solver::SmtSolver::ModelReference> model =
solver->getModel();
240 bool variableValue = model->getBooleanValue(booleanVariable.variable);
242 blockingExpression = blockingExpression.
isInitialized() ? blockingExpression || localBlockingExpression : localBlockingExpression;
243 initialState.
set(booleanVariable.bitOffset, variableValue);
246 int_fast64_t variableValue = model->getIntegerValue(integerVariable.variable);
248 blockingExpression = blockingExpression.
isInitialized() ? blockingExpression || localBlockingExpression : localBlockingExpression;
249 initialState.
setFromInt(integerVariable.bitOffset, integerVariable.bitWidth,
250 static_cast<uint_fast64_t
>(variableValue - integerVariable.lowerBound));
254 StateType
id = stateToIdCallback(initialState);
255 initialStateIndices.push_back(
id);
261 solver->add(blockingExpression);
264 STORM_LOG_DEBUG(
"Enumerated " << initialStateIndices.size() <<
" initial states using SMT solving.");
267 return initialStateIndices;
270template<
typename ValueType,
typename StateType>
277 for (
auto const& rewardModel : rewardModels) {
279 if (rewardModel.get().hasStateRewards()) {
280 for (
auto const& stateReward : rewardModel.get().getStateRewards()) {
281 if (this->
evaluator->asBool(stateReward.getStatePredicateExpression())) {
282 stateRewardValue += ValueType(this->
evaluator->asRational(stateReward.getRewardValueExpression()));
292 if (this->
evaluator->asBool(expressionBool.first) == expressionBool.second) {
299 std::vector<Choice<ValueType>> allChoices = getSelfLoopsForAllActions(*this->
state, stateToIdCallback);
300 if (allChoices.size() != 0) {
301 for (
auto& choice : allChoices) {
316 std::vector<Choice<ValueType>> allChoices;
317 if (this->
getOptions().isApplyMaximalProgressAssumptionSet()) {
321 if (allChoices.empty()) {
327 allChoices = getAsynchronousChoices(*this->
state, stateToIdCallback);
328 addSynchronousChoices(allChoices, *this->
state, stateToIdCallback);
333 if (allChoices.empty()) {
351 for (
auto const& choice : allChoices) {
352 for (
auto const& stateProbabilityPair : choice) {
354 globalChoice.
addProbability(stateProbabilityPair.first, stateProbabilityPair.second / totalNumberOfChoices);
356 globalChoice.
addProbability(stateProbabilityPair.first, stateProbabilityPair.second);
361 totalExitRate += choice.getTotalMass();
365 globalChoice.
addLabels(choice.getLabels());
374 for (
auto const& rewardModel : rewardModels) {
376 if (rewardModel.get().hasStateActionRewards()) {
377 for (
auto const& stateActionReward : rewardModel.get().getStateActionRewards()) {
378 for (
auto const& choice : allChoices) {
379 if (stateActionReward.getActionIndex() == choice.getActionIndex() &&
380 this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) {
381 stateActionRewardValue +=
382 ValueType(this->
evaluator->asRational(stateActionReward.getRewardValueExpression())) * choice.getTotalMass();
387 if (hasStateActionRewards) {
388 globalChoice.
addReward(stateActionRewardValue / totalExitRate);
394 allChoices.push_back(std::move(globalChoice));
399 auto choiceIt = allChoices.begin();
401 "State '" << this->stateToString(*this->state)
402 <<
"' features a choice without player index.");
406 <<
"' features a choice with invalid player index.");
407 for (++choiceIt; choiceIt != allChoices.end(); ++choiceIt) {
409 "State '" << this->stateToString(*this->state)
410 <<
"' features a choice without player index.");
412 "State '" << this->stateToString(*this->state)
413 <<
"' features a choice with invalid player index.");
414 STORM_LOG_THROW(statePlayerIndex == choiceIt->getPlayerIndex(), storm::exceptions::WrongFormatException,
415 "The player for state '" << this->stateToString(*this->state) <<
"' is not unique. At least one choice is owned by player '"
416 << statePlayerIndex <<
"' while another is owned by player '" << choiceIt->getPlayerIndex() <<
"'.");
421 for (
auto& choice : allChoices) {
430template<
typename ValueType,
typename StateType>
435template<
typename ValueType,
typename StateType>
448 auto boolIt = this->variableInformation.booleanVariables.begin();
449 for (; assignmentIt != assignmentIte && assignmentIt->getExpression().hasBooleanType(); ++assignmentIt) {
450 while (assignmentIt->getVariable() != boolIt->variable) {
453 newState.set(boolIt->bitOffset, this->evaluator->asBool(assignmentIt->getExpression()));
457 auto integerIt = this->variableInformation.integerVariables.begin();
458 for (; assignmentIt != assignmentIte && assignmentIt->getExpression().hasIntegerType(); ++assignmentIt) {
459 while (assignmentIt->getVariable() != integerIt->variable) {
462 int_fast64_t assignedValue = this->evaluator->asInt(assignmentIt->getExpression());
464 if (assignedValue < integerIt->lowerBound || assignedValue > integerIt->upperBound) {
465 return this->outOfBoundsState;
467 }
else if (integerIt->forceOutOfBoundsCheck || this->options.isExplorationChecksSet()) {
468 STORM_LOG_THROW(assignedValue >= integerIt->lowerBound, storm::exceptions::WrongFormatException,
469 "The update " << update <<
" leads to an out-of-bounds value (" << assignedValue <<
") for the variable '"
470 << assignmentIt->getVariableName() <<
"'.");
471 STORM_LOG_THROW(assignedValue <= integerIt->upperBound, storm::exceptions::WrongFormatException,
472 "The update " << update <<
" leads to an out-of-bounds value (" << assignedValue <<
") for the variable '"
473 << assignmentIt->getVariableName() <<
"'.");
475 newState.setFromInt(integerIt->bitOffset, integerIt->bitWidth, assignedValue - integerIt->lowerBound);
476 STORM_LOG_ASSERT(
static_cast<int_fast64_t
>(newState.getAsInt(integerIt->bitOffset, integerIt->bitWidth)) + integerIt->lowerBound == assignedValue,
477 "Writing to the bit vector bucket failed (read " << newState.getAsInt(integerIt->bitOffset, integerIt->bitWidth) <<
" but wrote "
478 << assignedValue <<
").");
482 STORM_LOG_ASSERT(assignmentIt == assignmentIte,
"Not all assignments were consumed.");
498template<
typename ValueType,
typename StateType>
499boost::optional<std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>>>
500PrismNextStateGenerator<ValueType, StateType>::getActiveCommandsByActionIndex(uint_fast64_t
const& actionIndex, CommandFilter
const& commandFilter) {
507 std::vector<ActiveCommandData> activeCommands;
516 std::set<uint_fast64_t>
const& commandIndices =
module.getCommandIndicesByActionIndex(actionIndex);
520 if (commandIndices.empty()) {
525 bool hasOneEnabledCommand =
false;
526 for (
auto commandIndexIt = commandIndices.begin(), commandIndexIte = commandIndices.end(); commandIndexIt != commandIndexIte; ++commandIndexIt) {
528 if (!isCommandPotentiallySynchronizing(command)) {
531 if (commandFilter != CommandFilter::All) {
532 STORM_LOG_ASSERT(commandFilter == CommandFilter::Markovian || commandFilter == CommandFilter::Probabilistic,
"Unexpected command filter.");
533 if ((commandFilter == CommandFilter::Markovian) != command.
isMarkovian()) {
539 hasOneEnabledCommand =
true;
540 activeCommands.emplace_back(&module, &commandIndices, commandIndexIt);
545 if (!hasOneEnabledCommand) {
551 std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>> result;
554 for (
auto const& activeCommand : activeCommands) {
555 std::vector<std::reference_wrapper<storm::prism::Command const>> commands;
557 auto commandIndexIt = activeCommand.currentCommandIndexIt;
559 commands.push_back(activeCommand.modulePtr->getCommand(*commandIndexIt));
562 auto commandIndexIte = activeCommand.commandIndicesPtr->end();
563 for (++commandIndexIt; commandIndexIt != commandIndexIte; ++commandIndexIt) {
565 if (commandFilter != CommandFilter::All) {
566 STORM_LOG_ASSERT(commandFilter == CommandFilter::Markovian || commandFilter == CommandFilter::Probabilistic,
"Unexpected command filter.");
567 if ((commandFilter == CommandFilter::Markovian) != command.
isMarkovian()) {
572 commands.push_back(command);
576 result.push_back(std::move(commands));
583template<
typename ValueType,
typename BaseValueType>
589 return ValueType(lower, carl::BoundType::WEAK, upper, carl::BoundType::WEAK);
600template<
typename ValueType,
typename StateType>
601std::vector<Choice<ValueType>> PrismNextStateGenerator<ValueType, StateType>::getAsynchronousChoices(
CompressedState const& state,
602 StateToIdCallback stateToIdCallback,
603 CommandFilter
const& commandFilter) {
604 std::vector<Choice<ValueType>> result;
615 if (isCommandPotentiallySynchronizing(command)) {
619 if (commandFilter != CommandFilter::All) {
620 STORM_LOG_ASSERT(commandFilter == CommandFilter::Markovian || commandFilter == CommandFilter::Probabilistic,
"Unexpected command filter.");
621 if ((commandFilter == CommandFilter::Markovian) != command.
isMarkovian()) {
625 if (this->actionMask !=
nullptr) {
642 choice.addOriginData(boost::any(std::move(commandIndex)));
648 storm::prism::Update
const& update = command.
getUpdate(k);
654 StateType stateIndex = stateToIdCallback(applyUpdate(state, update));
657 choice.addProbability(stateIndex, probability);
659 if constexpr (!std::is_same_v<ValueType, storm::RationalFunction>) {
661 "Probability expression in update '" << update <<
" evaluates to negative value " << probability <<
".");
663 storm::exceptions::WrongFormatException,
664 "Probability expression in update '" << update <<
" evaluates to value " << probability <<
" >1.");
666 probabilitySum += probability;
672 for (
auto const& rewardModel : rewardModels) {
674 if (rewardModel.get().hasStateActionRewards()) {
675 for (
auto const& stateActionReward : rewardModel.get().getStateActionRewards()) {
676 if (stateActionReward.getActionIndex() == choice.getActionIndex() &&
677 this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) {
678 stateActionRewardValue +=
ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression()));
682 choice.addReward(stateActionRewardValue);
692 auto const playerOfModule = moduleIndexToPlayerIndexMap.at(i);
694 "Module " << module.
getName() <<
" is not owned by any player but has at least one enabled, unlabeled command.");
695 choice.setPlayerIndex(playerOfModule);
698 auto const playerOfAction = actionIndexToPlayerIndexMap.at(command.
getActionIndex());
701 choice.setPlayerIndex(playerOfAction);
708 storm::exceptions::WrongFormatException,
709 "Probabilities do not sum to one for command '" << command <<
"' (actually sum to " << probabilitySum <<
").");
717template<
typename ValueType,
typename StateType>
718std::vector<Choice<ValueType>> PrismNextStateGenerator<ValueType, StateType>::getSelfLoopsForAllActions(
CompressedState const& state,
720 CommandFilter
const& commandFilter) {
721 std::vector<Choice<ValueType>> result;
726 storm::prism::Module
const& module = program.
getModule(i);
730 storm::prism::Command
const& command =
module.getCommand(j);
733 if (isCommandPotentiallySynchronizing(command)) {
737 if (this->actionMask !=
nullptr) {
754 choice.addOriginData(boost::any(std::move(commandIndex)));
759 for (
auto const& rewardModel : rewardModels) {
761 if (rewardModel.get().hasStateActionRewards()) {
762 for (
auto const& stateActionReward : rewardModel.get().getStateActionRewards()) {
763 if (stateActionReward.getActionIndex() == choice.getActionIndex() &&
764 this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) {
765 stateActionRewardValue +=
ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression()));
769 choice.addReward(stateActionRewardValue);
780 if (this->actionMask !=
nullptr) {
781 if (!this->actionMask->query(*
this, actionIndex)) {
785 boost::optional<std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>>> optionalActiveCommandLists =
786 getActiveCommandsByActionIndex(actionIndex, commandFilter);
789 if (optionalActiveCommandLists) {
790 std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>>
const& activeCommandList = optionalActiveCommandLists.get();
791 std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>::const_iterator> iteratorList(activeCommandList.size());
794 for (
size_t i = 0;
i < activeCommandList.size(); ++
i) {
795 iteratorList[
i] = activeCommandList[
i].cbegin();
814 CommandSet commandIndices;
815 for (uint_fast64_t i = 0;
i < iteratorList.size(); ++
i) {
816 commandIndices.insert(iteratorList[i]->get().getGlobalIndex());
818 choice.addOriginData(boost::any(std::move(commandIndices)));
823 for (
auto const& rewardModel : rewardModels) {
825 if (rewardModel.get().hasStateActionRewards()) {
826 for (
auto const& stateActionReward : rewardModel.get().getStateActionRewards()) {
827 if (stateActionReward.getActionIndex() == choice.getActionIndex() &&
828 this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) {
829 stateActionRewardValue +=
ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression()));
833 choice.addReward(stateActionRewardValue);
837 bool movedIterator =
false;
838 for (int_fast64_t j = iteratorList.size() - 1; !movedIterator && j >= 0; --j) {
840 if (iteratorList[j] != activeCommandList[j].end()) {
841 movedIterator =
true;
844 iteratorList[j] = activeCommandList[j].begin();
848 done = !movedIterator;
856template<
typename ValueType,
typename StateType>
857void PrismNextStateGenerator<ValueType, StateType>::generateSynchronizedDistribution(
858 storm::storage::BitVector
const& state, ValueType
const& probability, uint64_t position,
859 std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>::const_iterator>
const& iteratorList,
860 storm::generator::Distribution<StateType, ValueType>& distribution,
StateToIdCallback stateToIdCallback) {
865 if (position >= iteratorList.size()) {
866 StateType
id = stateToIdCallback(state);
867 distribution.
add(
id, std::move(probability));
869 storm::prism::Command
const& command = *iteratorList[position];
871 storm::prism::Update
const& update = command.
getUpdate(j);
873 if constexpr (!std::is_same_v<ValueType, storm::RationalFunction>) {
876 "Probability expression in update '" << update <<
" evaluates to negative value " << updateProbability <<
".");
878 storm::exceptions::WrongFormatException,
879 "Probability expression in update '" << update <<
" evaluates to value " << updateProbability <<
" >1.");
882 updateProbability *= probability;
883 generateSynchronizedDistribution(applyUpdate(state, update), updateProbability, position + 1, iteratorList, distribution, stateToIdCallback);
888template<
typename ValueType,
typename StateType>
892 if (this->actionMask !=
nullptr) {
893 if (!this->actionMask->query(*
this, actionIndex)) {
897 boost::optional<std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>>> optionalActiveCommandLists =
898 getActiveCommandsByActionIndex(actionIndex, commandFilter);
901 if (optionalActiveCommandLists) {
902 std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>>
const& activeCommandList = optionalActiveCommandLists.get();
903 std::vector<std::vector<std::reference_wrapper<storm::prism::Command const>>::const_iterator> iteratorList(activeCommandList.size());
906 for (
size_t i = 0;
i < activeCommandList.size(); ++
i) {
907 iteratorList[
i] = activeCommandList[
i].cbegin();
910 storm::generator::Distribution<StateType, ValueType> distribution;
915 distribution.
clear();
931 <<
" is not owned by any player but has at least one enabled, unlabeled (synchronized) command.");
932 choice.setPlayerIndex(playerOfAction);
940 CommandSet commandIndices;
941 for (uint_fast64_t i = 0;
i < iteratorList.size(); ++
i) {
942 commandIndices.insert(iteratorList[i]->get().getGlobalIndex());
944 choice.addOriginData(boost::any(std::move(commandIndices)));
949 choice.reserve(std::distance(distribution.
begin(), distribution.
end()));
950 for (
auto const& stateProbability : distribution) {
951 choice.addProbability(stateProbability.getState(), stateProbability.getValue());
953 probabilitySum += stateProbability.getValue();
960 storm::exceptions::WrongFormatException,
961 "Sum of update probabilities do not some to one for some command (actually sum to " << probabilitySum <<
").");
965 for (
auto const& rewardModel : rewardModels) {
967 if (rewardModel.get().hasStateActionRewards()) {
968 for (
auto const& stateActionReward : rewardModel.get().getStateActionRewards()) {
969 if (stateActionReward.getActionIndex() == choice.getActionIndex() &&
970 this->evaluator->asBool(stateActionReward.getStatePredicateExpression())) {
971 stateActionRewardValue +=
ValueType(this->evaluator->asRational(stateActionReward.getRewardValueExpression()));
975 choice.addReward(stateActionRewardValue);
979 bool movedIterator =
false;
980 for (int_fast64_t j = iteratorList.size() - 1; !movedIterator && j >= 0; --j) {
982 if (iteratorList[j] != activeCommandList[j].end()) {
983 movedIterator =
true;
986 iteratorList[j] = activeCommandList[j].begin();
990 done = !movedIterator;
996template<
typename ValueType,
typename StateType>
998 return program.getPlayerNameToIndexMapping();
1001template<
typename ValueType,
typename StateType>
1003 std::vector<StateType>
const& initialStateIndices,
1004 std::vector<StateType>
const& deadlockStateIndices,
1005 std::vector<StateType>
const& unexploredStateIndices) {
1007 std::vector<std::pair<std::string, storm::expressions::Expression>> labels;
1009 for (
auto const&
label : program.getLabels()) {
1010 labels.push_back(std::make_pair(
label.getName(),
label.getStatePredicateExpression()));
1013 for (
auto const& labelName : this->options.
getLabelNames()) {
1014 if (program.hasLabel(labelName)) {
1015 labels.push_back(std::make_pair(labelName, program.getLabelExpression(labelName)));
1018 "Cannot build labeling for unknown label '" << labelName <<
"'.");
1026template<
typename ValueType,
typename StateType>
1036 result.setFromInt(64 * i, 64, this->evaluator->asInt(program.
getObservationLabels()[i].getStatePredicateExpression()));
1041template<
typename ValueType,
typename StateType>
1048template<
typename ValueType,
typename StateType>
1050 return rewardModels.size();
1053template<
typename ValueType,
typename StateType>
1060template<
typename ValueType,
typename StateType>
1062 std::vector<boost::any>& dataForChoiceOrigins)
const {
1063 if (!this->
getOptions().isBuildChoiceOriginsSet()) {
1067 std::vector<uint_fast64_t> identifiers;
1068 identifiers.reserve(dataForChoiceOrigins.size());
1070 std::map<CommandSet, uint_fast64_t> commandSetToIdentifierMap;
1073 commandSetToIdentifierMap.insert(std::make_pair(
CommandSet(), 0));
1074 uint_fast64_t currentIdentifier = 1;
1075 for (boost::any& originData : dataForChoiceOrigins) {
1076 STORM_LOG_ASSERT(originData.empty() || boost::any_cast<CommandSet>(&originData) !=
nullptr,
1077 "Origin data has unexpected type: " << originData.type().name() <<
".");
1079 CommandSet currentCommandSet = originData.empty() ?
CommandSet() : boost::any_cast<CommandSet>(std::move(originData));
1080 auto insertionRes = commandSetToIdentifierMap.insert(std::make_pair(std::move(currentCommandSet), currentIdentifier));
1081 identifiers.push_back(insertionRes.first->second);
1082 if (insertionRes.second) {
1083 ++currentIdentifier;
1087 std::vector<CommandSet> identifierToCommandSetMapping(currentIdentifier);
1088 for (
auto const& setIdPair : commandSetToIdentifierMap) {
1089 identifierToCommandSetMapping[setIdPair.second] = setIdPair.first;
1092 return std::make_shared<storm::storage::sparse::PrismChoiceOrigins>(std::make_shared<storm::prism::Program>(program), std::move(identifiers),
1093 std::move(identifierToCommandSetMapping));