Sebastian Junges
5 years ago
4 changed files with 159 additions and 37 deletions
-
65src/storm-pomdp/analysis/MemlessStrategySearchQualitative.cpp
-
20src/storm-pomdp/analysis/MemlessStrategySearchQualitative.h
-
86src/storm-pomdp/analysis/WinningRegion.cpp
-
25src/storm-pomdp/analysis/WinningRegion.h
@ -0,0 +1,86 @@ |
|||
#include <iostream>
|
|||
#include "storm-pomdp/analysis/WinningRegion.h"
|
|||
|
|||
namespace storm { |
|||
namespace pomdp { |
|||
WinningRegion::WinningRegion(std::vector<uint64_t> const& observationSizes) : observationSizes(observationSizes) |
|||
{ |
|||
for (uint64_t i = 0; i < observationSizes.size(); ++i) { |
|||
winningRegion.push_back(std::vector<storm::storage::BitVector>()); |
|||
} |
|||
} |
|||
|
|||
void WinningRegion::update(uint64_t observation, storm::storage::BitVector const& winning) { |
|||
std::vector<storm::storage::BitVector> newWinningSupport = std::vector<storm::storage::BitVector>(); |
|||
bool changed = false; |
|||
for (auto const& support : winningRegion[observation]) { |
|||
if (winning.isSubsetOf(support)) { |
|||
// This new winning support is already covered.
|
|||
return; |
|||
} |
|||
if(support.isSubsetOf(winning)) { |
|||
// This new winning support extends the previous support, thus the previous support is now spurious
|
|||
changed = true; |
|||
} else { |
|||
newWinningSupport.push_back(support); |
|||
} |
|||
} |
|||
|
|||
// only if changed.
|
|||
if (changed) { |
|||
newWinningSupport.push_back(winning); |
|||
winningRegion[observation] = newWinningSupport; |
|||
} else { |
|||
winningRegion[observation].push_back(winning); |
|||
} |
|||
|
|||
} |
|||
|
|||
bool WinningRegion::query(uint64_t observation, storm::storage::BitVector const& currently) const { |
|||
for(storm::storage::BitVector winning : winningRegion[observation]) { |
|||
if(currently.isSubsetOf(winning)) { |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
/**
|
|||
* If we observe this observation, do we surely win? |
|||
* @param observation |
|||
* @return yes, if all supports for this observation are winning. |
|||
*/ |
|||
bool WinningRegion::observationIsWinning(uint64_t observation) const { |
|||
return winningRegion[observation].size() == 1 && winningRegion[observation].front().full(); |
|||
} |
|||
|
|||
void WinningRegion::print() const { |
|||
uint64_t observation = 0; |
|||
for (auto const& winningSupport : winningRegion) { |
|||
std::cout << "***** observation" << observation << std::endl; |
|||
for (auto const& support : winningSupport) { |
|||
std::cout << " " << support; |
|||
} |
|||
std::cout << std::endl; |
|||
} |
|||
} |
|||
|
|||
/**
|
|||
* How many different observations are there? |
|||
* @return |
|||
*/ |
|||
uint64_t WinningRegion::getNumberOfObservations() const { |
|||
return observationSizes.size(); |
|||
} |
|||
|
|||
uint64_t WinningRegion::getStorageSize() const { |
|||
uint64_t result = 0; |
|||
for (uint64_t i = 0; i < getNumberOfObservations(); ++i) { |
|||
result += winningRegion[i].size() * observationSizes[i]; |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
#pragma once |
|||
|
|||
#include <vector> |
|||
#include "storm/storage/BitVector.h" |
|||
|
|||
namespace storm { |
|||
namespace pomdp { |
|||
class WinningRegion { |
|||
public: |
|||
WinningRegion(std::vector<uint64_t> const& observationSizes = {}); |
|||
|
|||
void update(uint64_t observation, storm::storage::BitVector const& winning); |
|||
bool query(uint64_t observation, storm::storage::BitVector const& currently) const; |
|||
|
|||
bool observationIsWinning(uint64_t observation) const; |
|||
|
|||
uint64_t getStorageSize() const; |
|||
uint64_t getNumberOfObservations() const; |
|||
void print() const; |
|||
private: |
|||
std::vector<std::vector<storm::storage::BitVector>> winningRegion; |
|||
std::vector<uint64_t> observationSizes; |
|||
}; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue