115 lines
5.7 KiB

#include "storm/models/sparse/Pomdp.h"
namespace storm {
namespace models {
namespace sparse {
template <typename ValueType, typename RewardModelType>
Pomdp<ValueType, RewardModelType>::Pomdp(storm::storage::SparseMatrix<ValueType> const &transitionMatrix, storm::models::sparse::StateLabeling const &stateLabeling, std::unordered_map <std::string, RewardModelType> const &rewardModels) : Mdp<ValueType, RewardModelType>(transitionMatrix, stateLabeling, rewardModels, storm::models::ModelType::Pomdp) {
computeNrObservations();
}
template <typename ValueType, typename RewardModelType>
Pomdp<ValueType, RewardModelType>::Pomdp(storm::storage::SparseMatrix<ValueType> &&transitionMatrix, storm::models::sparse::StateLabeling &&stateLabeling, std::unordered_map <std::string, RewardModelType> &&rewardModels) : Mdp<ValueType, RewardModelType>(transitionMatrix, stateLabeling, rewardModels, storm::models::ModelType::Pomdp) {
computeNrObservations();
}
template <typename ValueType, typename RewardModelType>
Pomdp<ValueType, RewardModelType>::Pomdp(storm::storage::sparse::ModelComponents<ValueType, RewardModelType> const &components, bool canonicFlag) : Mdp<ValueType, RewardModelType>(components, storm::models::ModelType::Pomdp), observations(components.observabilityClasses.get()), canonicFlag(canonicFlag) {
computeNrObservations();
}
template <typename ValueType, typename RewardModelType>
Pomdp<ValueType, RewardModelType>::Pomdp(storm::storage::sparse::ModelComponents<ValueType, RewardModelType> &&components, bool canonicFlag): Mdp<ValueType, RewardModelType>(components, storm::models::ModelType::Pomdp), observations(components.observabilityClasses.get()), canonicFlag(canonicFlag) {
computeNrObservations();
}
template<typename ValueType, typename RewardModelType>
void Pomdp<ValueType, RewardModelType>::printModelInformationToStream(std::ostream& out) const {
this->printModelInformationHeaderToStream(out);
out << "Choices: \t" << this->getNumberOfChoices() << std::endl;
out << "Observations: \t" << this->nrObservations << std::endl;
this->printModelInformationFooterToStream(out);
}
template<typename ValueType, typename RewardModelType>
void Pomdp<ValueType, RewardModelType>::computeNrObservations() {
uint64_t highestEntry = 0;
for (uint32_t entry : observations) {
if (entry > highestEntry) {
highestEntry = entry;
}
}
nrObservations = highestEntry + 1; // Smallest entry should be zero.
// In debug mode, ensure that every observability is used.
}
template<typename ValueType, typename RewardModelType>
uint32_t Pomdp<ValueType, RewardModelType>::getObservation(uint64_t state) const {
return observations.at(state);
}
template<typename ValueType, typename RewardModelType>
uint64_t Pomdp<ValueType, RewardModelType>::getNrObservations() const {
return nrObservations;
}
template<typename ValueType, typename RewardModelType>
uint64_t Pomdp<ValueType, RewardModelType>::getMaxNrStatesWithSameObservation() const {
std::map<uint32_t, uint64_t> counts;
for (auto const& obs : observations) {
auto insertionRes = counts.emplace(obs, 1ull);
if (!insertionRes.second) {
++insertionRes.first->second;
}
}
uint64_t result = 0;
for (auto const& count : counts) {
result = std::max(result, count.second);
}
return result;
}
template<typename ValueType, typename RewardModelType>
std::vector<uint32_t> const& Pomdp<ValueType, RewardModelType>::getObservations() const {
return observations;
}
template<typename ValueType, typename RewardModelType>
std::string Pomdp<ValueType, RewardModelType>::additionalDotStateInfo(uint64_t state) const {
return "<" + std::to_string(getObservation(state)) + ">";
}
template<typename ValueType, typename RewardModelType>
std::vector<uint64_t>
Pomdp<ValueType, RewardModelType>::getStatesWithObservation(uint32_t observation) const {
std::vector<uint64_t> result;
for (uint64_t state = 0; state < this->getNumberOfStates(); ++state) {
if (this->getObservation(state) == observation) {
result.push_back(state);
}
}
return result;
}
template<typename ValueType, typename RewardModelType>
bool Pomdp<ValueType, RewardModelType>::isCanonic() const {
return canonicFlag;
}
template<typename ValueType, typename RewardModelType>
void Pomdp<ValueType, RewardModelType>::setIsCanonic(bool newValue) {
this->canonicFlag = newValue;
}
template class Pomdp<double>;
template class Pomdp<storm::RationalNumber>;
template class Pomdp<double, storm::models::sparse::StandardRewardModel<storm::Interval>>;
template class Pomdp<storm::RationalFunction>;
}
}
}