53 lines
3.1 KiB
53 lines
3.1 KiB
#include "MarkovAutomatonParser.h"
|
|
#include "AtomicPropositionLabelingParser.h"
|
|
#include "SparseStateRewardParser.h"
|
|
|
|
#include "src/models/sparse/StandardRewardModel.h"
|
|
|
|
#include "src/exceptions/WrongFormatException.h"
|
|
|
|
#include "src/adapters/CarlAdapter.h"
|
|
|
|
namespace storm {
|
|
namespace parser {
|
|
|
|
template<typename ValueType, typename RewardValueType>
|
|
storm::models::sparse::MarkovAutomaton<ValueType, storm::models::sparse::StandardRewardModel<RewardValueType>> MarkovAutomatonParser<ValueType, RewardValueType>::parseMarkovAutomaton(std::string const& transitionsFilename, std::string const& labelingFilename, std::string const& stateRewardFilename, std::string const& transitionRewardFilename) {
|
|
|
|
// Parse the transitions of the Markov Automaton.
|
|
typename storm::parser::MarkovAutomatonSparseTransitionParser<ValueType>::Result transitionResult(storm::parser::MarkovAutomatonSparseTransitionParser<ValueType>::parseMarkovAutomatonTransitions(transitionsFilename));
|
|
|
|
// Build the actual transition matrix using the MatrixBuilder provided by the transitionResult.
|
|
storm::storage::SparseMatrix<ValueType> transitionMatrix(transitionResult.transitionMatrixBuilder.build());
|
|
|
|
// Parse the state labeling.
|
|
storm::models::sparse::StateLabeling resultLabeling(storm::parser::AtomicPropositionLabelingParser::parseAtomicPropositionLabeling(transitionMatrix.getColumnCount(), labelingFilename));
|
|
|
|
// If given, parse the state rewards file.
|
|
boost::optional<std::vector<RewardValueType>> stateRewards;
|
|
if (stateRewardFilename != "") {
|
|
stateRewards.reset(storm::parser::SparseStateRewardParser<RewardValueType>::parseSparseStateReward(transitionMatrix.getColumnCount(), stateRewardFilename));
|
|
}
|
|
std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<RewardValueType>> rewardModels;
|
|
rewardModels.insert(std::make_pair("", storm::models::sparse::StandardRewardModel<RewardValueType>(stateRewards, boost::optional<std::vector<RewardValueType>>(), boost::optional<storm::storage::SparseMatrix<RewardValueType>>())));
|
|
|
|
// Since Markov Automata do not support transition rewards no path should be given here.
|
|
if (transitionRewardFilename != "") {
|
|
STORM_LOG_ERROR("Transition rewards are unsupported for Markov automata.");
|
|
throw storm::exceptions::WrongFormatException() << "Transition rewards are unsupported for Markov automata.";
|
|
}
|
|
|
|
// Put the pieces together to generate the Markov Automaton.
|
|
storm::models::sparse::MarkovAutomaton<ValueType, storm::models::sparse::StandardRewardModel<RewardValueType>> resultingAutomaton(std::move(transitionMatrix), std::move(resultLabeling), std::move(transitionResult.markovianStates), std::move(transitionResult.exitRates), rewardModels);
|
|
|
|
return resultingAutomaton;
|
|
}
|
|
|
|
template class MarkovAutomatonParser<double, double>;
|
|
|
|
#ifdef STORM_HAVE_CARL
|
|
template class MarkovAutomatonParser<double, storm::Interval>;
|
|
#endif
|
|
|
|
} // namespace parser
|
|
} // namespace storm
|