diff --git a/src/python/storm-core.cpp b/src/python/storm-core.cpp index b7ecebbd6..03dfcc4db 100644 --- a/src/python/storm-core.cpp +++ b/src/python/storm-core.cpp @@ -21,6 +21,32 @@ namespace boost { namespace python { namespace converter { return converter::registered const&>::converters.to_python(&x); } + /// @brief Adapter a non-member function that returns a unique_ptr to + /// a python function object that returns a raw pointer but + /// explicitly passes ownership to Python. + template + object adapt_unique(std::unique_ptr (*fn)(Args...)) + { + return make_function( + [fn](Args... args) { return fn(args...).release(); }, + return_value_policy(), + boost::mpl::vector() + ); + } + + /// @brief Adapter a member function that returns a unique_ptr to + /// a python function object that returns a raw pointer but + /// explicitly passes ownership to Python. + template + object adapt_unique(std::unique_ptr (C::*fn)(Args...)) + { + return make_function( + [fn](C& self, Args... args) { return (self.*fn)(args...).release(); }, + python::return_value_policy(), + boost::mpl::vector() + ); + } + }}} // namespace boost::python::converter @@ -30,6 +56,10 @@ std::shared_ptr buildModel(storm::prism::Program const return storm::buildSymbolicModel(program, std::vector>(1,formula)).model; } +void printResult(std::shared_ptr result) { + result->writeToStream(std::cout); +} + BOOST_PYTHON_MODULE(_core) { using namespace boost::python; @@ -60,7 +90,11 @@ BOOST_PYTHON_MODULE(_core) //////////////////////////////////////////// // Checkresult //////////////////////////////////////////// - class_, boost::noncopyable>("CheckResult", no_init); + class_, boost::noncopyable>("CheckResult", no_init) + ; + register_ptr_to_python>(); + + def("printResult", printResult); //////////////////////////////////////////// @@ -82,10 +116,11 @@ BOOST_PYTHON_MODULE(_core) ; class_, std::shared_ptr >, boost::noncopyable, bases>("SparseParametricModel", no_init); class_, std::shared_ptr>, boost::noncopyable, bases>("SparseModel", no_init); - class_, std::shared_ptr>, boost::noncopyable, bases>("SparseParamtricMc", no_init); + class_, std::shared_ptr>, boost::noncopyable, bases>>("SparseParametricMc", no_init); register_ptr_to_python>(); register_ptr_to_python>>(); + implicitly_convertible>, std::shared_ptr>>(); register_ptr_to_python>>(); def("parseFormulae", storm::parseFormulasForProgram); @@ -105,5 +140,5 @@ BOOST_PYTHON_MODULE(_core) ; - def("performStateElimination", storm::verifySparseModel); + def("performStateElimination", boost::python::converter::adapt_unique(storm::verifySparseModel)); }