Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
PomdpMemory.cpp
Go to the documentation of this file.
2
6
7namespace storm {
8namespace storage {
9
10PomdpMemory::PomdpMemory(std::vector<storm::storage::BitVector> const& transitions, uint64_t initialState)
11 : transitions(transitions), initialState(initialState) {
12 STORM_LOG_THROW(this->initialState < this->transitions.size(), storm::exceptions::InvalidArgumentException,
13 "Initial state " << this->initialState << " of pomdp memory is invalid.");
14 for (auto const& t : this->transitions) {
15 STORM_LOG_THROW(t.size() == this->transitions.size(), storm::exceptions::InvalidArgumentException,
16 "Invalid dimension of transition matrix of pomdp memory.");
17 STORM_LOG_THROW(!t.empty(), storm::exceptions::InvalidArgumentException, "Invalid transition matrix of pomdp memory: No deadlock states allowed.");
18 }
19}
20
22 return transitions.size();
23}
24
26 return initialState;
27}
28
30 return transitions.at(state);
31}
32
33uint64_t PomdpMemory::getNumberOfOutgoingTransitions(uint64_t state) const {
34 return getTransitions(state).getNumberOfSetBits();
35}
36
37std::vector<storm::storage::BitVector> const& PomdpMemory::getTransitions() const {
38 return transitions;
39}
40
41std::string PomdpMemory::toString() const {
42 std::string result = "PomdpMemory with " + std::to_string(getNumberOfStates()) + " states.\n";
43 result += "Initial state is " + std::to_string(getInitialState()) + ". Transitions are \n";
44
45 // header
46 result += " |";
47 for (uint64_t state = 0; state < getNumberOfStates(); ++state) {
48 if (state < 10) {
49 result += " ";
50 }
51 result += std::to_string(state);
52 }
53 result += "\n";
54 result += "--|";
55 for (uint64_t state = 0; state < getNumberOfStates(); ++state) {
56 result += "--";
57 }
58 result += "\n";
59
60 // transition matrix entries
61 for (uint64_t state = 0; state < getNumberOfStates(); ++state) {
62 if (state < 10) {
63 result += " ";
64 }
65 result += std::to_string(state) + "|";
66 for (uint64_t statePrime = 0; statePrime < getNumberOfStates(); ++statePrime) {
67 result += " ";
68 if (getTransitions(state).get(statePrime)) {
69 result += "1";
70 } else {
71 result += "0";
72 }
73 }
74 result += "\n";
75 }
76 return result;
77}
78
79std::string toString(PomdpMemoryPattern const& pattern) {
80 switch (pattern) {
82 return "trivial";
84 return "fixedcounter";
86 return "selectivecounter";
88 return "fixedring";
90 return "ring";
92 return "settablebits";
94 return "full";
95 }
96 return "unknown";
97}
98
99PomdpMemory PomdpMemoryBuilder::build(PomdpMemoryPattern pattern, uint64_t numStates) const {
100 switch (pattern) {
102 STORM_LOG_ERROR_COND(numStates == 1,
103 "Invoked building trivial POMDP memory with " << numStates << " states. However, trivial POMDP memory always has one state.");
104 return buildTrivialMemory();
106 return buildFixedCountingMemory(numStates);
108 return buildSelectiveCountingMemory(numStates);
110 return buildFixedRingMemory(numStates);
112 return buildSelectiveRingMemory(numStates);
114 return buildSettableBitsMemory(numStates);
116 return buildFullyConnectedMemory(numStates);
117 }
118 STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unknown PomdpMemoryPattern");
119}
120
124
126 std::vector<storm::storage::BitVector> transitions(numStates, storm::storage::BitVector(numStates, false));
127 for (uint64_t state = 0; state < numStates; ++state) {
128 transitions[state].set(std::min(state + 1, numStates - 1));
129 }
130 return PomdpMemory(transitions, 0);
131}
132
134 std::vector<storm::storage::BitVector> transitions(numStates, storm::storage::BitVector(numStates, false));
135 for (uint64_t state = 0; state < numStates; ++state) {
136 transitions[state].set(state);
137 transitions[state].set(std::min(state + 1, numStates - 1));
138 }
139 return PomdpMemory(transitions, 0);
140}
141
143 std::vector<storm::storage::BitVector> transitions(numStates, storm::storage::BitVector(numStates, false));
144 for (uint64_t state = 0; state < numStates; ++state) {
145 transitions[state].set((state + 1) % numStates);
146 }
147 return PomdpMemory(transitions, 0);
148}
149
151 std::vector<storm::storage::BitVector> transitions(numStates, storm::storage::BitVector(numStates, false));
152 for (uint64_t state = 0; state < numStates; ++state) {
153 transitions[state].set(state);
154 transitions[state].set((state + 1) % numStates);
155 }
156 return PomdpMemory(transitions, 0);
157}
158
160 // compute the number of bits, i.e., floor(log(numStates))
161 uint64_t numBits = 0;
162 uint64_t actualNumStates = 1;
163 while (actualNumStates * 2 <= numStates) {
164 actualNumStates *= 2;
165 ++numBits;
166 }
167
168 STORM_LOG_WARN_COND(actualNumStates == numStates,
169 "The number of memory states for the settable bits pattern has to be a power of 2. Shrinking the number of memory states to "
170 << actualNumStates << ".");
171
172 std::vector<storm::storage::BitVector> transitions(actualNumStates, storm::storage::BitVector(actualNumStates, false));
173 for (uint64_t state = 0; state < actualNumStates; ++state) {
174 transitions[state].set(state);
175 for (uint64_t bit = 0; bit < numBits; ++bit) {
176 uint64_t bitMask = 1u << bit;
177 transitions[state].set(state | bitMask);
178 }
179 }
180 return PomdpMemory(transitions, 0);
181}
182
184 std::vector<storm::storage::BitVector> transitions(numStates, storm::storage::BitVector(numStates, true));
185 return PomdpMemory(transitions, 0);
186}
187} // namespace storage
188} // namespace storm
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:18
PomdpMemory buildFixedRingMemory(uint64_t numStates) const
PomdpMemory buildSelectiveRingMemory(uint64_t numStates) const
PomdpMemory build(PomdpMemoryPattern pattern, uint64_t numStates) const
PomdpMemory buildTrivialMemory() const
PomdpMemory buildSelectiveCountingMemory(uint64_t numStates) const
PomdpMemory buildFixedCountingMemory(uint64_t numStates) const
PomdpMemory buildSettableBitsMemory(uint64_t numStates) const
PomdpMemory buildFullyConnectedMemory(uint64_t numStates) const
uint64_t getInitialState() const
uint64_t getNumberOfStates() const
PomdpMemory(std::vector< storm::storage::BitVector > const &transitions, uint64_t initialState)
std::string toString() const
std::vector< storm::storage::BitVector > const & getTransitions() const
uint64_t getNumberOfOutgoingTransitions(uint64_t state) const
#define STORM_LOG_WARN_COND(cond, message)
Definition macros.h:38
#define STORM_LOG_ERROR_COND(cond, message)
Definition macros.h:52
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
std::string toString(PomdpMemoryPattern const &pattern)
LabParser.cpp.
Definition cli.cpp:18