From 1f7f72ef36112dafffbc3f4effb0d3e06b9c4694 Mon Sep 17 00:00:00 2001 From: sjunges Date: Tue, 19 Jan 2016 22:21:12 +0100 Subject: [PATCH] added some convenience functions for handling shared pointers and derived classes, next big-step(tm) towards stormpy Former-commit-id: a48f69e65c8537962f818f6a47c76925c7c15e18 --- src/python/storm-core.cpp | 97 ++++++++++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 16 deletions(-) diff --git a/src/python/storm-core.cpp b/src/python/storm-core.cpp index 30d9a8615..4945fc272 100644 --- a/src/python/storm-core.cpp +++ b/src/python/storm-core.cpp @@ -3,6 +3,7 @@ #include "../utility/storm.h" #include "../logic/Formulas.h" +#include namespace boost { template T* get_pointer(std::shared_ptr p) { return p.get(); } @@ -49,14 +50,21 @@ namespace boost { namespace python { namespace converter { }}} // namespace boost::python::converter + template -void shared_ptr_implicitely_convertible() { +void shared_ptr_implicitly_convertible() { boost::python::implicitly_convertible, std::shared_ptr>(); -}; +} + + +template +void register_shared_ptr() { + boost::python::register_ptr_to_python>(); +} + std::shared_ptr buildModel(storm::prism::Program const& program, std::shared_ptr const& formula) { - storm::settings::SettingsManager::manager().setFromString(""); return storm::buildSymbolicModel(program, std::vector>(1,formula)).model; } @@ -64,10 +72,57 @@ void printResult(std::shared_ptr result) { result->writeToStream(std::cout); } +void setupStormLib(std::string const& args) { + storm::utility::setUp(); + storm::settings::SettingsManager::manager().setFromString(args); +} + +// primary class template +template +struct ImplConversionSharedPtr +{ + void c() { shared_ptr_implicitly_convertible(); } +}; + +// specialized class template +template +struct ImplConversionSharedPtr::value>::type> +{ + void c() { } +}; + +template +struct bases_holder { + typedef boost::python::bases Type; +}; + +template<> +struct bases_holder { + typedef boost::python::bases<> Type; +}; + + +template +boost::python::class_, typename bases_holder::Type, NC> defineClass(char const* name, char const* docstring, typename std::enable_if_t::value>::type* = 0) { + auto inst = boost::python::class_, typename bases_holder::Type, NC>(name, docstring); + register_shared_ptr(); + ImplConversionSharedPtr().c(); + return inst; +}; + +template +boost::python::class_, typename bases_holder::Type, NC> defineClass(char const* name, char const* docstring) { + auto inst = boost::python::class_, typename bases_holder::Type, NC>(name, docstring, boost::python::no_init); + register_shared_ptr(); + ImplConversionSharedPtr().c(); + return inst; +}; + + BOOST_PYTHON_MODULE(_core) { using namespace boost::python; - def("setUp", storm::utility::setUp); + def("setUp", setupStormLib); //////////////////////////////////////////// // Formula @@ -86,7 +141,8 @@ BOOST_PYTHON_MODULE(_core) // Program //////////////////////////////////////////// - class_("Program") + defineClass("Program", "") + //class_("Program") .add_property("nr_modules", &storm::prism::Program::getNumberOfModules) ; @@ -112,28 +168,37 @@ BOOST_PYTHON_MODULE(_core) .value("ma", storm::models::ModelType::MarkovAutomaton) ; - class_, boost::noncopyable>("ModelBase", no_init) - .add_property("nr_states", &storm::models::ModelBase::getNumberOfStates) + defineClass("ModelBase", "") + .add_property("nr_states", &storm::models::ModelBase::getNumberOfStates) .add_property("nr_transitions", &storm::models::ModelBase::getNumberOfTransitions) .add_property("model_type", &storm::models::ModelBase::getType) .def("asPdtmc", &storm::models::ModelBase::as>) + .def("asPmdp", &storm::models::ModelBase::as>) ; - register_ptr_to_python>(); - class_, std::shared_ptr >, boost::noncopyable, bases>("SparseParametricModel", no_init); - register_ptr_to_python>>(); + + defineClass, storm::models::ModelBase, boost::noncopyable>("SparseParametricModel", ""); + //class_, std::shared_ptr >, boost::noncopyable, bases>("SparseParametricModel", no_init); + //register_shared_ptr>(); + //shared_ptr_implicitly_convertible, storm::models::ModelBase>(); + class_, std::shared_ptr>, boost::noncopyable, bases>("SparseModel", no_init); - register_ptr_to_python>>(); - class_, std::shared_ptr>, boost::noncopyable, bases>>("SparseParametricMc", no_init); - register_ptr_to_python>>(); + register_shared_ptr>(); + shared_ptr_implicitly_convertible, storm::models::sparse::Model>(); + + defineClass, storm::models::sparse::Model>("SparseParametricMc", ""); + //class_, std::shared_ptr>, boost::noncopyable, bases>>("SparseParametricMc", no_init); + //register_shared_ptr>(); + //shared_ptr_implicitly_convertible, storm::models::sparse::Model>(); + + class_, std::shared_ptr>, boost::noncopyable, bases>>("SparseParametricMdp", no_init); + register_shared_ptr>(); -// implicitly_convertible>, std::shared_ptr>>(); - shared_ptr_implicitely_convertible, storm::models::sparse::Model>(); def("parse_formulae", storm::parseFormulasForProgram); def("parse_program", storm::parseProgram); - def("build_model", buildModel); + def("build_model", buildModel, return_value_policy()); def("buildodelFromPrismProgram", storm::buildSymbolicModel); def("buildParametricModelFromPrismProgram", storm::buildSymbolicModel);