diff --git a/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp b/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp index a4e540300..1d3056426 100644 --- a/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp +++ b/src/modelchecker/propositional/SparsePropositionalModelChecker.cpp @@ -18,6 +18,11 @@ namespace storm { // Intentionally left empty. } + template + bool SparsePropositionalModelChecker::canHandle(storm::logic::Formula const& formula) const { + return formula.isPropositionalFormula(); + } + template std::unique_ptr SparsePropositionalModelChecker::checkBooleanLiteralFormula(storm::logic::BooleanLiteralFormula const& stateFormula) { if (stateFormula.isTrueFormula()) { diff --git a/src/modelchecker/propositional/SparsePropositionalModelChecker.h b/src/modelchecker/propositional/SparsePropositionalModelChecker.h index c6309e4f0..d3a9011ce 100644 --- a/src/modelchecker/propositional/SparsePropositionalModelChecker.h +++ b/src/modelchecker/propositional/SparsePropositionalModelChecker.h @@ -14,6 +14,7 @@ namespace storm { explicit SparsePropositionalModelChecker(storm::models::AbstractModel const& model); // The implemented methods of the AbstractModelChecker interface. + virtual bool canHandle(storm::logic::Formula const& formula) const override; virtual std::unique_ptr checkBooleanLiteralFormula(storm::logic::BooleanLiteralFormula const& stateFormula) override; virtual std::unique_ptr checkAtomicLabelFormula(storm::logic::AtomicLabelFormula const& stateFormula) override; diff --git a/src/models/AbstractModel.h b/src/models/AbstractModel.h index a3287a85b..bba887952 100644 --- a/src/models/AbstractModel.h +++ b/src/models/AbstractModel.h @@ -12,7 +12,11 @@ #include "src/storage/Scheduler.h" #include "src/storage/StronglyConnectedComponentDecomposition.h" #include "src/utility/ConstantsComparator.h" +#include "src/utility/macros.h" #include "src/utility/Hash.h" +#include "src/utility/vector.h" + +#include "src/exceptions/InvalidOperationException.h" namespace storm { namespace models { @@ -345,6 +349,15 @@ class AbstractModel: public std::enable_shared_from_this> { return static_cast(choiceLabeling); } + void convertTransitionRewardsToStateRewards() { + STORM_LOG_THROW(this->hasTransitionRewards(), storm::exceptions::InvalidOperationException, "Cannot reduce non-existant transition rewards to state rewards."); + if (this->hasStateRewards()) { + storm::utility::vector::addVectorsInPlace(stateRewardVector.get(), transitionMatrix.getPointwiseProductRowSumVector(transitionRewardMatrix.get())); + } else { + this->stateRewardVector = transitionMatrix.getPointwiseProductRowSumVector(transitionRewardMatrix.get()); + } + } + /*! * Retrieves the size of the internal representation of the model in memory. * @return the size of the internal representation of the model in memory diff --git a/src/stormParametric.cpp b/src/stormParametric.cpp index 6d71b4955..9211f125f 100644 --- a/src/stormParametric.cpp +++ b/src/stormParametric.cpp @@ -160,6 +160,10 @@ void check() { std::chrono::high_resolution_clock::time_point programTranslationEnd = std::chrono::high_resolution_clock::now(); std::cout << "Parsing and translating the model took " << std::chrono::duration_cast(programTranslationEnd - programTranslationStart).count() << "ms." << std::endl << std::endl; + if (model->hasTransitionRewards()) { + model->convertTransitionRewardsToStateRewards(); + } + std::shared_ptr> dtmc = model->template as>(); storm::modelchecker::SparseDtmcEliminationModelChecker modelchecker(*dtmc); diff --git a/src/utility/cli.h b/src/utility/cli.h index 30b9d4625..6bf8f303c 100644 --- a/src/utility/cli.h +++ b/src/utility/cli.h @@ -292,6 +292,10 @@ namespace storm { STORM_LOG_THROW(model->getType() == storm::models::DTMC, storm::exceptions::InvalidSettingsException, "Bisimulation minimization is currently only available for DTMCs."); std::shared_ptr> dtmc = model->template as>(); + if (dtmc->hasTransitionRewards()) { + dtmc->convertTransitionRewardsToStateRewards(); + } + std::cout << "Performing bisimulation minimization... "; storm::storage::DeterministicModelBisimulationDecomposition bisimulationDecomposition(*dtmc, boost::optional>(), true, storm::settings::bisimulationSettings().isWeakBisimulationSet(), true); model = bisimulationDecomposition.getQuotient();