#include "model.h" // Thin wrapper for model building template std::shared_ptr buildModel(storm::prism::Program const& program, std::shared_ptr const& formula) { return storm::buildSymbolicModel(program, std::vector>(1,formula)).model; } // Thin wrapper for getting initial states template std::vector getInitialStates(storm::models::sparse::Model const& model) { std::vector initialStates; for (auto entry : model.getInitialStates()) { initialStates.push_back(entry); } return initialStates; } // Define python bindings void define_model(py::module& m) { // Build model m.def("_build_model", &buildModel, "Build the model", py::arg("program"), py::arg("formula")); m.def("_build_parametric_model", &buildModel, "Build the parametric model", py::arg("program"), py::arg("formula")); m.def("build_model_from_prism_program", &storm::buildSymbolicModel, "Build the model", py::arg("program"), py::arg("formulas")); m.def("build_parametric_model_from_prism_program", &storm::buildSymbolicModel, "Build the parametric model", py::arg("program"), py::arg("formulas")); // ModelType py::enum_(m, "ModelType", "Type of the model") .value("DTMC", storm::models::ModelType::Dtmc) .value("MDP", storm::models::ModelType::Mdp) .value("CTMC", storm::models::ModelType::Ctmc) .value("MA", storm::models::ModelType::MarkovAutomaton) ; // ModelBase py::class_>(m, "ModelBase", "Base class for all models") .def("nr_states", &storm::models::ModelBase::getNumberOfStates, "Get number of states") .def("nr_transitions", &storm::models::ModelBase::getNumberOfTransitions, "Get number of transitions") .def("model_type", &storm::models::ModelBase::getType, "Get model type") .def("supports_parameters", &storm::models::ModelBase::supportsParameters, "Check if model supports parameters") .def("has_parameters", &storm::models::ModelBase::hasParameters, "Check if model has parameters") .def("is_exact", &storm::models::ModelBase::isExact, "Check if model is exact") .def("as_dtmc", &storm::models::ModelBase::as>, "Get model as DTMC") .def("as_pdtmc", &storm::models::ModelBase::as>, "Get model as pDTMC") .def("as_mdp", &storm::models::ModelBase::as>, "Get model as MDP") .def("as_pmdp", &storm::models::ModelBase::as>, "Get model as pMDP") ; // Models py::class_, std::shared_ptr>>(m, "SparseModel", "A probabilistic model where transitions are represented by doubles and saved in a sparse matrix", py::base()) .def("labels", [](storm::models::sparse::Model const& model) { return model.getStateLabeling().getLabels(); }, "Get labels") .def("labels_state", &storm::models::sparse::Model::getLabelsOfState, "Get labels") .def("initial_states", &getInitialStates, "Get initial states") ; py::class_, std::shared_ptr>>(m, "SparseDtmc", "DTMC in sparse representation", py::base>()) ; py::class_, std::shared_ptr>>(m, "SparseMdp", "MDP in sparse representation", py::base>()) ; py::class_, std::shared_ptr>>(m, "SparseParametricModel", "A probabilistic model where transitions are represented by rational functions and saved in a sparse matrix", py::base()) .def("collect_probability_parameters", &storm::models::sparse::getProbabilityParameters, "Collect parameters") .def("labels", [](storm::models::sparse::Model const& model) { return model.getStateLabeling().getLabels(); }, "Get labels") .def("labels_state", &storm::models::sparse::Model::getLabelsOfState, "Get labels") .def("initial_states", &getInitialStates, "Get initial states") ; py::class_, std::shared_ptr>>(m, "SparseParametricDtmc", "pDTMC in sparse representation", py::base>()) ; py::class_, std::shared_ptr>>(m, "SparseParametricMdp", "pMDP in sparse representation", py::base>()) ; }