#pragma once #include "storm/transformer/ContinuousToDiscreteTimeModelTransformer.h" #include "storm/transformer/SymbolicToSparseTransformer.h" #include "storm/utility/macros.h" #include "storm/exceptions/InvalidOperationException.h" #include "storm/exceptions/NotSupportedException.h" namespace storm { namespace api { /*! * Transforms the given continuous model to a discrete time model. * If such a transformation does not preserve one of the given formulas, an error is issued. */ template std::shared_ptr> transformContinuousToDiscreteTimeSparseModel(std::shared_ptr> const& model, std::vector> const& formulas) { storm::transformer::ContinuousToDiscreteTimeModelTransformer transformer; for (auto const& formula : formulas) { STORM_LOG_THROW(transformer.preservesFormula(*formula), storm::exceptions::InvalidOperationException, "Transformation to discrete time model does not preserve formula " << *formula << "."); } if (model->isOfType(storm::models::ModelType::Ctmc)) { return transformer.transform(*model->template as>()); } else if (model->isOfType(storm::models::ModelType::MarkovAutomaton)) { return transformer.transform(*model->template as>()); } else { STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Transformation of a " << model->getType() << " to a discrete time model is not supported"); } return nullptr; } /*! * Transforms the given continuous model to a discrete time model IN PLACE. * This means that the input continuous time model is replaced by the new discrete time model. * If such a transformation does not preserve one of the given formulas, an error is issued. */ template std::shared_ptr> transformContinuousToDiscreteTimeSparseModel(storm::models::sparse::Model&& model, std::vector> const& formulas) { storm::transformer::ContinuousToDiscreteTimeModelTransformer transformer; for (auto const& formula : formulas) { STORM_LOG_THROW(transformer.preservesFormula(*formula), storm::exceptions::InvalidOperationException, "Transformation to discrete time model does not preserve formula " << *formula << "."); } if (model.isOfType(storm::models::ModelType::Ctmc)) { return transformer.transform(std::move(*model.template as>())); } else if (model.isOfType(storm::models::ModelType::MarkovAutomaton)) { return transformer.transform(std::move(*model.template as>())); } else { STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Transformation of a " << model.getType() << " to a discrete time model is not supported."); } return nullptr; } /*! * Transforms the given symbolic model to a sparse model. */ template std::shared_ptr> transformSymbolicToSparseModel(std::shared_ptr> const& symbolicModel) { switch (symbolicModel->getType()) { case storm::models::ModelType::Dtmc: return storm::transformer::SymbolicDtmcToSparseDtmcTransformer().translate(*symbolicModel->template as>()); case storm::models::ModelType::Mdp: return storm::transformer::SymbolicMdpToSparseMdpTransformer::translate(*symbolicModel->template as>()); case storm::models::ModelType::Ctmc: return storm::transformer::SymbolicCtmcToSparseCtmcTransformer::translate(*symbolicModel->template as>()); default: STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Transformation of symbolic " << symbolicModel->getType() << " to sparse model is not supported."); } return nullptr; } } }