1#include "storm-config.h"
13std::shared_ptr<storm::models::sparse::Pomdp<double>> buildMaze(std::string
const& constants =
"sl=0.0") {
19 return makeCanonic.transform();
22TEST(BeliefStateManager, BasicProperties) {
24 GTEST_SKIP() <<
"Z3 not available.";
26 auto pomdp = buildMaze();
29 EXPECT_EQ(pomdp->getNumberOfStates(),
manager.getNumberOfStates());
31 for (uint64_t state = 0; state < pomdp->getNumberOfStates(); ++state) {
32 EXPECT_EQ(pomdp->getObservation(state),
manager.getObservation(state));
35 for (uint32_t obs = 0; obs < pomdp->getNrObservations(); ++obs) {
36 EXPECT_GT(
manager.getActionsForObservation(obs), 0ul);
40TEST(BeliefStateManager, ObservationOffsets) {
42 GTEST_SKIP() <<
"Z3 not available.";
44 auto pomdp = buildMaze();
48 for (uint64_t state = 0; state < pomdp->getNumberOfStates(); ++state) {
49 uint32_t obs =
manager.getObservation(state);
50 uint64_t offset =
manager.getObservationOffset(state);
51 EXPECT_LT(offset,
manager.numberOfStatesPerObservation(obs));
52 EXPECT_EQ(obs,
manager.getObservation(
manager.getState(obs, offset)));
56TEST(SparseBeliefTracker, ResetToInitial) {
58 GTEST_SKIP() <<
"Z3 not available.";
60 auto pomdp = buildMaze();
62 tracker.setRisk(std::vector<double>(pomdp->getNumberOfStates(), 0.0));
64 uint32_t initObs = pomdp->getObservation(*pomdp->getInitialStates().begin());
65 bool hit = tracker.reset(initObs);
67 EXPECT_EQ(1ul, tracker.getNumberOfBeliefs());
68 EXPECT_EQ(initObs, tracker.getCurrentObservation());
69 EXPECT_EQ(1ul, tracker.getCurrentDimension());
72TEST(SparseBeliefTracker, TrackValidObservation) {
74 GTEST_SKIP() <<
"Z3 not available.";
76 auto pomdp = buildMaze();
78 tracker.setRisk(std::vector<double>(pomdp->getNumberOfStates(), 0.0));
80 uint32_t initObs = pomdp->getObservation(*pomdp->getInitialStates().begin());
81 tracker.reset(initObs);
84 std::set<uint32_t> reachableObs;
85 uint64_t initState = *pomdp->getInitialStates().begin();
86 for (uint64_t row = pomdp->getNondeterministicChoiceIndices()[initState]; row < pomdp->getNondeterministicChoiceIndices()[initState + 1]; ++row) {
87 for (
auto const& entry : pomdp->getTransitionMatrix().getRow(row)) {
88 reachableObs.insert(pomdp->getObservation(entry.getColumn()));
91 ASSERT_FALSE(reachableObs.empty());
94 uint32_t nextObs = *reachableObs.begin();
95 bool result = tracker.track(nextObs);
97 EXPECT_GT(tracker.getNumberOfBeliefs(), 0ul);
98 EXPECT_EQ(nextObs, tracker.getCurrentObservation());
101TEST(SparseBeliefTracker, TrackImpossibleObservation) {
103 GTEST_SKIP() <<
"Z3 not available.";
105 auto pomdp = buildMaze();
107 tracker.setRisk(std::vector<double>(pomdp->getNumberOfStates(), 0.0));
109 uint32_t initObs = pomdp->getObservation(*pomdp->getInitialStates().begin());
110 tracker.reset(initObs);
113 uint64_t impossibleObs = pomdp->getNrObservations() + 100;
114 bool result = tracker.track(impossibleObs);
115 EXPECT_FALSE(result);
116 EXPECT_EQ(0ul, tracker.getNumberOfBeliefs());
119TEST(SparseBeliefTracker, UniformRisk) {
121 GTEST_SKIP() <<
"Z3 not available.";
123 auto pomdp = buildMaze();
126 uint32_t initObs = pomdp->getObservation(*pomdp->getInitialStates().begin());
129 std::vector<double> zeroRisk(pomdp->getNumberOfStates(), 0.0);
130 tracker.setRisk(zeroRisk);
131 tracker.reset(initObs);
132 EXPECT_NEAR(0.0, tracker.getCurrentRisk(
true), 1e-9);
133 EXPECT_NEAR(0.0, tracker.getCurrentRisk(
false), 1e-9);
136 std::vector<double> oneRisk(pomdp->getNumberOfStates(), 1.0);
137 tracker.setRisk(oneRisk);
138 tracker.reset(initObs);
139 EXPECT_NEAR(1.0, tracker.getCurrentRisk(
true), 1e-9);
140 EXPECT_NEAR(1.0, tracker.getCurrentRisk(
false), 1e-9);
143TEST(SparseBeliefTracker, MixedRiskMaxMin) {
145 GTEST_SKIP() <<
"Z3 not available.";
150 auto pomdp = buildMaze(
"sl=0.4");
154 uint64_t initState = *pomdp->getInitialStates().begin();
155 std::vector<double> mixedRisk(pomdp->getNumberOfStates(), 1.0);
156 mixedRisk[initState] = 0.0;
157 tracker.setRisk(mixedRisk);
159 uint32_t initObs = pomdp->getObservation(initState);
160 tracker.reset(initObs);
163 EXPECT_NEAR(0.0, tracker.getCurrentRisk(
true), 1e-9);
164 EXPECT_NEAR(0.0, tracker.getCurrentRisk(
false), 1e-9);
168 bool movedToHighRisk =
false;
169 for (uint32_t obs = 0; obs < static_cast<uint32_t>(pomdp->getNrObservations()); ++obs) {
173 t2.setRisk(mixedRisk);
176 EXPECT_NEAR(1.0, t2.getCurrentRisk(
true), 1e-9);
177 movedToHighRisk =
true;
181 EXPECT_TRUE(movedToHighRisk) <<
"Could not find a non-initial reachable observation";
This class keeps track of common information of a set of beliefs.
This tracker implements state estimation for POMDPs.
This class represents a partially observable Markov decision process.
static storm::prism::Program parse(std::string const &filename, bool prismCompatability=false)
Parses the given file into the PRISM storage classes assuming it complies with the PRISM syntax.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options)
SettingsManager const & manager()
Retrieves the settings manager.
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)