23 uint64_t observation = pomdp.getObservation(beliefSupport.
getNextSetIndex(0));
26 auto stateWithObsIt = statesPerObservation[observation].begin();
28 for (uint64_t possibleState : beliefSupport) {
29 STORM_LOG_ASSERT(pomdp.getObservation(possibleState) == observation,
"Support must be observation-consistent");
30 while (possibleState > *stateWithObsIt) {
34 if (possibleState == *stateWithObsIt) {
35 queryVector.
set(offset);
38 return winningRegion.query(observation, queryVector);
44 std::map<uint32_t, storm::storage::BitVector> successors;
45 STORM_LOG_DEBUG(
"Stays in winning region? (" << currentBeliefSupport <<
", " << actionIndex <<
")");
46 for (uint64_t oldState : currentBeliefSupport) {
47 uint64_t row = pomdp.getTransitionMatrix().getRowGroupIndices()[oldState] + actionIndex;
48 for (
auto const& successor : pomdp.getTransitionMatrix().getRow(row)) {
50 uint32_t obs = pomdp.getObservation(successor.getColumn());
51 if (successors.count(obs) == 0) {
54 successors[obs].set(successor.getColumn(),
true);
58 for (
auto const& entry : successors) {
59 if (!isInWinningRegion(entry.second)) {
60 STORM_LOG_DEBUG(
"Belief support " << entry.second <<
" (obs " << entry.first <<
") is not winning");
63 STORM_LOG_DEBUG(
"Belief support " << entry.second <<
" (obs " << entry.first <<
") is winning");
71 for (uint64_t obs = 0; obs < pomdp.getNrObservations(); ++obs) {
72 for (
auto const& winningBelief : winningRegion.getWinningSetsPerObservation(obs)) {
74 for (uint64_t offset : winningBelief) {
75 states.
set(statesPerObservation[obs][offset]);
77 bool safeActionExists =
false;
78 for (uint64_t actionIndex = 0; actionIndex < pomdp.getTransitionMatrix().getRowGroupSize(statesPerObservation[obs][0]); ++actionIndex) {
79 if (staysInWinningRegion(states, actionIndex)) {
80 safeActionExists =
true;
84 STORM_LOG_THROW(safeActionExists, storm::exceptions::UnexpectedException,
"Observation " << obs <<
" , support " << states);
91 for (uint64_t obs = 0; obs < pomdp.getNrObservations(); ++obs) {
92 STORM_LOG_DEBUG(
"Check listed belief supports for observation " << obs <<
" are maximal");
93 for (
auto const& winningBelief : winningRegion.getWinningSetsPerObservation(obs)) {
95 for (
auto const additional : remainders) {
96 uint64_t addState = statesPerObservation[obs][additional];
97 if (badStates.
get(addState)) {
102 for (uint64_t offset : winningBelief) {
103 states.
set(statesPerObservation[obs][offset]);
105 states.
set(statesPerObservation[obs][additional]);
108 bool safeActionExists =
false;
109 for (uint64_t actionIndex = 0; actionIndex < pomdp.getTransitionMatrix().getRowGroupSize(statesPerObservation[obs][0]); ++actionIndex) {
110 if (staysInWinningRegion(states, actionIndex)) {
111 STORM_LOG_DEBUG(
"Action " << actionIndex <<
" from " << states <<
" is safe. ");
112 safeActionExists =
true;
117 STORM_LOG_THROW(!safeActionExists, storm::exceptions::UnexpectedException,
"Observation " << obs <<
", support " << states);
120 STORM_LOG_DEBUG(
"All listed belief supports for observation " << obs <<
" are maximal. Continue with single states.");
122 for (uint64_t offset = 0; offset < statesPerObservation[obs].size(); ++offset) {
123 if (winningRegion.isWinning(obs, offset)) {
126 uint64_t addState = statesPerObservation[obs][offset];
127 if (badStates.
get(addState)) {
131 states.
set(addState);
132 bool safeActionExists =
false;
133 for (uint64_t actionIndex = 0; actionIndex < pomdp.getTransitionMatrix().getRowGroupSize(statesPerObservation[obs][0]); ++actionIndex) {
134 if (staysInWinningRegion(states, actionIndex)) {
135 safeActionExists =
true;
140 STORM_LOG_THROW(!safeActionExists, storm::exceptions::UnexpectedException,
"Observation " << obs <<
" , support " << states);