#include "src/parser/NondeterministicModelParser.h" #include #include #include "src/models/sparse/StandardRewardModel.h" #include "src/parser/NondeterministicSparseTransitionParser.h" #include "src/parser/AtomicPropositionLabelingParser.h" #include "src/parser/SparseStateRewardParser.h" #include "src/parser/SparseChoiceLabelingParser.h" #include "src/adapters/CarlAdapter.h" #include "src/utility/macros.h" namespace storm { namespace parser { template typename NondeterministicModelParser::Result NondeterministicModelParser::parseNondeterministicModel(std::string const& transitionsFilename, std::string const& labelingFilename, std::string const& stateRewardFilename, std::string const& transitionRewardFilename, std::string const& choiceLabelingFilename) { // Parse the transitions. storm::storage::SparseMatrix transitions(std::move(storm::parser::NondeterministicSparseTransitionParser::parseNondeterministicTransitions(transitionsFilename))); uint_fast64_t stateCount = transitions.getColumnCount(); // Parse the state labeling. storm::models::sparse::StateLabeling labeling(storm::parser::AtomicPropositionLabelingParser::parseAtomicPropositionLabeling(stateCount, labelingFilename)); // Only parse state rewards if a file is given. boost::optional> stateRewards; if (!stateRewardFilename.empty()) { stateRewards = std::move(storm::parser::SparseStateRewardParser::parseSparseStateReward(stateCount, stateRewardFilename)); } // Only parse transition rewards if a file is given. boost::optional> transitionRewards; if (!transitionRewardFilename.empty()) { transitionRewards = std::move(storm::parser::NondeterministicSparseTransitionParser::parseNondeterministicTransitionRewards(transitionRewardFilename, transitions)); } // Only parse choice labeling if a file is given. boost::optional> choiceLabeling; if (!choiceLabelingFilename.empty()) { choiceLabeling = std::move(storm::parser::SparseChoiceLabelingParser::parseChoiceLabeling(transitions.getRowGroupIndices(), choiceLabelingFilename)); } // Construct the result. Result result(std::move(transitions), std::move(labeling)); result.stateRewards = std::move(stateRewards); result.transitionRewards = std::move(transitionRewards); result.choiceLabeling = std::move(choiceLabeling); return result; } template storm::models::sparse::Mdp> NondeterministicModelParser::parseMdp(std::string const& transitionsFilename, std::string const& labelingFilename, std::string const& stateRewardFilename, std::string const& transitionRewardFilename, std::string const& choiceLabelingFilename) { Result parserResult = parseNondeterministicModel(transitionsFilename, labelingFilename, stateRewardFilename, transitionRewardFilename, choiceLabelingFilename); std::unordered_map> rewardModels; rewardModels.insert(std::make_pair("", storm::models::sparse::StandardRewardModel(parserResult.stateRewards, boost::optional>(), parserResult.transitionRewards))); return storm::models::sparse::Mdp>(std::move(parserResult.transitionSystem), std::move(parserResult.labeling), std::move(rewardModels), std::move(parserResult.choiceLabeling)); } template class NondeterministicModelParser; #ifdef STORM_HAVE_CARL template class NondeterministicModelParser; #endif } /* namespace parser */ } /* namespace storm */