25 std::vector<uint32_t> modifiedObservations = observations;
28 modifiedObservations[0] = model.getNrObservations();
32 for (uint64_t state : initialStates) {
33 if (model.getObservation(state) != observations[0]) {
34 actualInitialStates.
set(state,
false);
38 "Must have unique initial state matching the observation");
40 statesPerObservation[model.getNrObservations()] = actualInitialStates;
42#ifdef _VERBOSE_OBSERVATION_UNFOLDING
43 std::cout <<
"build valution builder..\n";
48 std::map<uint64_t, uint64_t> unfoldedToOld;
49 std::map<uint64_t, uint64_t> unfoldedToOldNextStep;
50 std::map<uint64_t, uint64_t> oldToUnfolded;
52#ifdef _VERBOSE_OBSERVATION_UNFOLDING
53 std::cout <<
"start buildiing matrix...\n";
60 uint64_t newStateIndex = 1;
61 uint64_t newRowGroupStart = 0;
62 uint64_t newRowCount = 0;
65 for (uint64_t step = 0; step < observations.size() - 1; ++step) {
66 oldToUnfolded.clear();
67 unfoldedToOld = unfoldedToOldNextStep;
68 unfoldedToOldNextStep.clear();
70 for (
auto const& unfoldedToOldEntry : unfoldedToOld) {
71 transitionMatrixBuilder.
newRowGroup(newRowGroupStart);
72#ifdef _VERBOSE_OBSERVATION_UNFOLDING
73 std::cout <<
"\tconsider new state " << unfoldedToOldEntry.first <<
'\n';
75 assert(step == 0 || newRowCount == transitionMatrixBuilder.
getLastRow() + 1);
76 svbuilder.
addState(unfoldedToOldEntry.first, {}, {static_cast<int64_t>(unfoldedToOldEntry.second)});
77 uint64_t oldRowIndexStart = model.getNondeterministicChoiceIndices()[unfoldedToOldEntry.second];
78 uint64_t oldRowIndexEnd = model.getNondeterministicChoiceIndices()[unfoldedToOldEntry.second + 1];
80 for (uint64_t oldRowIndex = oldRowIndexStart; oldRowIndex != oldRowIndexEnd; oldRowIndex++) {
81#ifdef _VERBOSE_OBSERVATION_UNFOLDING
82 std::cout <<
"\t\tconsider old action " << oldRowIndex <<
'\n';
83 std::cout <<
"\t\tconsider new row nr " << newRowCount <<
'\n';
86 ValueType resetProb = storm::utility::zero<ValueType>();
88 for (
auto const& oldRowEntry : model.getTransitionMatrix().getRow(oldRowIndex)) {
89 if (model.getObservation(oldRowEntry.getColumn()) != observations[step + 1]) {
90 resetProb += oldRowEntry.getValue();
93#ifdef _VERBOSE_OBSERVATION_UNFOLDING
94 std::cout <<
"\t\t\t add reset with probability " << resetProb <<
'\n';
98 if (resetProb != storm::utility::zero<ValueType>()) {
99 transitionMatrixBuilder.
addNextValue(newRowCount, 0, resetProb);
101#ifdef _VERBOSE_OBSERVATION_UNFOLDING
102 std::cout <<
"\t\t\t add other transitions...\n";
106 for (
auto const& oldRowEntry : model.getTransitionMatrix().getRow(oldRowIndex)) {
107 if (model.getObservation(oldRowEntry.getColumn()) != observations[step + 1]) {
112 auto entryIt = oldToUnfolded.find(oldRowEntry.getColumn());
113 if (entryIt == oldToUnfolded.end()) {
114 column = newStateIndex;
115 oldToUnfolded[oldRowEntry.getColumn()] = column;
116 unfoldedToOldNextStep[column] = oldRowEntry.getColumn();
119 column = entryIt->second;
121#ifdef _VERBOSE_OBSERVATION_UNFOLDING
122 std::cout <<
"\t\t\t\t transition to " << column <<
"with probability " << oldRowEntry.getValue() <<
'\n';
124 transitionMatrixBuilder.
addNextValue(newRowCount, column, oldRowEntry.getValue());
129 newRowGroupStart = transitionMatrixBuilder.
getLastRow() + 1;
133 uint64_t sinkState = newStateIndex;
134 uint64_t targetState = newStateIndex + 1;
136 for (
auto const& unfoldedToOldEntry : unfoldedToOldNextStep) {
137 svbuilder.
addState(unfoldedToOldEntry.first, {}, {
static_cast<int64_t
>(unfoldedToOldEntry.second)});
139 transitionMatrixBuilder.
newRowGroup(newRowGroupStart);
140 STORM_LOG_ASSERT(risk.size() > unfoldedToOldEntry.second,
"Must be a state");
141 STORM_LOG_ASSERT(!cc.isLess(storm::utility::one<ValueType>(), risk[unfoldedToOldEntry.second]),
"Risk must be a probability");
142 STORM_LOG_ASSERT(!cc.isLess(risk[unfoldedToOldEntry.second], storm::utility::zero<ValueType>()),
"Risk must be a probability");
145 transitionMatrixBuilder.
addNextValue(newRowGroupStart, sinkState, storm::utility::one<ValueType>() - risk[unfoldedToOldEntry.second]);
148 transitionMatrixBuilder.
addNextValue(newRowGroupStart, targetState, risk[unfoldedToOldEntry.second]);
153 transitionMatrixBuilder.newRowGroup(newRowGroupStart);
154 transitionMatrixBuilder.addNextValue(newRowGroupStart, sinkState, storm::utility::one<ValueType>());
155 svbuilder.addState(sinkState, {}, {-1});
158 transitionMatrixBuilder.newRowGroup(newRowGroupStart);
160 transitionMatrixBuilder.addNextValue(newRowGroupStart, targetState, storm::utility::one<ValueType>());
161 svbuilder.addState(targetState, {}, {-1});
162#ifdef _VERBOSE_OBSERVATION_UNFOLDING
163 std::cout <<
"build matrix...\n";
168#ifdef _VERBOSE_OBSERVATION_UNFOLDING
172 "Expect row group count (" << components.
transitionMatrix.getRowGroupCount() <<
") one more as target state index " << targetState <<
")");
175 labeling.addLabel(
"_goal");
176 labeling.addLabelToState(
"_goal", targetState);
177 labeling.addLabel(
"init");
178 labeling.addLabelToState(
"init", 0);
181 return std::make_shared<storm::models::sparse::Mdp<ValueType>>(std::move(components));