1#include "storm-config.h"
11std::shared_ptr<storm::models::sparse::Mdp<double>> buildTinyMdp() {
14 uint64_t numStates = 3;
16 builder.newRowGroup(0);
17 builder.addNextValue(0, 1, 1.0);
18 builder.newRowGroup(1);
19 builder.addNextValue(1, 2, 1.0);
20 builder.newRowGroup(2);
21 builder.addNextValue(2, 2, 1.0);
22 auto matrix = builder.build();
25 labeling.addLabel(
"init");
26 labeling.addLabel(
"goal");
27 labeling.addLabelToState(
"init", 0);
28 labeling.addLabelToState(
"goal", 2);
30 return std::make_shared<storm::models::sparse::Mdp<double>>(std::move(matrix), std::move(labeling));
36 goalStates.set(2,
true);
38 builder.setTransition(0, 0, ~goalStates);
39 builder.setTransition(0, 1, goalStates);
40 builder.setTransition(1, 1, allStates);
41 return builder.build();
45TEST(MemoryStructure, OnlyInitialStatesRelevantDefault) {
46 auto mdp = buildTinyMdp();
50 auto mem = builder.
build();
52 EXPECT_TRUE(mem.isOnlyInitialStatesRelevantSet());
53 EXPECT_EQ(1u, mem.getInitialMemoryStates().size());
56TEST(MemoryStructure, OnlyInitialStatesRelevantFalse) {
57 auto mdp = buildTinyMdp();
62 auto mem = builder.
build();
64 EXPECT_FALSE(mem.isOnlyInitialStatesRelevantSet());
65 EXPECT_EQ(3u, mem.getInitialMemoryStates().size());
68TEST(MemoryStructure, ProductPropagatesOnlyInitialStatesRelevant) {
69 auto mdp = buildTinyMdp();
70 auto mem1 = buildGoalMemoryStructure(*mdp);
71 auto mem2 = buildGoalMemoryStructure(*mdp);
73 EXPECT_FALSE(mem1.isOnlyInitialStatesRelevantSet());
74 EXPECT_FALSE(mem2.isOnlyInitialStatesRelevantSet());
76 auto prod = mem1.product(mem2);
77 EXPECT_FALSE(prod.isOnlyInitialStatesRelevantSet()) <<
"product of two non-initial-only structures should remain non-initial-only";
78 EXPECT_EQ(3u, prod.getInitialMemoryStates().size());
81TEST(MemoryStructure, ProductOfTrivialMemoryStructuresIsTrivial) {
82 auto mdp = buildTinyMdp();
86 EXPECT_TRUE(mem1.isOnlyInitialStatesRelevantSet());
87 EXPECT_TRUE(mem2.isOnlyInitialStatesRelevantSet());
89 auto prod = mem1.product(mem2);
90 EXPECT_TRUE(prod.isOnlyInitialStatesRelevantSet()) <<
"product of two initial-only structures should remain initial-only";
91 EXPECT_EQ(1u, prod.getInitialMemoryStates().size());
94TEST(MemoryStructure, ProductModelWithOnlyInitialStatesRelevantFalse) {
95 auto mdp = buildTinyMdp();
96 auto mem1 = buildGoalMemoryStructure(*mdp);
97 auto mem2 = buildGoalMemoryStructure(*mdp);
98 auto prodMem = mem1.product(mem2);
100 ASSERT_FALSE(prodMem.isOnlyInitialStatesRelevantSet());
103 auto productType = prodMem.product(*mdp);
104 auto productModel = productType.build();
106 EXPECT_EQ(4u, productModel->getNumberOfStates());
107 EXPECT_EQ(3u, productModel->getInitialStates().getNumberOfSetBits());
110TEST(MemoryStructure, ProductModelWithOnlyInitialStatesRelevantTrue) {
111 auto mdp = buildTinyMdp();
114 goalStates.
set(2,
true);
120 auto mem = builder.
build();
122 ASSERT_TRUE(mem.isOnlyInitialStatesRelevantSet());
123 EXPECT_EQ(1u, mem.getInitialMemoryStates().size());
125 auto productType = mem.product(*mdp);
126 auto productModel = productType.build();
129 EXPECT_EQ(1u, productModel->getInitialStates().getNumberOfSetBits());
132TEST(MemoryStructure, StateLabelingRespectsOnlyInitialStatesRelevantFalse) {
133 auto mdp = buildTinyMdp();
134 auto mem = buildGoalMemoryStructure(*mdp);
135 ASSERT_FALSE(mem.isOnlyInitialStatesRelevantSet());
137 auto productType = mem.product(*mdp);
138 auto productModel = productType.build();
141 auto const& initLabeling = productModel->getStateLabeling();
142 std::set<std::string> labels = initLabeling.getLabels();
143 ASSERT_NE(labels.end(), labels.find(
"init"));
TEST(MemoryStructure, OnlyInitialStatesRelevantDefault)
This class represents a (discrete-time) Markov decision process.
virtual uint_fast64_t getNumberOfStates() const override
Returns the number of states of the model.
This class manages the labeling of the state space with a number of (atomic) labels.
A bit vector that is internally represented as a vector of 64-bit values.
uint64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
void set(uint64_t index, bool value=true)
Sets the given truth value at the given index.
void setInitialMemoryState(uint_fast64_t initialModelState, uint_fast64_t initialMemoryState)
Specifies for the given state of the model the corresponding initial memory state.
MemoryStructure build()
Builds the memory structure.
static MemoryStructure buildTrivialMemoryStructure(storm::models::sparse::Model< ValueType, RewardModelType > const &model)
Builds a trivial memory structure for the given model (consisting of a single memory state).
void setTransition(uint_fast64_t const &startState, uint_fast64_t const &goalState, storm::storage::BitVector const &modelStates, boost::optional< storm::storage::BitVector > const &modelChoices=boost::none)
Specifies a transition of the memory structure.
This class represents a (deterministic) memory structure that can be used to encode certain events (s...
A class that can be used to build a sparse matrix by adding value by value.