24 uint64_t observation = pomdp.getObservation(beliefSupport.
getNextSetIndex(0));
27 auto stateWithObsIt = statesPerObservation[observation].begin();
29 for (uint64_t possibleState : beliefSupport) {
30 STORM_LOG_ASSERT(pomdp.getObservation(possibleState) == observation,
"Support must be observation-consistent");
31 while (possibleState > *stateWithObsIt) {
35 if (possibleState == *stateWithObsIt) {
36 queryVector.
set(offset);
39 return winningRegion.query(observation, queryVector);
45 std::map<uint32_t, storm::storage::BitVector> successors;
46 STORM_LOG_DEBUG(
"Stays in winning region? (" << currentBeliefSupport <<
", " << actionIndex <<
")");
47 for (uint64_t oldState : currentBeliefSupport) {
48 uint64_t row = pomdp.getTransitionMatrix().getRowGroupIndices()[oldState] + actionIndex;
49 for (
auto const& successor : pomdp.getTransitionMatrix().getRow(row)) {
51 uint32_t obs = pomdp.getObservation(successor.getColumn());
52 if (successors.count(obs) == 0) {
55 successors[obs].set(successor.getColumn(),
true);
59 for (
auto const& entry : successors) {
60 if (!isInWinningRegion(entry.second)) {
61 STORM_LOG_DEBUG(
"Belief support " << entry.second <<
" (obs " << entry.first <<
") is not winning");
64 STORM_LOG_DEBUG(
"Belief support " << entry.second <<
" (obs " << entry.first <<
") is winning");
72 for (uint64_t obs = 0; obs < pomdp.getNrObservations(); ++obs) {
73 for (
auto const& winningBelief : winningRegion.getWinningSetsPerObservation(obs)) {
75 for (uint64_t offset : winningBelief) {
76 states.
set(statesPerObservation[obs][offset]);
78 bool safeActionExists =
false;
79 for (uint64_t actionIndex = 0; actionIndex < pomdp.getTransitionMatrix().getRowGroupSize(statesPerObservation[obs][0]); ++actionIndex) {
80 if (staysInWinningRegion(states, actionIndex)) {
81 safeActionExists =
true;
85 STORM_LOG_THROW(safeActionExists, storm::exceptions::UnexpectedException,
"Observation " << obs <<
" , support " << states);
92 for (uint64_t obs = 0; obs < pomdp.getNrObservations(); ++obs) {
93 STORM_LOG_DEBUG(
"Check listed belief supports for observation " << obs <<
" are maximal");
94 for (
auto const& winningBelief : winningRegion.getWinningSetsPerObservation(obs)) {
96 for (
auto const additional : remainders) {
97 uint64_t addState = statesPerObservation[obs][additional];
98 if (badStates.
get(addState)) {
103 for (uint64_t offset : winningBelief) {
104 states.
set(statesPerObservation[obs][offset]);
106 states.
set(statesPerObservation[obs][additional]);
109 bool safeActionExists =
false;
110 for (uint64_t actionIndex = 0; actionIndex < pomdp.getTransitionMatrix().getRowGroupSize(statesPerObservation[obs][0]); ++actionIndex) {
111 if (staysInWinningRegion(states, actionIndex)) {
112 STORM_LOG_DEBUG(
"Action " << actionIndex <<
" from " << states <<
" is safe. ");
113 safeActionExists =
true;
118 STORM_LOG_THROW(!safeActionExists, storm::exceptions::UnexpectedException,
"Observation " << obs <<
", support " << states);
121 STORM_LOG_DEBUG(
"All listed belief supports for observation " << obs <<
" are maximal. Continue with single states.");
123 for (uint64_t offset = 0; offset < statesPerObservation[obs].size(); ++offset) {
124 if (winningRegion.isWinning(obs, offset)) {
127 uint64_t addState = statesPerObservation[obs][offset];
128 if (badStates.
get(addState)) {
132 states.
set(addState);
133 bool safeActionExists =
false;
134 for (uint64_t actionIndex = 0; actionIndex < pomdp.getTransitionMatrix().getRowGroupSize(statesPerObservation[obs][0]); ++actionIndex) {
135 if (staysInWinningRegion(states, actionIndex)) {
136 safeActionExists =
true;
141 STORM_LOG_THROW(!safeActionExists, storm::exceptions::UnexpectedException,
"Observation " << obs <<
" , support " << states);