#pragma once #include #include "storm/storage/BitVector.h" #include "storm/storage/SparseMatrix.h" #include "storm/modelchecker/multiobjective/Objective.h" #include "storm/models/sparse/Mdp.h" #include "storm/utility/vector.h" #include "storm/storage/memorystructure/MemoryStructure.h" #include "storm/storage/memorystructure/SparseModelMemoryProduct.h" #include "storm/transformer/EndComponentEliminator.h" namespace storm { namespace modelchecker { namespace multiobjective { template class MultiDimensionalRewardUnfolding { public: typedef std::vector Epoch; // The number of reward steps that are "left" for each dimension typedef uint64_t EpochClass; // Collection of epochs that consider the same epoch model struct SolutionType { ValueType weightedValue; std::vector objectiveValues; }; struct EpochModel { storm::storage::SparseMatrix epochMatrix; storm::storage::BitVector stepChoices; std::vector stepSolutions; std::vector> objectiveRewards; std::vector objectiveRewardFilter; }; /* * * @param model The (preprocessed) model * @param objectives The (preprocessed) objectives * @param possibleECActions Overapproximation of the actions that are part of an EC * @param allowedBottomStates The states which are allowed to become a bottom state under a considered scheduler * */ MultiDimensionalRewardUnfolding(storm::models::sparse::Mdp const& model, std::vector> const& objectives, storm::storage::BitVector const& possibleECActions, storm::storage::BitVector const& allowedBottomStates); Epoch getStartEpoch(); std::vector getEpochComputationOrder(Epoch const& startEpoch); EpochModel const& setCurrentEpoch(Epoch const& epoch); void setSolutionForCurrentEpoch(std::vector const& reducedModelStateSolutions); SolutionType const& getInitialStateResult(Epoch const& epoch) const; private: void setCurrentEpochClass(Epoch const& epoch); void initialize(); EpochClass getClassOfEpoch(Epoch const& epoch) const; Epoch getSuccessorEpoch(Epoch const& epoch, Epoch const& step) const; std::vector> computeObjectiveRewardsForProduct(Epoch const& epoch) const; storm::storage::MemoryStructure computeMemoryStructure() const; std::vector computeMemoryStateMap(storm::storage::MemoryStructure const& memory) const; storm::storage::BitVector const& convertMemoryState(uint64_t const& memoryState) const; uint64_t convertMemoryState(storm::storage::BitVector const& memoryState) const; uint64_t getProductState(uint64_t const& modelState, uint64_t const& memoryState) const; uint64_t getModelState(uint64_t const& productState) const; uint64_t getMemoryState(uint64_t const& productState) const; SolutionType getZeroSolution() const; void addScaledSolution(SolutionType& solution, SolutionType const& solutionToAdd, ValueType const& scalingFactor) const; void setSolutionForCurrentEpoch(uint64_t const& productState, SolutionType const& solution); SolutionType const& getStateSolution(Epoch const& epoch, uint64_t const& productState) const; storm::models::sparse::Mdp const& model; std::vector> const& objectives; storm::storage::BitVector possibleECActions; storm::storage::BitVector allowedBottomStates; std::shared_ptr> modelMemoryProduct; std::shared_ptr> productBuilder; std::vector memoryStateMap; std::vector> productEpochSteps; storm::storage::BitVector productAllowedBottomStates; std::vector modelStates; std::vector memoryStates; std::vector productChoiceToStateMapping; typename storm::transformer::EndComponentEliminator::EndComponentEliminatorReturnType ecElimResult; std::set possibleEpochSteps; EpochModel epochModel; boost::optional currentEpoch; std::vector objectiveDimensions; std::vector, uint64_t>> subObjectives; std::vector> memoryLabels; std::vector scalingFactors; std::map, SolutionType> solutions; }; } } }