24 std::vector<uint32_t> modifiedObservations = observations;
27 modifiedObservations[0] = model.getNrObservations();
31 for (uint64_t state : initialStates) {
32 if (model.getObservation(state) != observations[0]) {
33 actualInitialStates.
set(state,
false);
37 "Must have unique initial state matching the observation");
39 statesPerObservation[model.getNrObservations()] = actualInitialStates;
41#ifdef _VERBOSE_OBSERVATION_UNFOLDING
42 std::cout <<
"build valution builder..\n";
47 std::map<uint64_t, uint64_t> unfoldedToOld;
48 std::map<uint64_t, uint64_t> unfoldedToOldNextStep;
49 std::map<uint64_t, uint64_t> oldToUnfolded;
51#ifdef _VERBOSE_OBSERVATION_UNFOLDING
52 std::cout <<
"start buildiing matrix...\n";
59 uint64_t newStateIndex = 1;
60 uint64_t newRowGroupStart = 0;
61 uint64_t newRowCount = 0;
64 for (uint64_t step = 0; step < observations.size() - 1; ++step) {
65 oldToUnfolded.clear();
66 unfoldedToOld = unfoldedToOldNextStep;
67 unfoldedToOldNextStep.clear();
69 for (
auto const& unfoldedToOldEntry : unfoldedToOld) {
70 transitionMatrixBuilder.
newRowGroup(newRowGroupStart);
71#ifdef _VERBOSE_OBSERVATION_UNFOLDING
72 std::cout <<
"\tconsider new state " << unfoldedToOldEntry.first <<
'\n';
74 assert(step == 0 || newRowCount == transitionMatrixBuilder.
getLastRow() + 1);
75 svbuilder.
addState(unfoldedToOldEntry.first, {}, {static_cast<int64_t>(unfoldedToOldEntry.second)});
76 uint64_t oldRowIndexStart = model.getNondeterministicChoiceIndices()[unfoldedToOldEntry.second];
77 uint64_t oldRowIndexEnd = model.getNondeterministicChoiceIndices()[unfoldedToOldEntry.second + 1];
79 for (uint64_t oldRowIndex = oldRowIndexStart; oldRowIndex != oldRowIndexEnd; oldRowIndex++) {
80#ifdef _VERBOSE_OBSERVATION_UNFOLDING
81 std::cout <<
"\t\tconsider old action " << oldRowIndex <<
'\n';
82 std::cout <<
"\t\tconsider new row nr " << newRowCount <<
'\n';
85 ValueType resetProb = storm::utility::zero<ValueType>();
87 for (
auto const& oldRowEntry : model.getTransitionMatrix().getRow(oldRowIndex)) {
88 if (model.getObservation(oldRowEntry.getColumn()) != observations[step + 1]) {
89 resetProb += oldRowEntry.getValue();
92#ifdef _VERBOSE_OBSERVATION_UNFOLDING
93 std::cout <<
"\t\t\t add reset with probability " << resetProb <<
'\n';
97 if (resetProb != storm::utility::zero<ValueType>()) {
98 transitionMatrixBuilder.
addNextValue(newRowCount, 0, resetProb);
100#ifdef _VERBOSE_OBSERVATION_UNFOLDING
101 std::cout <<
"\t\t\t add other transitions...\n";
105 for (
auto const& oldRowEntry : model.getTransitionMatrix().getRow(oldRowIndex)) {
106 if (model.getObservation(oldRowEntry.getColumn()) != observations[step + 1]) {
111 auto entryIt = oldToUnfolded.find(oldRowEntry.getColumn());
112 if (entryIt == oldToUnfolded.end()) {
113 column = newStateIndex;
114 oldToUnfolded[oldRowEntry.getColumn()] = column;
115 unfoldedToOldNextStep[column] = oldRowEntry.getColumn();
118 column = entryIt->second;
120#ifdef _VERBOSE_OBSERVATION_UNFOLDING
121 std::cout <<
"\t\t\t\t transition to " << column <<
"with probability " << oldRowEntry.getValue() <<
'\n';
123 transitionMatrixBuilder.
addNextValue(newRowCount, column, oldRowEntry.getValue());
128 newRowGroupStart = transitionMatrixBuilder.
getLastRow() + 1;
132 uint64_t sinkState = newStateIndex;
133 uint64_t targetState = newStateIndex + 1;
134 for (
auto const& unfoldedToOldEntry : unfoldedToOldNextStep) {
135 svbuilder.
addState(unfoldedToOldEntry.first, {}, {
static_cast<int64_t
>(unfoldedToOldEntry.second)});
137 transitionMatrixBuilder.
newRowGroup(newRowGroupStart);
138 STORM_LOG_ASSERT(risk.size() > unfoldedToOldEntry.second,
"Must be a state");
140 "Risk must be a probability");
143 transitionMatrixBuilder.
addNextValue(newRowGroupStart, sinkState, storm::utility::one<ValueType>() - risk[unfoldedToOldEntry.second]);
146 transitionMatrixBuilder.
addNextValue(newRowGroupStart, targetState, risk[unfoldedToOldEntry.second]);
151 transitionMatrixBuilder.newRowGroup(newRowGroupStart);
152 transitionMatrixBuilder.addNextValue(newRowGroupStart, sinkState, storm::utility::one<ValueType>());
153 svbuilder.addState(sinkState, {}, {-1});
156 transitionMatrixBuilder.newRowGroup(newRowGroupStart);
158 transitionMatrixBuilder.addNextValue(newRowGroupStart, targetState, storm::utility::one<ValueType>());
159 svbuilder.addState(targetState, {}, {-1});
160#ifdef _VERBOSE_OBSERVATION_UNFOLDING
161 std::cout <<
"build matrix...\n";
166#ifdef _VERBOSE_OBSERVATION_UNFOLDING
170 "Expect row group count (" << components.
transitionMatrix.getRowGroupCount() <<
") one more as target state index " << targetState <<
")");
173 labeling.addLabel(
"_goal");
174 labeling.addLabelToState(
"_goal", targetState);
175 labeling.addLabel(
"init");
176 labeling.addLabelToState(
"init", 0);
179 return std::make_shared<storm::models::sparse::Mdp<ValueType>>(std::move(components));