diff --git a/stormpy/setup.py b/stormpy/setup.py index 66d49a81d..a15acca1a 100755 --- a/stormpy/setup.py +++ b/stormpy/setup.py @@ -90,7 +90,7 @@ ext_logic = Extension( extra_link_args=extra_link_args ) -ext_logic = Extension( +ext_storage = Extension( name='storage.storage', sources=['src/mod_storage.cpp'] + storage_sources, include_dirs=include_dirs, @@ -154,7 +154,7 @@ setup(name="stormpy", packages=['stormpy', 'stormpy.info', 'stormpy.expressions', 'stormpy.logic'], package_dir={'':'lib'}, ext_package='stormpy', - ext_modules=[ext_core, ext_info, ext_expressions, ext_logic + ext_modules=[ext_core, ext_info, ext_expressions, ext_logic, ext_storage ], cmdclass={ 'build_ext': stormpy_build_ext, diff --git a/stormpy/src/core/core.cpp b/stormpy/src/core/core.cpp index f650151c0..efbf508de 100644 --- a/stormpy/src/core/core.cpp +++ b/stormpy/src/core/core.cpp @@ -1,9 +1,8 @@ #include "core.h" void define_core(py::module& m) { - // Init - m.def("set_up", [] (std::string const& args) { + m.def("set_up", [](std::string const& args) { storm::utility::setUp(); storm::settings::SettingsManager::manager().setFromString(args); }, "Initialize Storm", py::arg("arguments")); @@ -16,8 +15,12 @@ void define_parse(py::module& m) { // Pair <Model,Formulas> py::class_<storm::storage::ModelFormulasPair>(m, "ModelFormulasPair", "Pair of model and formulas") - .def_readwrite("model", &storm::storage::ModelFormulasPair::model, "The model") - .def_readwrite("formulas", &storm::storage::ModelFormulasPair::formulas, "The formulas") + .def("model", [](storm::storage::ModelFormulasPair const& pair) { + return pair.model; + }, "The model") + .def("formulas", [](storm::storage::ModelFormulasPair const& pair) { + return pair.formulas; + }, "The formulas") ; // Parse explicit models @@ -31,7 +34,6 @@ std::shared_ptr<storm::models::ModelBase> buildModel(storm::prism::Program const } void define_build(py::module& m) { - // Build model m.def("_build_model", &buildModel<double>, "Build the model", py::arg("program"), py::arg("formula")); m.def("_build_parametric_model", &buildModel<storm::RationalFunction>, "Build the parametric model", py::arg("program"), py::arg("formula")); diff --git a/stormpy/src/core/modelchecking.cpp b/stormpy/src/core/modelchecking.cpp index 3e9b7756b..dc1a7d08f 100644 --- a/stormpy/src/core/modelchecking.cpp +++ b/stormpy/src/core/modelchecking.cpp @@ -7,6 +7,18 @@ class PmcResult { std::unordered_set<storm::ArithConstraint<storm::RationalFunction>> constraintsWellFormed; std::unordered_set<storm::ArithConstraint<storm::RationalFunction>> constraintsGraphPreserving; + storm::RationalFunction getResultFunction() const { + return resultFunction; + } + + std::unordered_set<storm::ArithConstraint<storm::RationalFunction>> getConstraintsWellFormed() const { + return constraintsWellFormed; + } + + std::unordered_set<storm::ArithConstraint<storm::RationalFunction>> getConstraintsGraphPreserving() const { + return constraintsGraphPreserving; + } + std::string toString() { std::stringstream stream; stream << resultFunction << std::endl; @@ -49,9 +61,9 @@ void define_modelchecking(py::module& m) { // PmcResult py::class_<PmcResult, std::shared_ptr<PmcResult>>(m, "PmcResult", "Holds the results after parametric model checking") .def("__str__", &PmcResult::toString) - .def_readonly("result_function", &PmcResult::resultFunction, "Result as rational function") - .def_readonly("constraints_well_formed", &PmcResult::constraintsWellFormed, "Constraints ensuring well-formed probabilities") - .def_readonly("constraints_graph_preserving", &PmcResult::constraintsGraphPreserving, "Constraints ensuring graph preservation") + .def("result_function", &PmcResult::getResultFunction, "Result as rational function") + .def("constraints_well_formed", &PmcResult::getConstraintsWellFormed, "Constraints ensuring well-formed probabilities") + .def("constraints_graph_preserving", &PmcResult::getConstraintsGraphPreserving, "Constraints ensuring graph preservation") ; } diff --git a/stormpy/src/mod_storage.cpp b/stormpy/src/mod_storage.cpp index 835f1e7b2..436caa96d 100644 --- a/stormpy/src/mod_storage.cpp +++ b/stormpy/src/mod_storage.cpp @@ -4,7 +4,7 @@ #include "storage/matrix.h" PYBIND11_PLUGIN(storage) { - py::module m("storage"); + py::module m("stormpy.storage"); define_model(m); define_sparse_matrix(m); return m.ptr(); diff --git a/stormpy/src/storage/matrix.cpp b/stormpy/src/storage/matrix.cpp index 1424ff792..6db2de7c3 100644 --- a/stormpy/src/storage/matrix.cpp +++ b/stormpy/src/storage/matrix.cpp @@ -12,12 +12,13 @@ void define_sparse_matrix(py::module& m) { stream << entry; return stream.str(); }) - .def_property("val", &storm::storage::MatrixEntry<entry_index, double>::getValue, &storm::storage::MatrixEntry<entry_index, double>::setValue, "Value") - .def_property_readonly("column", &storm::storage::MatrixEntry<entry_index, double>::getColumn, "Column") + //def_property threw "pointer being freed not allocated" after exiting + .def("val", &storm::storage::MatrixEntry<entry_index, double>::getValue, "Value") + .def("set_val", &storm::storage::MatrixEntry<entry_index, double>::setValue, "Set value") + .def("column", &storm::storage::MatrixEntry<entry_index, double>::getColumn, "Column") ; py::class_<storm::storage::SparseMatrix<double>>(m, "SparseMatrix", "Sparse matrix") - //.def("__str__", &storm::logic::Formula::toString) .def("__iter__", [](storm::storage::SparseMatrix<double> const& matrix) { return py::make_iterator(matrix.begin(), matrix.end()); }, py::keep_alive<0, 1>() /* Essential: keep object alive while iterator exists */) diff --git a/stormpy/src/storage/model.cpp b/stormpy/src/storage/model.cpp index 6445973b2..64c247805 100644 --- a/stormpy/src/storage/model.cpp +++ b/stormpy/src/storage/model.cpp @@ -16,6 +16,7 @@ std::vector<storm::storage::sparse::state_type> getInitialStates(storm::models:: return initialStates; } +// Thin wrapper for getting transition matrix storm::storage::SparseMatrix<double> getTransitionMatrix(storm::models::sparse::Model<double> const& model) { return model.getTransitionMatrix(); } diff --git a/stormpy/tests/core/test_bisimulation.py b/stormpy/tests/core/test_bisimulation.py index 5b46533f3..072f6cd07 100644 --- a/stormpy/tests/core/test_bisimulation.py +++ b/stormpy/tests/core/test_bisimulation.py @@ -9,7 +9,7 @@ class TestBisimulation: prop = "P=? [F \"observe0Greater1\"]" formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_model_from_prism_program(program, formulas) - model = pair.model + model = pair.model() assert model.nr_states() == 7403 assert model.nr_transitions() == 13041 assert model.model_type() == stormpy.ModelType.DTMC @@ -28,7 +28,7 @@ class TestBisimulation: prop = "P=? [F \"observe0Greater1\"]" formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_parametric_model_from_prism_program(program, formulas) - model = pair.model + model = pair.model() assert model.nr_states() == 1367 assert model.nr_transitions() == 2027 assert model.model_type() == stormpy.ModelType.DTMC diff --git a/stormpy/tests/core/test_modelchecking.py b/stormpy/tests/core/test_modelchecking.py index a275bc382..2a8e54b84 100644 --- a/stormpy/tests/core/test_modelchecking.py +++ b/stormpy/tests/core/test_modelchecking.py @@ -18,18 +18,18 @@ class TestModelChecking: prop = "P=? [F \"target\"]" formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_parametric_model_from_prism_program(program, formulas) - model = pair.model + model = pair.model() assert model.nr_states() == 613 assert model.nr_transitions() == 803 assert model.model_type() == stormpy.ModelType.DTMC assert model.has_parameters() result = stormpy.model_checking(model, formulas[0]) - func = result.result_function + func = result.result_function() one = pycarl.FactorizedPolynomial(pycarl.Rational(1)) assert func.denominator == one - constraints_well_formed = result.constraints_well_formed + constraints_well_formed = result.constraints_well_formed() for constraint in constraints_well_formed: assert constraint.rel() == pycarl.formula.Relation.GEQ or constraint.rel() == pycarl.formula.Relation.LEQ - constraints_graph_preserving = result.constraints_graph_preserving + constraints_graph_preserving = result.constraints_graph_preserving() for constraint in constraints_graph_preserving: assert constraint.rel() == pycarl.formula.Relation.GREATER diff --git a/stormpy/tests/logic/test_formulas.py b/stormpy/tests/logic/test_formulas.py index 7600f5a6f..57b27b626 100644 --- a/stormpy/tests/logic/test_formulas.py +++ b/stormpy/tests/logic/test_formulas.py @@ -1,5 +1,5 @@ import stormpy -from stormpy.logic import logic +import stormpy.logic class TestFormulas: @@ -7,7 +7,7 @@ class TestFormulas: prop = "P=? [F \"one\"]" formulas = stormpy.parse_formulas(prop) formula = formulas[0] - assert type(formula) == logic.ProbabilityOperator + assert type(formula) == stormpy.logic.ProbabilityOperator assert len(formulas) == 1 assert str(formula) == prop @@ -15,7 +15,7 @@ class TestFormulas: prop = "R=? [F \"one\"]" formulas = stormpy.parse_formulas(prop) formula = formulas[0] - assert type(formula) == logic.RewardOperator + assert type(formula) == stormpy.logic.RewardOperator assert len(formulas) == 1 assert str(formula) == "R[exp]=? [F \"one\"]" @@ -38,13 +38,13 @@ class TestFormulas: formula = stormpy.parse_formulas(prop)[0] assert formula.has_bound() assert formula.threshold == 0.4 - assert formula.comparison_type == logic.ComparisonType.LESS + assert formula.comparison_type == stormpy.logic.ComparisonType.LESS def test_set_bounds(self): prop = "P<0.4 [F \"one\"]" formula = stormpy.parse_formulas(prop)[0] formula.threshold = 0.2 - formula.comparison_type = logic.ComparisonType.GEQ + formula.comparison_type = stormpy.logic.ComparisonType.GEQ assert formula.threshold == 0.2 - assert formula.comparison_type == logic.ComparisonType.GEQ + assert formula.comparison_type == stormpy.logic.ComparisonType.GEQ assert str(formula) == "P>=0.2 [F \"one\"]" diff --git a/stormpy/tests/storage/test_matrix.py b/stormpy/tests/storage/test_matrix.py index becf477a4..cde736f03 100644 --- a/stormpy/tests/storage/test_matrix.py +++ b/stormpy/tests/storage/test_matrix.py @@ -9,18 +9,18 @@ class TestMatrix: assert matrix.nr_columns() == model.nr_states() assert matrix.nr_entries() == 27 #model.nr_transitions() for e in matrix: - assert e.val == 0.5 or e.val == 0 or (e.val == 1 and e.column > 6) + assert e.val() == 0.5 or e.val() == 0 or (e.val() == 1 and e.column() > 6) def test_change_sparse_matrix(self): model = stormpy.parse_explicit_model("../examples/dtmc/die/die.tra", "../examples/dtmc/die/die.lab") matrix = model.transition_matrix() for e in matrix: - assert e.val == 0.5 or e.val == 0 or e.val == 1 + assert e.val() == 0.5 or e.val() == 0 or e.val() == 1 i = 0 for e in matrix: - e.val = i + e.set_val(i) i += 0.1 i = 0 for e in matrix: - assert e.val == i + assert e.val() == i i += 0.1 diff --git a/stormpy/tests/storage/test_model.py b/stormpy/tests/storage/test_model.py index 1e54378cb..94abdad61 100644 --- a/stormpy/tests/storage/test_model.py +++ b/stormpy/tests/storage/test_model.py @@ -7,7 +7,7 @@ class TestModel: prop = "P=? [F \"one\"]" formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_model_from_prism_program(program, formulas) - model = pair.model + model = pair.model() assert model.nr_states() == 13 assert model.nr_transitions() == 20 assert model.model_type() == stormpy.ModelType.DTMC @@ -22,7 +22,7 @@ class TestModel: prop = "P=? [F \"target\"]" formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_parametric_model_from_prism_program(program, formulas) - model = pair.model + model = pair.model() assert model.nr_states() == 613 assert model.nr_transitions() == 803 assert model.model_type() == stormpy.ModelType.DTMC