diff --git a/src/modelchecker/csl/SparseCtmcCslModelChecker.cpp b/src/modelchecker/csl/SparseCtmcCslModelChecker.cpp index f376e19e7..5e29689bf 100644 --- a/src/modelchecker/csl/SparseCtmcCslModelChecker.cpp +++ b/src/modelchecker/csl/SparseCtmcCslModelChecker.cpp @@ -127,6 +127,8 @@ namespace storm { // Explicitly instantiate the model checker. template class SparseCtmcCslModelChecker>; + template class SparseCtmcCslModelChecker>; + template class SparseCtmcCslModelChecker>; } // namespace modelchecker } // namespace storm diff --git a/src/utility/NumberTraits.h b/src/utility/NumberTraits.h new file mode 100644 index 000000000..bc39948ee --- /dev/null +++ b/src/utility/NumberTraits.h @@ -0,0 +1,13 @@ +#pragma once + +namespace storm { + template + struct NumberTraits { + static const bool SupportsExponential = false; + }; + + template<> + struct NumberTraits { + static const bool SupportsExponential = true; + }; +} diff --git a/src/utility/storm.h b/src/utility/storm.h index aee9bca9e..0696f5a82 100644 --- a/src/utility/storm.h +++ b/src/utility/storm.h @@ -262,26 +262,45 @@ namespace storm { } template - std::unique_ptr verifySparseModel(std::shared_ptr> model, std::shared_ptr const& formula, bool onlyInitialStatesRelevant = false) { + std::unique_ptr verifySparseDtmc(std::shared_ptr> dtmc, storm::modelchecker::CheckTask const& task) { std::unique_ptr result; - storm::modelchecker::CheckTask task(*formula, onlyInitialStatesRelevant); - if (model->getType() == storm::models::ModelType::Dtmc) { - std::shared_ptr> dtmc = model->template as>(); - if (storm::settings::getModule().getEquationSolver() == storm::solver::EquationSolverType::Elimination && storm::settings::getModule().isUseDedicatedModelCheckerSet()) { - storm::modelchecker::SparseDtmcEliminationModelChecker> modelchecker(*dtmc); - if (modelchecker.canHandle(task)) { - result = modelchecker.check(task); - } else { - STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << *formula << " is not supported by the dedicated elimination model checker."); - } + if (storm::settings::getModule().getEquationSolver() == storm::solver::EquationSolverType::Elimination && storm::settings::getModule().isUseDedicatedModelCheckerSet()) { + storm::modelchecker::SparseDtmcEliminationModelChecker> modelchecker(*dtmc); + if (modelchecker.canHandle(task)) { + result = modelchecker.check(task); } else { - storm::modelchecker::SparseDtmcPrctlModelChecker> modelchecker(*dtmc); - if (modelchecker.canHandle(task)) { - result = modelchecker.check(task); - } else { - STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << *formula << " is not supported."); - } + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << task.getFormula() << " is not supported by the dedicated elimination model checker."); + } + } else { + storm::modelchecker::SparseDtmcPrctlModelChecker> modelchecker(*dtmc); + if (modelchecker.canHandle(task)) { + result = modelchecker.check(task); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << task.getFormula() << " is not supported."); } + } + return result; + } + + template + std::unique_ptr verifySparseCtmc(std::shared_ptr> ctmc, storm::modelchecker::CheckTask const& task) { + std::unique_ptr result; + storm::modelchecker::SparseCtmcCslModelChecker> modelchecker(*ctmc); + if (modelchecker.canHandle(task)) { + result = modelchecker.check(task); + } else { + STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << task.getFormula() << " is not supported."); + } + return result; + } + + template + std::unique_ptr verifySparseModel(std::shared_ptr> model, std::shared_ptr const& formula, bool onlyInitialStatesRelevant = false) { + storm::modelchecker::CheckTask task(*formula, onlyInitialStatesRelevant); + + std::unique_ptr result; + if (model->getType() == storm::models::ModelType::Dtmc) { + result = verifySparseDtmc(model->template as>(), task); } else if (model->getType() == storm::models::ModelType::Mdp) { std::shared_ptr> mdp = model->template as>(); #ifdef STORM_HAVE_CUDA @@ -297,10 +316,7 @@ namespace storm { result = modelchecker.check(task); #endif } else if (model->getType() == storm::models::ModelType::Ctmc) { - std::shared_ptr> ctmc = model->template as>(); - - storm::modelchecker::SparseCtmcCslModelChecker> modelchecker(*ctmc); - result = modelchecker.check(task); + result = verifySparseCtmc(model->template as>(), task); } else if (model->getType() == storm::models::ModelType::MarkovAutomaton) { std::shared_ptr> ma = model->template as>(); // Close the MA, if it is not already closed. @@ -322,23 +338,9 @@ namespace storm { std::unique_ptr result; if (model->getType() == storm::models::ModelType::Dtmc) { - std::shared_ptr> dtmc = model->template as>(); - - if (storm::settings::getModule().getEquationSolver() == storm::solver::EquationSolverType::Elimination && storm::settings::getModule().isUseDedicatedModelCheckerSet()) { - storm::modelchecker::SparseDtmcEliminationModelChecker> modelchecker(*dtmc); - if (modelchecker.canHandle(task)) { - result = modelchecker.check(task); - } else { - STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << *formula << " is not supported by the dedicated elimination model checker."); - } - } else { - storm::modelchecker::SparseDtmcPrctlModelChecker> modelchecker(*dtmc); - if (modelchecker.canHandle(task)) { - result = modelchecker.check(task); - } else { - STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << *formula << " is not supported."); - } - } + result = verifySparseDtmc(model->template as>(), task); + } else if (model->getType() == storm::models::ModelType::Ctmc) { + result = verifySparseCtmc(model->template as>(), task); } else { STORM_LOG_ASSERT(false, "Illegal model type."); } @@ -368,23 +370,7 @@ namespace storm { std::unique_ptr result; if (model->getType() == storm::models::ModelType::Dtmc) { - std::shared_ptr> dtmc = model->template as>(); - - if (storm::settings::getModule().getEquationSolver() == storm::solver::EquationSolverType::Elimination && storm::settings::getModule().isUseDedicatedModelCheckerSet()) { - storm::modelchecker::SparseDtmcEliminationModelChecker> modelchecker(*dtmc); - if (modelchecker.canHandle(task)) { - result = modelchecker.check(task); - } else { - STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << *formula << " is not supported by the dedicated elimination model checker."); - } - } else { - storm::modelchecker::SparseDtmcPrctlModelChecker> modelchecker(*dtmc); - if (modelchecker.canHandle(task)) { - result = modelchecker.check(task); - } else { - STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The property " << *formula << " is not supported."); - } - } + result = verifySparseDtmc(model->template as>(), task); } else if (model->getType() == storm::models::ModelType::Mdp) { std::shared_ptr> mdp = model->template as>(); STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "The parametric engine currently does not support MDPs.");