Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
Pomdp.cpp
Go to the documentation of this file.
2
4
5namespace storm {
6namespace models {
7namespace sparse {
8
9template<typename ValueType, typename RewardModelType>
11 storm::models::sparse::StateLabeling const &stateLabeling,
12 std::unordered_map<std::string, RewardModelType> const &rewardModels)
13 : Mdp<ValueType, RewardModelType>(transitionMatrix, stateLabeling, rewardModels, storm::models::ModelType::Pomdp) {
15}
16
17template<typename ValueType, typename RewardModelType>
19 std::unordered_map<std::string, RewardModelType> &&rewardModels)
20 : Mdp<ValueType, RewardModelType>(transitionMatrix, stateLabeling, rewardModels, storm::models::ModelType::Pomdp) {
22}
23
24template<typename ValueType, typename RewardModelType>
26 : Mdp<ValueType, RewardModelType>(components, storm::models::ModelType::Pomdp),
27 observations(components.observabilityClasses.value()),
28 canonicFlag(canonicFlag),
29 observationValuations(components.observationValuations) {
31}
32
33template<typename ValueType, typename RewardModelType>
35 : Mdp<ValueType, RewardModelType>(components, storm::models::ModelType::Pomdp),
36 observations(components.observabilityClasses.value()),
37 canonicFlag(canonicFlag),
38 observationValuations(components.observationValuations) {
40}
41
42template<typename ValueType, typename RewardModelType>
44 this->printModelInformationHeaderToStream(out);
45 out << "Choices: \t" << this->getNumberOfChoices() << '\n';
46 out << "Observations: \t" << this->nrObservations << '\n';
47 this->printModelInformationFooterToStream(out);
48}
49
50template<typename ValueType, typename RewardModelType>
52 uint64_t highestEntry = 0;
53 for (uint32_t entry : observations) {
54 if (entry > highestEntry) {
55 highestEntry = entry;
56 }
57 }
58 nrObservations = highestEntry + 1; // Smallest entry should be zero.
59 // In debug mode, ensure that every observability is used.
60}
61
62template<typename ValueType, typename RewardModelType>
64 return observations.at(state);
65}
66
67template<typename ValueType, typename RewardModelType>
69 return nrObservations;
70}
71
72template<typename ValueType, typename RewardModelType>
74 std::map<uint32_t, uint64_t> counts;
75 for (auto const &obs : observations) {
76 auto insertionRes = counts.emplace(obs, 1ull);
77 if (!insertionRes.second) {
78 ++insertionRes.first->second;
79 }
80 }
81 uint64_t result = 0;
82 for (auto const &count : counts) {
83 result = std::max(result, count.second);
84 }
85 return result;
86}
87
88template<typename ValueType, typename RewardModelType>
89std::vector<uint32_t> const &Pomdp<ValueType, RewardModelType>::getObservations() const {
90 return observations;
91}
92
93template<typename ValueType, typename RewardModelType>
94void Pomdp<ValueType, RewardModelType>::updateObservations(std::vector<uint32_t> &&newObservations, bool preservesCanonicity) {
95 observations = std::move(newObservations);
96 computeNrObservations();
97 setIsCanonic(isCanonic() && preservesCanonicity);
98}
99
100template<typename ValueType, typename RewardModelType>
102 return "<" + std::to_string(getObservation(state)) + ">";
103}
104
105template<typename ValueType, typename RewardModelType>
106std::vector<uint64_t> Pomdp<ValueType, RewardModelType>::getStatesWithObservation(uint32_t observation) const {
107 std::vector<uint64_t> result;
108 for (uint64_t state = 0; state < this->getNumberOfStates(); ++state) {
109 if (this->getObservation(state) == observation) {
110 result.push_back(state);
111 }
112 }
113 return result;
114}
115
116template<typename ValueType, typename RewardModelType>
118 return static_cast<bool>(observationValuations);
119}
120
121template<typename ValueType, typename RewardModelType>
125
126template<typename ValueType, typename RewardModelType>
127std::optional<storm::storage::sparse::StateValuations> const &Pomdp<ValueType, RewardModelType>::getOptionalObservationValuations() const {
128 return observationValuations;
129}
130
131template<typename ValueType, typename RewardModelType>
133 return canonicFlag;
134}
135
136template<typename ValueType, typename RewardModelType>
138 this->canonicFlag = newValue;
139}
140
141template<typename ValueType, typename RewardModelType>
145
146template<typename ValueType, typename RewardModelType>
148 std::size_t seed = 0;
149 boost::hash_combine(seed, sparse::Model<ValueType, RewardModelType>::hash());
150 boost::hash_combine(seed, boost::hash_range(observations.begin(), observations.end()));
151 return seed;
152}
153
154template class Pomdp<double>;
155template class Pomdp<storm::RationalNumber>;
157template class Pomdp<storm::RationalFunction>;
158template class Pomdp<storm::Interval>;
159} // namespace sparse
160} // namespace models
161} // namespace storm
This class represents a (discrete-time) Markov decision process.
Definition Mdp.h:14
Base class for all sparse models.
Definition Model.h:33
CRewardModelType RewardModelType
Definition Model.h:36
This class represents a partially observable Markov decision process.
Definition Pomdp.h:15
virtual bool isPartiallyObservable() const override
Definition Pomdp.cpp:142
uint64_t getNrObservations() const
Definition Pomdp.cpp:68
storm::storage::sparse::StateValuations const & getObservationValuations() const
Definition Pomdp.cpp:122
Pomdp(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::models::sparse::StateLabeling const &stateLabeling, std::unordered_map< std::string, RewardModelType > const &rewardModels=std::unordered_map< std::string, RewardModelType >())
Constructs a model from the given data.
Definition Pomdp.cpp:10
virtual void printModelInformationToStream(std::ostream &out) const override
Prints information about the model to the specified stream.
Definition Pomdp.cpp:43
void updateObservations(std::vector< uint32_t > &&newObservations, bool preservesCanonicity)
Changes the observations to the given ones and updates redundant informations (like the number of obs...
Definition Pomdp.cpp:94
std::vector< uint64_t > getStatesWithObservation(uint32_t observation) const
Definition Pomdp.cpp:106
std::optional< storm::storage::sparse::StateValuations > const & getOptionalObservationValuations() const
Definition Pomdp.cpp:127
virtual std::size_t hash() const override
Definition Pomdp.cpp:147
uint32_t getObservation(uint64_t state) const
Definition Pomdp.cpp:63
uint64_t getMaxNrStatesWithSameObservation() const
Returns the number of hidden values, i.e.
Definition Pomdp.cpp:73
void setIsCanonic(bool newValue=true)
Definition Pomdp.cpp:137
bool hasObservationValuations() const
Definition Pomdp.cpp:117
std::vector< uint32_t > const & getObservations() const
Definition Pomdp.cpp:89
virtual std::string additionalDotStateInfo(uint64_t state) const override
Return a string that is additonally added to the state information in the dot stream.
Definition Pomdp.cpp:101
This class manages the labeling of the state space with a number of (atomic) labels.
A class that holds a possibly non-square matrix in the compressed row storage format.
LabParser.cpp.
Definition cli.cpp:18