#include "storm/models/sparse/Pomdp.h" namespace storm { namespace models { namespace sparse { template Pomdp::Pomdp(storm::storage::SparseMatrix const &transitionMatrix, storm::models::sparse::StateLabeling const &stateLabeling, std::unordered_map const &rewardModels) : Mdp(transitionMatrix, stateLabeling, rewardModels, storm::models::ModelType::Pomdp) { computeNrObservations(); } template Pomdp::Pomdp(storm::storage::SparseMatrix &&transitionMatrix, storm::models::sparse::StateLabeling &&stateLabeling, std::unordered_map &&rewardModels) : Mdp(transitionMatrix, stateLabeling, rewardModels, storm::models::ModelType::Pomdp) { computeNrObservations(); } template Pomdp::Pomdp(storm::storage::sparse::ModelComponents const &components, bool canonicFlag) : Mdp(components, storm::models::ModelType::Pomdp), observations(components.observabilityClasses.get()), canonicFlag(canonicFlag) { computeNrObservations(); } template Pomdp::Pomdp(storm::storage::sparse::ModelComponents &&components, bool canonicFlag): Mdp(components, storm::models::ModelType::Pomdp), observations(components.observabilityClasses.get()), canonicFlag(canonicFlag) { computeNrObservations(); } template void Pomdp::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 void Pomdp::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 uint32_t Pomdp::getObservation(uint64_t state) const { return observations.at(state); } template uint64_t Pomdp::getNrObservations() const { return nrObservations; } template uint64_t Pomdp::getMaxNrStatesWithSameObservation() const { std::map 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 std::vector const& Pomdp::getObservations() const { return observations; } template std::string Pomdp::additionalDotStateInfo(uint64_t state) const { return "<" + std::to_string(getObservation(state)) + ">"; } template std::vector Pomdp::getStatesWithObservation(uint32_t observation) const { std::vector result; for (uint64_t state = 0; state < this->getNumberOfStates(); ++state) { if (this->getObservation(state) == observation) { result.push_back(state); } } return result; } template bool Pomdp::isCanonic() const { return canonicFlag; } template class Pomdp; template class Pomdp; template class Pomdp>; template class Pomdp; } } }