#include #include "storm/api/storm.h" #include "storm/models/sparse/Pomdp.h" #include "storm/utility/logging.h" #include "storm-pomdp/storage/Belief.h" #include "storm/storage/jani/Property.h" namespace storm { namespace pomdp { namespace modelchecker { template struct POMDPCheckResult { ValueType OverapproximationValue; ValueType UnderapproximationValue; }; template> class ApproximatePOMDPModelchecker { public: explicit ApproximatePOMDPModelchecker(); std::unique_ptr> refineReachabilityProbability(storm::models::sparse::Pomdp const &pomdp, std::set const &targetObservations, bool min, uint64_t startingResolution, uint64_t stepSize, uint64_t maxNrOfRefinements); std::unique_ptr> computeReachabilityProbabilityOTF(storm::models::sparse::Pomdp const &pomdp, std::set targetObservations, bool min, uint64_t gridResolution); std::unique_ptr> computeReachabilityRewardOTF(storm::models::sparse::Pomdp const &pomdp, std::set targetObservations, bool min, uint64_t gridResolution); std::unique_ptr> computeReachabilityProbability(storm::models::sparse::Pomdp const &pomdp, std::set targetObservations, bool min, uint64_t gridResolution); std::unique_ptr> computeReachabilityReward(storm::models::sparse::Pomdp const &pomdp, std::set targetObservations, bool min, uint64_t gridResolution); private: /** * * @param pomdp * @param targetObservations * @param min * @param gridResolution * @param computeRewards * @return */ std::unique_ptr> computeReachabilityOTF(storm::models::sparse::Pomdp const &pomdp, std::set targetObservations, bool min, uint64_t gridResolution, bool computeRewards); /** * * @param pomdp * @param targetObservations * @param min * @param gridResolution * @param computeRewards * @return */ std::unique_ptr> computeReachability(storm::models::sparse::Pomdp const &pomdp, std::set targetObservations, bool min, uint64_t gridResolution, bool computeRewards); /** * TODO * @param pomdp * @param beliefList * @param observationProbabilities * @param nextBelieves * @param result * @param gridResolution * @param currentBeliefId * @param nextId * @param min * @return */ std::vector extractBestActions(storm::models::sparse::Pomdp const &pomdp, std::vector> &beliefList, std::vector &beliefIsTarget, std::set &target_observations, std::map>> &observationProbabilities, std::map>> &nextBelieves, std::map &result, uint64_t gridResolution, uint64_t currentBeliefId, uint64_t nextId, bool min); /** * TODO * @param pomdp * @param beliefList * @param observationProbabilities * @param nextBelieves * @param result * @param gridResolution * @param currentBeliefId * @param nextId * @param min * @return */ std::vector extractBestAction(storm::models::sparse::Pomdp const &pomdp, std::vector> &beliefList, std::vector &beliefIsTarget, std::set &target_observations, std::map>> &observationProbabilities, std::map>> &nextBelieves, std::map &result, uint64_t gridResolution, uint64_t currentBeliefId, uint64_t nextId, bool min); /** * TODO * @param pomdp * @param beliefList * @param beliefIsTarget * @param targetObservations * @param observationProbabilities * @param nextBelieves * @param result * @param chosenActions * @param gridResolution * @param initialBeliefId * @param min * @return */ ValueType computeUnderapproximationWithDTMC(storm::models::sparse::Pomdp const &pomdp, std::vector> &beliefList, std::vector &beliefIsTarget, std::set &targetObservations, std::map>> &observationProbabilities, std::map>> &nextBelieves, std::map &result, std::map> chosenActions, uint64_t gridResolution, uint64_t initialBeliefId, bool min, bool computeReward); ValueType computeUnderapproximationWithMDP(storm::models::sparse::Pomdp const &pomdp, std::vector> &beliefList, std::vector &beliefIsTarget, std::set &targetObservations, std::map>> &observationProbabilities, std::map>> &nextBelieves, std::map &result, std::map> chosenActions, uint64_t gridResolution, uint64_t initialBeliefId, bool min, bool computeRewards); /** * * @param pomdp * @param id * @return */ storm::pomdp::Belief getInitialBelief(storm::models::sparse::Pomdp const &pomdp, uint64_t id); /** * * @param probabilities * @param gridResolution * @return */ std::pair>, std::vector> computeSubSimplexAndLambdas(std::vector probabilities, uint64_t gridResolution); /** * Helper method to construct the grid of Belief states to approximate the POMDP * * @param pomdp * @param gridResolution * */ void constructBeliefGrid(storm::models::sparse::Pomdp const &pomdp, std::set target_observations, uint64_t gridResolution, std::vector> &beliefList, std::vector> &grid, std::vector &beliefIsKnown, uint64_t nextId); /** * Helper method to get the probabilities of each observation after performing an action * * @param pomdp * @param belief * @param actionIndex * @return */ std::map computeObservationProbabilitiesAfterAction( storm::models::sparse::Pomdp const &pomdp, storm::pomdp::Belief belief, uint64_t actionIndex); /** * Helper method to get the id of the next belief that results from a belief by performing an action and observing an observation. * If the belief does not exist yet, it is created and added to the list of all beliefs * * @param pomdp the POMDP on which the evaluation should be performed * @param belief the starting belief * @param actionIndex the index of the action to be performed * @param observation the observation after the action was performed * @return the resulting belief (observation and distribution) */ uint64_t getBeliefAfterActionAndObservation( storm::models::sparse::Pomdp const &pomdp, std::vector> &beliefList, std::vector &beliefIsTarget, std::set &targetObservations, storm::pomdp::Belief belief, uint64_t actionIndex, uint32_t observation, uint64_t id); /** * Helper method to get the next belief that results from a belief by performing an action * * @param pomdp * @param belief * @param actionIndex * @return */ storm::pomdp::Belief getBeliefAfterAction(storm::models::sparse::Pomdp const &pomdp, storm::pomdp::Belief belief, uint64_t actionIndex, uint64_t id); /** * Helper to get the id of a Belief stored in a given vector structure * * @param observation * @param probabilities * @return */ uint64_t getBeliefIdInVector(std::vector> const &grid, uint32_t observation, std::vector probabilities); storm::storage::SparseMatrix buildTransitionMatrix(std::vector> transitions); storm::storage::SparseMatrix buildTransitionMatrix(std::vector>> transitions); ValueType getRewardAfterAction(storm::models::sparse::Pomdp const &pomdp, uint64_t action, storm::pomdp::Belief belief); storm::utility::ConstantsComparator cc; double precision; bool useMdp; uint64_t maxIterations; }; } } }