#include "src/modelchecker/multiobjective/pcaa.h" #include "src/utility/macros.h" #include "src/models/sparse/Mdp.h" #include "src/models/sparse/MarkovAutomaton.h" #include "src/models/sparse/StandardRewardModel.h" #include "src/modelchecker/multiobjective/pcaa/SparsePcaaPreprocessor.h" #include "src/modelchecker/multiobjective/pcaa/SparsePcaaAchievabilityQuery.h" #include "src/modelchecker/multiobjective/pcaa/SparsePcaaQuantitativeQuery.h" #include "src/modelchecker/multiobjective/pcaa/SparsePcaaParetoQuery.h" #include "src/settings//SettingsManager.h" #include "src/settings/modules/MultiObjectiveSettings.h" #include "src/exceptions/InvalidArgumentException.h" namespace storm { namespace modelchecker { namespace multiobjective { template std::unique_ptr performPcaa(SparseModelType const& model, storm::logic::MultiObjectiveFormula const& formula) { 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 = SparsePcaaPreprocessor::preprocess(model, formula); STORM_LOG_DEBUG("Preprocessing done. Result: " << preprocessorResult); std::unique_ptr> query; switch (preprocessorResult.queryType) { case SparsePcaaPreprocessorReturnType::QueryType::Achievability: query = std::unique_ptr> (new SparsePcaaAchievabilityQuery(preprocessorResult)); break; case SparsePcaaPreprocessorReturnType::QueryType::Quantitative: query = std::unique_ptr> (new SparsePcaaQuantitativeQuery(preprocessorResult)); break; case SparsePcaaPreprocessorReturnType::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(); if(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 } } }