diff --git a/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp b/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp index 03789fe53..34e0651a4 100644 --- a/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp +++ b/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp @@ -2,7 +2,7 @@ #include "storm/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.h" -#include "storm/modelchecker/multiobjective/pcaa.h" +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" #include "storm/models/sparse/StandardRewardModel.h" @@ -121,7 +121,7 @@ namespace storm { template std::unique_ptr SparseMarkovAutomatonCslModelChecker::checkMultiObjectiveFormula(CheckTask const& checkTask) { - return multiobjective::performPcaa(this->getModel(), checkTask.getFormula()); + return multiobjective::performMultiObjectiveModelChecking(this->getModel(), checkTask.getFormula()); } template class SparseMarkovAutomatonCslModelChecker>; diff --git a/src/storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.cpp b/src/storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.cpp new file mode 100644 index 000000000..6842c3ea7 --- /dev/null +++ b/src/storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.cpp @@ -0,0 +1,19 @@ +#include "storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.h" + + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + std::string toString(MultiObjectiveMethod m) { + switch (m) { + case MultiObjectiveMethod::Pcaa: + return "Pareto Curve Approximation Algorithm"; + case MultiObjectiveMethod::ConstraintBased: + return "Constraint Based Algorithm"; + } + return "invalid"; + } + } + } +} diff --git a/src/storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.h b/src/storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.h new file mode 100644 index 000000000..3bef420cc --- /dev/null +++ b/src/storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.h @@ -0,0 +1,13 @@ +#pragma once + +#include "storm/utility/ExtendSettingEnumWithSelectionField.h" + +namespace storm { + namespace modelchecker { + namespace multiobjective { + ExtendEnumsWithSelectionField(MultiObjectiveMethod, Pcaa, ConstraintBased) + } + } +} + + diff --git a/src/storm/modelchecker/multiobjective/constraintBased/SparseCbAchievabilityQuery.cpp b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbAchievabilityQuery.cpp new file mode 100644 index 000000000..4aefe2d8d --- /dev/null +++ b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbAchievabilityQuery.cpp @@ -0,0 +1,50 @@ +#include "storm/modelchecker/multiobjective/constraintbased/SparseCbAchievabilityQuery.h" + +#include "storm/adapters/CarlAdapter.h" +#include "storm/models/sparse/Mdp.h" +#include "storm/models/sparse/MarkovAutomaton.h" +#include "storm/models/sparse/StandardRewardModel.h" +#include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h" +#include "storm/utility/constants.h" +#include "storm/utility/vector.h" +#include "storm/settings/SettingsManager.h" +#include "storm/settings/modules/GeneralSettings.h" +#include "storm/settings/modules/MultiObjectiveSettings.h" + +#include "storm/exceptions/InvalidOperationException.h" + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + + template + SparseCbAchievabilityQuery::SparseCbAchievabilityQuery(SparseMultiObjectivePreprocessorReturnType& preprocessorResult) : SparseCbQuery(preprocessorResult) { + STORM_LOG_ASSERT(preprocessorResult.queryType==SparseMultiObjectivePreprocessorReturnType::QueryType::Achievability, "Invalid query Type"); + + } + + template + std::unique_ptr SparseCbAchievabilityQuery::check() { + + bool result = this->checkAchievability(); + + return std::unique_ptr(new ExplicitQualitativeCheckResult(this->originalModel.getInitialStates().getNextSetIndex(0), result)); + + } + + template + bool SparseCbAchievabilityQuery::checkAchievability() { + return false; + } + +#ifdef STORM_HAVE_CARL + template class SparseCbAchievabilityQuery>; + template class SparseCbAchievabilityQuery>; + + template class SparseCbAchievabilityQuery>; + // template class SparseCbAchievabilityQuery>; +#endif + } + } +} diff --git a/src/storm/modelchecker/multiobjective/constraintBased/SparseCbAchievabilityQuery.h b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbAchievabilityQuery.h new file mode 100644 index 000000000..a5f754a9b --- /dev/null +++ b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbAchievabilityQuery.h @@ -0,0 +1,36 @@ +#pragma once + +#include "storm/modelchecker/multiobjective/constraintbased/SparseCbQuery.h" + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + /* + * This class represents an achievability query for the constraint based approach (using SMT or LP solvers). + */ + template + class SparseCbAchievabilityQuery : public SparseCbQuery { + public: + + SparseCbAchievabilityQuery(SparseMultiObjectivePreprocessorReturnType& preprocessorResult); + + virtual ~SparseCbAchievabilityQuery() = default; + + /* + * Invokes the computation and retrieves the result + */ + virtual std::unique_ptr check() override; + + private: + + /* + * Returns whether the given thresholds are achievable. + */ + bool checkAchievability(); + + }; + + } + } +} diff --git a/src/storm/modelchecker/multiobjective/constraintBased/SparseCbQuery.cpp b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbQuery.cpp new file mode 100644 index 000000000..919ada311 --- /dev/null +++ b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbQuery.cpp @@ -0,0 +1,36 @@ +#include "storm/modelchecker/multiobjective/constraintbased/SparseCbQuery.h" + +#include "storm/adapters/CarlAdapter.h" +#include "storm/models/sparse/Mdp.h" +#include "storm/models/sparse/MarkovAutomaton.h" +#include "storm/models/sparse/StandardRewardModel.h" +#include "storm/modelchecker/multiobjective/Objective.h" +#include "storm/settings/SettingsManager.h" +#include "storm/settings/modules/MultiObjectiveSettings.h" +#include "storm/utility/constants.h" +#include "storm/utility/vector.h" + +#include "storm/exceptions/UnexpectedException.h" + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + + template + SparseCbQuery::SparseCbQuery(SparseMultiObjectivePreprocessorReturnType& preprocessorResult) : + originalModel(preprocessorResult.originalModel), originalFormula(preprocessorResult.originalFormula), + preprocessedModel(std::move(*preprocessorResult.preprocessedModel)), objectives(std::move(preprocessorResult.objectives)) { + + } + + +#ifdef STORM_HAVE_CARL + template class SparseCbQuery>; + template class SparseCbQuery>; + + template class SparseCbQuery>; +#endif + } + } +} diff --git a/src/storm/modelchecker/multiobjective/constraintBased/SparseCbQuery.h b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbQuery.h new file mode 100644 index 000000000..f8324f0fe --- /dev/null +++ b/src/storm/modelchecker/multiobjective/constraintBased/SparseCbQuery.h @@ -0,0 +1,39 @@ +#pragma once + +#include "storm/modelchecker/results/CheckResult.h" +#include "storm/modelchecker/multiobjective/SparseMultiObjectivePreprocessorReturnType.h" + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + /* + * This class represents a multi-objective query for the constraint based approach (using SMT or LP solvers). + */ + template + class SparseCbQuery { + public: + + + virtual ~SparseCbQuery() = default; + + /* + * Invokes the computation and retrieves the result + */ + virtual std::unique_ptr check() = 0; + + protected: + + SparseCbQuery(SparseMultiObjectivePreprocessorReturnType& preprocessorResult); + + SparseModelType const& originalModel; + storm::logic::MultiObjectiveFormula const& originalFormula; + + SparseModelType preprocessedModel; + std::vector> objectives; + + }; + + } + } +} diff --git a/src/storm/modelchecker/multiobjective/multiObjectiveModelChecking.cpp b/src/storm/modelchecker/multiobjective/multiObjectiveModelChecking.cpp new file mode 100644 index 000000000..29735b39d --- /dev/null +++ b/src/storm/modelchecker/multiobjective/multiObjectiveModelChecking.cpp @@ -0,0 +1,122 @@ +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" + +#include "storm/utility/macros.h" + +#include "storm/models/sparse/Mdp.h" +#include "storm/models/sparse/MarkovAutomaton.h" +#include "storm/models/sparse/StandardRewardModel.h" +#include "storm/modelchecker/multiobjective/SparseMultiObjectivePreprocessor.h" +#include "storm/modelchecker/multiobjective/pcaa/SparsePcaaAchievabilityQuery.h" +#include "storm/modelchecker/multiobjective/pcaa/SparsePcaaQuantitativeQuery.h" +#include "storm/modelchecker/multiobjective/pcaa/SparsePcaaParetoQuery.h" +#include "storm/modelchecker/multiobjective/constraintbased/SparseCbAchievabilityQuery.h" +#include "storm/settings/SettingsManager.h" +#include "storm/settings/modules/MultiObjectiveSettings.h" +#include "storm/settings/modules/CoreSettings.h" +#include "storm/utility/Stopwatch.h" + +#include "storm/exceptions/InvalidArgumentException.h" + + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + template + std::unique_ptr performMultiObjectiveModelChecking(SparseModelType const& model, storm::logic::MultiObjectiveFormula const& formula, MultiObjectiveMethodSelection methodSelection) { + storm::utility::Stopwatch swTotal(true); + storm::utility::Stopwatch swPreprocessing(true); + STORM_LOG_ASSERT(model.getInitialStates().getNumberOfSetBits() == 1, "Multi-objective Model checking on model with multiple initial states is not supported."); + + // If we consider an MA, ensure that it is closed + if(model.isOfType(storm::models::ModelType::MarkovAutomaton)) { + STORM_LOG_THROW(dynamic_cast const *>(&model)->isClosed(), storm::exceptions::InvalidArgumentException, "Unable to check multi-objective formula on non-closed Markov automaton."); + } + + // Preprocess the model + auto preprocessorResult = SparseMultiObjectivePreprocessor::preprocess(model, formula); + swPreprocessing.stop(); + if (storm::settings::getModule().isShowStatisticsSet()) { + STORM_PRINT_AND_LOG("Preprocessing done in " << swPreprocessing << " seconds." << std::endl << " Result: " << preprocessorResult << std::endl); + } else { + STORM_LOG_INFO("Preprocessing done in " << swPreprocessing << " seconds." << std::endl << " Result: " << preprocessorResult << std::endl); + } + + // Get the solution method + MultiObjectiveMethod method; + if (methodSelection == MultiObjectiveMethodSelection::FROMSETTINGS) { + method = storm::settings::getModule().getMultiObjectiveMethod(); + } else { + method = convert(methodSelection); + } + + // Invoke the analysis + storm::utility::Stopwatch swAnalysis(true); + std::unique_ptr result; + switch (method) { + case MultiObjectiveMethod::Pcaa: + { + std::unique_ptr> query; + switch (preprocessorResult.queryType) { + case SparseMultiObjectivePreprocessorReturnType::QueryType::Achievability: + query = std::unique_ptr> (new SparsePcaaAchievabilityQuery(preprocessorResult)); + break; + case SparseMultiObjectivePreprocessorReturnType::QueryType::Quantitative: + query = std::unique_ptr> (new SparsePcaaQuantitativeQuery(preprocessorResult)); + break; + case SparseMultiObjectivePreprocessorReturnType::QueryType::Pareto: + query = std::unique_ptr> (new SparsePcaaParetoQuery(preprocessorResult)); + break; + default: + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "The multi-objective query type is not supported for the selected solution method '" << toString(method) << "'."); + break; + } + + result = query->check(); + + if(storm::settings::getModule().isExportPlotSet()) { + query->exportPlotOfCurrentApproximation(storm::settings::getModule().getExportPlotDirectory()); + } + break; + } + case MultiObjectiveMethod::ConstraintBased: + { + std::unique_ptr> query; + switch (preprocessorResult.queryType) { + case SparseMultiObjectivePreprocessorReturnType::QueryType::Achievability: + query = std::unique_ptr> (new SparseCbAchievabilityQuery(preprocessorResult)); + break; + default: + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "The multi-objective query type is not supported for the selected solution method '" << toString(method) << "'."); + break; + } + + result = query->check(); + + if(storm::settings::getModule().isExportPlotSet()) { + STORM_LOG_ERROR("Can not export plot for the constrained based solver."); + } + break; + } + default: + STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "The multi-objective solution method '" << toString(method) << "' is not supported."); + } + swAnalysis.stop(); + + swTotal.stop(); + if (storm::settings::getModule().isShowStatisticsSet()) { + STORM_PRINT_AND_LOG("Solving multi-objective query took " << swTotal << " seconds (consisting of " << swPreprocessing << " seconds for preprocessing and " << swAnalysis << " seconds for analyzing the preprocessed model)." << std::endl); + } + + return result; + } + + + template std::unique_ptr performMultiObjectiveModelChecking>(storm::models::sparse::Mdp const& model, storm::logic::MultiObjectiveFormula const& formula, MultiObjectiveMethodSelection methodSelection); + template std::unique_ptr performMultiObjectiveModelChecking>(storm::models::sparse::MarkovAutomaton const& model, storm::logic::MultiObjectiveFormula const& formula, MultiObjectiveMethodSelection methodSelection); + template std::unique_ptr performMultiObjectiveModelChecking>(storm::models::sparse::Mdp const& model, storm::logic::MultiObjectiveFormula const& formula, MultiObjectiveMethodSelection methodSelection); + // template std::unique_ptr performMultiObjectiveModelChecking>(storm::models::sparse::MarkovAutomaton const& model, storm::logic::MultiObjectiveFormula const& formula, MultiObjectiveMethodSelection methodSelection); + + } + } +} diff --git a/src/storm/modelchecker/multiobjective/multiObjectiveModelChecking.h b/src/storm/modelchecker/multiobjective/multiObjectiveModelChecking.h new file mode 100644 index 000000000..380f79384 --- /dev/null +++ b/src/storm/modelchecker/multiobjective/multiObjectiveModelChecking.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include "storm/modelchecker/results/CheckResult.h" +#include "storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.h" +#include "storm/logic/Formulas.h" + +namespace storm { + namespace modelchecker { + namespace multiobjective { + + + template + std::unique_ptr performMultiObjectiveModelChecking(SparseModelType const& model, storm::logic::MultiObjectiveFormula const& formula, MultiObjectiveMethodSelection methodSelection = MultiObjectiveMethodSelection::FROMSETTINGS); + + } + } +} diff --git a/src/storm/modelchecker/multiobjective/pcaa.cpp b/src/storm/modelchecker/multiobjective/pcaa.cpp deleted file mode 100644 index c07ea26a1..000000000 --- a/src/storm/modelchecker/multiobjective/pcaa.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "storm/modelchecker/multiobjective/pcaa.h" - -#include "storm/utility/macros.h" - -#include "storm/models/sparse/Mdp.h" -#include "storm/models/sparse/MarkovAutomaton.h" -#include "storm/models/sparse/StandardRewardModel.h" -#include "storm/modelchecker/multiobjective/SparseMultiObjectivePreprocessor.h" -#include "storm/modelchecker/multiobjective/pcaa/SparsePcaaAchievabilityQuery.h" -#include "storm/modelchecker/multiobjective/pcaa/SparsePcaaQuantitativeQuery.h" -#include "storm/modelchecker/multiobjective/pcaa/SparsePcaaParetoQuery.h" -#include "storm/settings/SettingsManager.h" -#include "storm/settings/modules/MultiObjectiveSettings.h" -#include "storm/settings/modules/CoreSettings.h" -#include "storm/utility/Stopwatch.h" - -#include "storm/exceptions/InvalidArgumentException.h" - - -namespace storm { - namespace modelchecker { - namespace multiobjective { - - template - std::unique_ptr performPcaa(SparseModelType const& model, storm::logic::MultiObjectiveFormula const& formula) { - storm::utility::Stopwatch swTotal(true); - storm::utility::Stopwatch swPreprocessing(true); - STORM_LOG_ASSERT(model.getInitialStates().getNumberOfSetBits() == 1, "Multi-objective Model checking on model with multiple initial states is not supported."); - -#ifdef STORM_HAVE_CARL - - // If we consider an MA, ensure that it is closed - if(model.isOfType(storm::models::ModelType::MarkovAutomaton)) { - STORM_LOG_THROW(dynamic_cast const *>(&model)->isClosed(), storm::exceptions::InvalidArgumentException, "Unable to check multi-objective formula on non-closed Markov automaton."); - } - - auto preprocessorResult = SparseMultiObjectivePreprocessor::preprocess(model, formula); - swPreprocessing.stop(); - if (storm::settings::getModule().isShowStatisticsSet()) { - STORM_PRINT_AND_LOG("Preprocessing done in " << swPreprocessing << " seconds." << std::endl << " Result: " << preprocessorResult << std::endl); - } else { - STORM_LOG_INFO("Preprocessing done in " << swPreprocessing << " seconds." << std::endl << " Result: " << preprocessorResult << std::endl); - } - storm::utility::Stopwatch swValueIterations(true); - std::unique_ptr> query; - switch (preprocessorResult.queryType) { - case SparseMultiObjectivePreprocessorReturnType::QueryType::Achievability: - query = std::unique_ptr> (new SparsePcaaAchievabilityQuery(preprocessorResult)); - break; - case SparseMultiObjectivePreprocessorReturnType::QueryType::Quantitative: - query = std::unique_ptr> (new SparsePcaaQuantitativeQuery(preprocessorResult)); - break; - case SparseMultiObjectivePreprocessorReturnType::QueryType::Pareto: - query = std::unique_ptr> (new SparsePcaaParetoQuery(preprocessorResult)); - break; - default: - STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Unsupported multi-objective Query Type."); - break; - } - - auto result = query->check(); - swValueIterations.stop(); - swTotal.stop(); - if (storm::settings::getModule().isShowStatisticsSet()) { - STORM_PRINT_AND_LOG("Solving multi-objective query took " << swTotal << " seconds (consisting of " << swPreprocessing << " seconds for preprocessing and " << swValueIterations << " seconds for value iteration-based exploration of achievable points)." << std::endl); - } - - - if(storm::settings::getModule().isExportPlotSet()) { - query->exportPlotOfCurrentApproximation(storm::settings::getModule().getExportPlotDirectory()); - } - return result; -#else - STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Multi-objective model checking requires carl."); - return nullptr; -#endif - } - - template std::unique_ptr performPcaa>(storm::models::sparse::Mdp const& model, storm::logic::MultiObjectiveFormula const& formula); - template std::unique_ptr performPcaa>(storm::models::sparse::MarkovAutomaton const& model, storm::logic::MultiObjectiveFormula const& formula); -#ifdef STORM_HAVE_CARL - template std::unique_ptr performPcaa>(storm::models::sparse::Mdp const& model, storm::logic::MultiObjectiveFormula const& formula); - // template std::unique_ptr performPcaa>(storm::models::sparse::MarkovAutomaton const& model, storm::logic::MultiObjectiveFormula const& formula); -#endif - - } - } -} diff --git a/src/storm/modelchecker/multiobjective/pcaa.h b/src/storm/modelchecker/multiobjective/pcaa.h deleted file mode 100644 index eca82b767..000000000 --- a/src/storm/modelchecker/multiobjective/pcaa.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef STORM_MODELCHECKER_MULTIOBJECTIVE_PCAA_H_ -#define STORM_MODELCHECKER_MULTIOBJECTIVE_PCAA_H_ - -#include - -#include "storm/modelchecker/results/CheckResult.h" -#include "storm/logic/Formulas.h" - -namespace storm { - namespace modelchecker { - namespace multiobjective { - - template - std::unique_ptr performPcaa(SparseModelType const& model, storm::logic::MultiObjectiveFormula const& formula); - - } - } -} - -#endif /* STORM_MODELCHECKER_MULTIOBJECTIVE_PCAA_H_ */ diff --git a/src/storm/modelchecker/multiobjective/pcaa/SparsePcaaQuery.h b/src/storm/modelchecker/multiobjective/pcaa/SparsePcaaQuery.h index 05cd258eb..b652af562 100644 --- a/src/storm/modelchecker/multiobjective/pcaa/SparsePcaaQuery.h +++ b/src/storm/modelchecker/multiobjective/pcaa/SparsePcaaQuery.h @@ -95,7 +95,7 @@ namespace storm { bool maxStepsPerformed() const; /* - * Transforms the given point (or polytope) to values w.r.t. the original model (e.g. negates negative rewards for minimizing objectives). + * Transforms the given point (or polytope) to values w.r.t. the original model/formula (e.g. negates values for minimizing objectives). */ Point transformPointToOriginalModel(Point const& polytope) const; std::shared_ptr> transformPolytopeToOriginalModel(std::shared_ptr> const& polytope) const; diff --git a/src/storm/modelchecker/prctl/HybridMdpPrctlModelChecker.cpp b/src/storm/modelchecker/prctl/HybridMdpPrctlModelChecker.cpp index 93f538987..9b97b9f25 100644 --- a/src/storm/modelchecker/prctl/HybridMdpPrctlModelChecker.cpp +++ b/src/storm/modelchecker/prctl/HybridMdpPrctlModelChecker.cpp @@ -16,7 +16,7 @@ #include "storm/logic/FragmentSpecification.h" -#include "storm/modelchecker/multiobjective/pcaa.h" +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" #include "storm/solver/MinMaxLinearEquationSolver.h" @@ -126,7 +126,7 @@ namespace storm { template std::unique_ptr HybridMdpPrctlModelChecker::checkMultiObjectiveFormula(CheckTask const& checkTask) { auto sparseModel = storm::transformer::SymbolicMdpToSparseMdpTransformer::translate(this->getModel()); - std::unique_ptr explicitResult = multiobjective::performPcaa(*sparseModel, checkTask.getFormula()); + std::unique_ptr explicitResult = multiobjective::performMultiObjectiveModelChecking(*sparseModel, checkTask.getFormula()); // Convert the explicit result if(explicitResult->isExplicitQualitativeCheckResult()) { diff --git a/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp b/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp index 44db5e635..4aaee1400 100644 --- a/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp +++ b/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp @@ -14,7 +14,7 @@ #include "storm/modelchecker/prctl/helper/SparseMdpPrctlHelper.h" -#include "storm/modelchecker/multiobjective/pcaa.h" +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" #include "storm/solver/LpSolver.h" @@ -164,7 +164,7 @@ namespace storm { template std::unique_ptr SparseMdpPrctlModelChecker::checkMultiObjectiveFormula(CheckTask const& checkTask) { - return multiobjective::performPcaa(this->getModel(), checkTask.getFormula()); + return multiobjective::performMultiObjectiveModelChecking(this->getModel(), checkTask.getFormula()); } template class SparseMdpPrctlModelChecker>; diff --git a/src/storm/settings/modules/MultiObjectiveSettings.cpp b/src/storm/settings/modules/MultiObjectiveSettings.cpp index 4f7dee008..1ebc3464b 100644 --- a/src/storm/settings/modules/MultiObjectiveSettings.cpp +++ b/src/storm/settings/modules/MultiObjectiveSettings.cpp @@ -12,11 +12,14 @@ namespace storm { namespace modules { const std::string MultiObjectiveSettings::moduleName = "multiobjective"; + const std::string MultiObjectiveSettings::methodOptionName = "method"; const std::string MultiObjectiveSettings::exportPlotOptionName = "exportplot"; const std::string MultiObjectiveSettings::precisionOptionName = "precision"; const std::string MultiObjectiveSettings::maxStepsOptionName = "maxsteps"; MultiObjectiveSettings::MultiObjectiveSettings() : ModuleSettings(moduleName) { + std::vector methods = {"pcaa", "constraintbased"}; + this->addOption(storm::settings::OptionBuilder(moduleName, methodOptionName, true, "The method to be used for multi objective model checking.").addArgument(storm::settings::ArgumentBuilder::createStringArgument("name", "The name of the method to use.").addValidatorString(ArgumentValidatorFactory::createMultipleChoiceValidator(methods)).setDefaultValueString("pcaa").build()).build()); this->addOption(storm::settings::OptionBuilder(moduleName, exportPlotOptionName, true, "Saves data for plotting of pareto curves and achievable values.") .addArgument(storm::settings::ArgumentBuilder::createStringArgument("directory", "A path to a directory in which the results will be saved.").build()).build()); this->addOption(storm::settings::OptionBuilder(moduleName, precisionOptionName, true, "The precision used for the approximation of numerical- and pareto queries.") @@ -25,12 +28,26 @@ namespace storm { .addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("value", "the threshold for the number of refinement steps to be performed.").build()).build()); } + storm::modelchecker::multiobjective::MultiObjectiveMethod MultiObjectiveSettings::getMultiObjectiveMethod() const { + std::string methodAsString = this->getOption(methodOptionName).getArgumentByName("name").getValueAsString(); + if (methodAsString == "pcaa") { + return storm::modelchecker::multiobjective::MultiObjectiveMethod::Pcaa; + } else { + STORM_LOG_ASSERT(methodAsString == "constraintbased", "Unexpected method name for multi objective model checking method."); + return storm::modelchecker::multiobjective::MultiObjectiveMethod::ConstraintBased; + } + } + bool MultiObjectiveSettings::isExportPlotSet() const { return this->getOption(exportPlotOptionName).getHasOptionBeenSet(); } std::string MultiObjectiveSettings::getExportPlotDirectory() const { - return this->getOption(exportPlotOptionName).getArgumentByName("directory").getValueAsString(); + std::string result = this->getOption(exportPlotOptionName).getArgumentByName("directory").getValueAsString(); + if (result.back() != '/') { + result.push_back('/'); + } + return result; } double MultiObjectiveSettings::getPrecision() const { diff --git a/src/storm/settings/modules/MultiObjectiveSettings.h b/src/storm/settings/modules/MultiObjectiveSettings.h index dc5c8c0f2..577b57308 100644 --- a/src/storm/settings/modules/MultiObjectiveSettings.h +++ b/src/storm/settings/modules/MultiObjectiveSettings.h @@ -2,6 +2,7 @@ #define STORM_SETTINGS_MODULES_MULTIOBJECTIVESETTINGS_H_ #include "storm/settings/modules/ModuleSettings.h" +#include "storm/modelchecker/multiobjective/MultiObjectiveModelCheckingMethod.h" namespace storm { namespace settings { @@ -18,6 +19,11 @@ namespace storm { */ MultiObjectiveSettings(); + /*! + * Returns the preferred method for multi objective model checking + */ + storm::modelchecker::multiobjective::MultiObjectiveMethod getMultiObjectiveMethod() const; + /*! * Retrieves whether the data for plotting should be exported. * @return True iff the data for plotting should be exported. @@ -63,6 +69,7 @@ namespace storm { const static std::string moduleName; private: + const static std::string methodOptionName; const static std::string exportPlotOptionName; const static std::string precisionOptionName; const static std::string maxStepsOptionName; diff --git a/src/test/modelchecker/SparseMaPcaaModelCheckerTest.cpp b/src/test/modelchecker/SparseMaPcaaMultiObjectiveModelCheckerTest.cpp similarity index 87% rename from src/test/modelchecker/SparseMaPcaaModelCheckerTest.cpp rename to src/test/modelchecker/SparseMaPcaaMultiObjectiveModelCheckerTest.cpp index 8ba599bde..72523eb50 100644 --- a/src/test/modelchecker/SparseMaPcaaModelCheckerTest.cpp +++ b/src/test/modelchecker/SparseMaPcaaMultiObjectiveModelCheckerTest.cpp @@ -3,7 +3,7 @@ #if defined STORM_HAVE_HYPRO || defined STORM_HAVE_Z3_OPTIMIZE -#include "storm/modelchecker/multiobjective/pcaa.h" +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" #include "storm/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h" #include "storm/modelchecker/results/ExplicitParetoCurveCheckResult.h" @@ -17,7 +17,7 @@ /* Rationals for MAs not supported at this point -TEST(SparseMaPcaaModelCheckerTest, serverRationalNumbers) { +TEST(SparseMaPcaaMultiObjectiveModelCheckerTest, serverRationalNumbers) { std::string programFile = STORM_TEST_RESOURCES_DIR "/ma/server.ma"; std::string formulasAsString = "multi(Tmax=? [ F \"error\" ], Pmax=? [ F \"processB\" ]) "; // pareto @@ -48,7 +48,7 @@ TEST(SparseMaPcaaModelCheckerTest, serverRationalNumbers) { }*/ -TEST(SparseMaPcaaModelCheckerTest, server) { +TEST(SparseMaPcaaMultiObjectiveModelCheckerTest, server) { std::string programFile = STORM_TEST_RESOURCES_DIR "/ma/server.ma"; std::string formulasAsString = "multi(Tmax=? [ F \"error\" ], Pmax=? [ F \"processB\" ]) "; // pareto @@ -58,7 +58,7 @@ TEST(SparseMaPcaaModelCheckerTest, server) { std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); std::shared_ptr> ma = storm::buildSparseModel(program, formulas)->as>(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitParetoCurveCheckResult()); // we do our checks with rationals to avoid numerical issues when doing polytope computations... @@ -77,7 +77,7 @@ TEST(SparseMaPcaaModelCheckerTest, server) { } -TEST(SparseMaPcaaModelCheckerTest, jobscheduler_pareto_3Obj) { +TEST(SparseMaPcaaMultiObjectiveModelCheckerTest, jobscheduler_pareto_3Obj) { std::string programFile = STORM_TEST_RESOURCES_DIR "/ma/jobscheduler.ma"; std::string formulasAsString = "multi(Tmin=? [ F \"all_jobs_finished\" ], Pmax=? [ F<=0.2 \"half_of_jobs_finished\" ], Pmin=? [ F \"slowest_before_fastest\" ]) "; @@ -87,7 +87,7 @@ TEST(SparseMaPcaaModelCheckerTest, jobscheduler_pareto_3Obj) { std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); std::shared_ptr> ma = storm::buildSparseModel(program, formulas)->as>(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitParetoCurveCheckResult()); std::vector j12 = {1.266666667,0.1617571721,0.5}; @@ -107,7 +107,7 @@ TEST(SparseMaPcaaModelCheckerTest, jobscheduler_pareto_3Obj) { EXPECT_TRUE(result->asExplicitParetoCurveCheckResult().getOverApproximation()->convertNumberRepresentation()->minkowskiSum(bloatingBox)->contains(expectedAchievableValues)); } -TEST(SparseMaPcaaModelCheckerTest, jobscheduler_achievability_3Obj) { +TEST(SparseMaPcaaMultiObjectiveModelCheckerTest, jobscheduler_achievability_3Obj) { std::string programFile = STORM_TEST_RESOURCES_DIR "/ma/jobscheduler.ma"; std::string formulasAsString = "multi(T<=1.31 [ F \"all_jobs_finished\" ], P>=0.17 [ F<=0.2 \"half_of_jobs_finished\" ], P<=0.31 [ F \"slowest_before_fastest\" ]) "; //true @@ -119,16 +119,16 @@ TEST(SparseMaPcaaModelCheckerTest, jobscheduler_achievability_3Obj) { std::shared_ptr> ma = storm::buildSparseModel(program, formulas)->as>(); uint_fast64_t const initState = *ma->getInitialStates().begin(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQualitativeCheckResult()); EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]); - std::unique_ptr result2 = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[1]->asMultiObjectiveFormula()); + std::unique_ptr result2 = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[1]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result2->isExplicitQualitativeCheckResult()); EXPECT_FALSE(result2->asExplicitQualitativeCheckResult()[initState]); } -TEST(SparseMaPcaaModelCheckerTest, jobscheduler_quantitative_3Obj) { +TEST(SparseMaPcaaMultiObjectiveModelCheckerTest, jobscheduler_quantitative_3Obj) { std::string programFile = STORM_TEST_RESOURCES_DIR "/ma/jobscheduler.ma"; std::string formulasAsString = "multi(Tmin=? [ F \"all_jobs_finished\" ], P>=0.1797900683 [ F<=0.2 \"half_of_jobs_finished\" ], P<=0.3 [ F \"slowest_before_fastest\" ]) "; //quantitative @@ -141,16 +141,16 @@ TEST(SparseMaPcaaModelCheckerTest, jobscheduler_quantitative_3Obj) { uint_fast64_t const initState = *ma->getInitialStates().begin(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); EXPECT_NEAR(1.3, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); - std::unique_ptr result2 = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[1]->asMultiObjectiveFormula()); + std::unique_ptr result2 = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[1]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result2->isExplicitQualitativeCheckResult()); EXPECT_FALSE(result2->asExplicitQualitativeCheckResult()[initState]); } -TEST(SparseMaPcaaModelCheckerTest, jobscheduler_pareto_2Obj) { +TEST(SparseMaPcaaMultiObjectiveModelCheckerTest, jobscheduler_pareto_2Obj) { std::string programFile = STORM_TEST_RESOURCES_DIR "/ma/jobscheduler.ma"; std::string formulasAsString = "multi( Pmax=? [ F<=0.1 \"one_job_finished\"], Pmin=? [F<=0.2 \"all_jobs_finished\"]) "; @@ -160,7 +160,7 @@ TEST(SparseMaPcaaModelCheckerTest, jobscheduler_pareto_2Obj) { std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); std::shared_ptr> ma = storm::buildSparseModel(program, formulas)->as>(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*ma, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*ma, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitParetoCurveCheckResult()); std::vector j12 = {0.2591835573, 0.01990529674}; diff --git a/src/test/modelchecker/SparseMdpCbMultiObjectiveModelCheckerTest b/src/test/modelchecker/SparseMdpCbMultiObjectiveModelCheckerTest new file mode 100644 index 000000000..0ff8bbdeb --- /dev/null +++ b/src/test/modelchecker/SparseMdpCbMultiObjectiveModelCheckerTest @@ -0,0 +1,113 @@ +#include "gtest/gtest.h" +#include "storm-config.h" + +#if defined STORM_HAVE_HYPRO || defined STORM_HAVE_Z3_OPTIMIZE + +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" +#include "storm/modelchecker/results/ExplicitQuantitativeCheckResult.h" +#include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h" +#include "storm/models/sparse/Mdp.h" +#include "storm/settings/modules/GeneralSettings.h" +#include "storm/settings/SettingsManager.h" +#include "storm/utility/storm.h" + + +TEST(SparseMdpCbMultiObjectiveModelCheckerTest, consensus) { + + std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_consensus2_3_2.nm"; + std::string formulasAsString = "multi(Pmax=? [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ]) "; // numerical + formulasAsString += "; \n multi(P>=0.1 [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ])"; // achievability (true) + formulasAsString += "; \n multi(P>=0.11 [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ])"; // achievability (false) + + // programm, model, formula + storm::prism::Program program = storm::parseProgram(programFile); + program = storm::utility::prism::preprocess(program, ""); + std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); + std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); + uint_fast64_t const initState = *mdp->getInitialStates().begin();; + + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); + EXPECT_NEAR(0.10833260970000025, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); + + result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[1]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + ASSERT_TRUE(result->isExplicitQualitativeCheckResult()); + EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]); + + result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[2]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + ASSERT_TRUE(result->isExplicitQualitativeCheckResult()); + EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]); + +} + +TEST(SparseMdpCbMultiObjectiveModelCheckerTest, zeroconf) { + + std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_zeroconf4.nm"; + std::string formulasAsString = "multi(Pmax=? [ F l=4 & ip=1 ] , P>=0.993141[ G (error=0) ]) "; // numerical + + // programm, model, formula + storm::prism::Program program = storm::parseProgram(programFile); + program = storm::utility::prism::preprocess(program, ""); + std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); + std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); + uint_fast64_t const initState = *mdp->getInitialStates().begin(); + + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); + EXPECT_NEAR(0.0003075787401574803, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); +} + +TEST(SparseMdpCbMultiObjectiveModelCheckerTest, team3with3objectives) { + + std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_team3.nm"; + std::string formulasAsString = "multi(Pmax=? [ F \"task1_compl\" ], R{\"w_1_total\"}>=2.210204082 [ C ], P>=0.5 [ F \"task2_compl\" ])"; // numerical + + // programm, model, formula + storm::prism::Program program = storm::parseProgram(programFile); + program = storm::utility::prism::preprocess(program, ""); + std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); + std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); + uint_fast64_t const initState = *mdp->getInitialStates().begin(); + + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); + EXPECT_NEAR(0.7448979591841851, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); +} + +TEST(SparseMdpCbMultiObjectiveModelCheckerTest, scheduler) { + + std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_scheduler05.nm"; + std::string formulasAsString = "multi(R{\"time\"}<= 11.778[ F \"tasks_complete\" ], R{\"energy\"}<=1.45 [ F \"tasks_complete\" ]) "; + + // programm, model, formula + storm::prism::Program program = storm::parseProgram(programFile); + program = storm::utility::prism::preprocess(program, ""); + std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); + std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); + uint_fast64_t const initState = *mdp->getInitialStates().begin(); + + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]); +} + +TEST(SparseMdpCbMultiObjectiveModelCheckerTest, dpm) { + + std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_dpm100.nm"; + std::string formulasAsString = "multi(R{\"power\"}min=? [ C<=100 ], R{\"queue\"}<=70 [ C<=100 ])"; // numerical + + // programm, model, formula + storm::prism::Program program = storm::parseProgram(programFile); + program = storm::utility::prism::preprocess(program, ""); + std::vector> formulas = storm::extractFormulasFromProperties(storm::parsePropertiesForPrismProgram(formulasAsString, program)); + std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); + uint_fast64_t const initState = *mdp->getInitialStates().begin(); + + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::ConstraintBased); + ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); + EXPECT_NEAR(121.6128842, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); +} + + + + +#endif /* STORM_HAVE_HYPRO || defined STORM_HAVE_Z3_OPTIMIZE */ diff --git a/src/test/modelchecker/SparseMdpPcaaModelCheckerTest.cpp b/src/test/modelchecker/SparseMdpPcaaMultiObjectiveModelCheckerTest.cpp similarity index 78% rename from src/test/modelchecker/SparseMdpPcaaModelCheckerTest.cpp rename to src/test/modelchecker/SparseMdpPcaaMultiObjectiveModelCheckerTest.cpp index 369a768ac..0d315e74b 100644 --- a/src/test/modelchecker/SparseMdpPcaaModelCheckerTest.cpp +++ b/src/test/modelchecker/SparseMdpPcaaMultiObjectiveModelCheckerTest.cpp @@ -3,7 +3,7 @@ #if defined STORM_HAVE_HYPRO || defined STORM_HAVE_Z3_OPTIMIZE -#include "storm/modelchecker/multiobjective/pcaa.h" +#include "storm/modelchecker/multiobjective/multiObjectiveModelChecking.h" #include "storm/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h" #include "storm/models/sparse/Mdp.h" @@ -12,7 +12,7 @@ #include "storm/utility/storm.h" -TEST(SparseMdpPcaaModelCheckerTest, consensus) { +TEST(SparseMdpPcaaMultiObjectiveModelCheckerTest, consensus) { std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_consensus2_3_2.nm"; std::string formulasAsString = "multi(Pmax=? [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ]) "; // numerical @@ -26,21 +26,21 @@ TEST(SparseMdpPcaaModelCheckerTest, consensus) { std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); uint_fast64_t const initState = *mdp->getInitialStates().begin();; - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); EXPECT_NEAR(0.10833260970000025, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); - result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[1]->asMultiObjectiveFormula()); + result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[1]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQualitativeCheckResult()); EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]); - result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[2]->asMultiObjectiveFormula()); + result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[2]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQualitativeCheckResult()); EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]); } -TEST(SparseMdpPcaaModelCheckerTest, zeroconf) { +TEST(SparseMdpPcaaMultiObjectiveModelCheckerTest, zeroconf) { std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_zeroconf4.nm"; std::string formulasAsString = "multi(Pmax=? [ F l=4 & ip=1 ] , P>=0.993141[ G (error=0) ]) "; // numerical @@ -52,12 +52,12 @@ TEST(SparseMdpPcaaModelCheckerTest, zeroconf) { std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); uint_fast64_t const initState = *mdp->getInitialStates().begin(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); EXPECT_NEAR(0.0003075787401574803, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); } -TEST(SparseMdpPcaaModelCheckerTest, team3with3objectives) { +TEST(SparseMdpPcaaMultiObjectiveModelCheckerTest, team3with3objectives) { std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_team3.nm"; std::string formulasAsString = "multi(Pmax=? [ F \"task1_compl\" ], R{\"w_1_total\"}>=2.210204082 [ C ], P>=0.5 [ F \"task2_compl\" ])"; // numerical @@ -69,12 +69,12 @@ TEST(SparseMdpPcaaModelCheckerTest, team3with3objectives) { std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); uint_fast64_t const initState = *mdp->getInitialStates().begin(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); EXPECT_NEAR(0.7448979591841851, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); } -TEST(SparseMdpPcaaModelCheckerTest, scheduler) { +TEST(SparseMdpPcaaMultiObjectiveModelCheckerTest, scheduler) { std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_scheduler05.nm"; std::string formulasAsString = "multi(R{\"time\"}<= 11.778[ F \"tasks_complete\" ], R{\"energy\"}<=1.45 [ F \"tasks_complete\" ]) "; @@ -86,11 +86,11 @@ TEST(SparseMdpPcaaModelCheckerTest, scheduler) { std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); uint_fast64_t const initState = *mdp->getInitialStates().begin(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]); } -TEST(SparseMdpPcaaModelCheckerTest, dpm) { +TEST(SparseMdpPcaaMultiObjectiveModelCheckerTest, dpm) { std::string programFile = STORM_TEST_RESOURCES_DIR "/mdp/multiobj_dpm100.nm"; std::string formulasAsString = "multi(R{\"power\"}min=? [ C<=100 ], R{\"queue\"}<=70 [ C<=100 ])"; // numerical @@ -102,7 +102,7 @@ TEST(SparseMdpPcaaModelCheckerTest, dpm) { std::shared_ptr> mdp = storm::buildSparseModel(program, formulas)->as>(); uint_fast64_t const initState = *mdp->getInitialStates().begin(); - std::unique_ptr result = storm::modelchecker::multiobjective::performPcaa(*mdp, formulas[0]->asMultiObjectiveFormula()); + std::unique_ptr result = storm::modelchecker::multiobjective::performMultiObjectiveModelChecking(*mdp, formulas[0]->asMultiObjectiveFormula(), storm::modelchecker::multiobjective::MultiObjectiveMethodSelection::Pcaa); ASSERT_TRUE(result->isExplicitQuantitativeCheckResult()); EXPECT_NEAR(121.6128842, result->asExplicitQuantitativeCheckResult()[initState], storm::settings::getModule().getPrecision()); }