diff --git a/stormpy/src/core/core.cpp b/stormpy/src/core/core.cpp index a3cf262d9..3a57be8a6 100644 --- a/stormpy/src/core/core.cpp +++ b/stormpy/src/core/core.cpp @@ -7,14 +7,19 @@ void define_core(py::module& m) { storm::utility::setUp(); storm::settings::SettingsManager::manager().setFromString(args); }, "Initialize Storm", py::arg("arguments")); +} +void define_parse(py::module& m) { // Parse formulas m.def("parse_formulas", &storm::parseFormulasForExplicit, "Parse explicit formulas", py::arg("formula_string")); - m.def("parse_formulas_for_program", &storm::parseFormulasForProgram, "Parse formulas for program", py::arg("formula_string"), py::arg("program")); + m.def("parse_formulas_for_prism_program", &storm::parseFormulasForProgram, "Parse formulas for prism program", py::arg("formula_string"), py::arg("prism_program")); // 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") ; + + // Parse explicit models + m.def("parse_explicit_model", &storm::parser::AutoParser<>::parseModel, "Parse explicit model", py::arg("transition_file"), py::arg("labeling_file"), py::arg("state_reward_file") = "", py::arg("transition_reward_file") = "", py::arg("choice_labeling_file") = ""); } diff --git a/stormpy/src/core/core.h b/stormpy/src/core/core.h index f750d7c74..f163b6b45 100644 --- a/stormpy/src/core/core.h +++ b/stormpy/src/core/core.h @@ -4,5 +4,6 @@ #include "common.h" void define_core(py::module& m); +void define_parse(py::module& m); #endif /* PYTHON_CORE_CORE_H_ */ diff --git a/stormpy/src/core/prism.cpp b/stormpy/src/core/prism.cpp index 2cc88f370..20fa654a6 100644 --- a/stormpy/src/core/prism.cpp +++ b/stormpy/src/core/prism.cpp @@ -4,7 +4,7 @@ void define_prism(py::module& m) { // Parse prism program - m.def("parse_program", &storm::parseProgram, "Parse program", py::arg("path")); + m.def("parse_prism_program", &storm::parseProgram, "Parse prism program", py::arg("path")); // PrismType py::enum_<storm::prism::Program::ModelType>(m, "PrismModelType", "Type of the prism model") @@ -17,7 +17,7 @@ void define_prism(py::module& m) { ; // PrismProgram - py::class_<storm::prism::Program>(m, "Program", "Prism program") + py::class_<storm::prism::Program>(m, "PrismProgram", "Prism program") .def("nr_modules", &storm::prism::Program::getNumberOfModules, "Get number of modules") .def("model_type", &storm::prism::Program::getModelType, "Get model type") .def("has_undefined_constants", &storm::prism::Program::hasUndefinedConstants, "Check if program has undefined constants") diff --git a/stormpy/src/mod_core.cpp b/stormpy/src/mod_core.cpp index c86da7fba..843a607f9 100644 --- a/stormpy/src/mod_core.cpp +++ b/stormpy/src/mod_core.cpp @@ -9,6 +9,7 @@ PYBIND11_PLUGIN(core) { py::module m("core"); define_core(m); + define_parse(m); define_model(m); define_modelchecking(m); define_bisimulation(m); diff --git a/stormpy/tests/core/test_bisimulation.py b/stormpy/tests/core/test_bisimulation.py index 5d74a2953..5b46533f3 100644 --- a/stormpy/tests/core/test_bisimulation.py +++ b/stormpy/tests/core/test_bisimulation.py @@ -3,11 +3,11 @@ import stormpy.logic class TestBisimulation: def test_bisimulation(self): - program = stormpy.parse_program("../examples/dtmc/crowds/crowds5_5.pm") + program = stormpy.parse_prism_program("../examples/dtmc/crowds/crowds5_5.pm") assert program.nr_modules() == 1 assert program.model_type() == stormpy.PrismModelType.DTMC prop = "P=? [F \"observe0Greater1\"]" - formulas = stormpy.parse_formulas_for_program(prop, program) + formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_model_from_prism_program(program, formulas) model = pair.model assert model.nr_states() == 7403 @@ -21,12 +21,12 @@ class TestBisimulation: assert not model_bisim.supports_parameters() def test_parametric_bisimulation(self): - program = stormpy.parse_program("../examples/pdtmc/crowds/crowds_3-5.pm") + program = stormpy.parse_prism_program("../examples/pdtmc/crowds/crowds_3-5.pm") assert program.nr_modules() == 1 assert program.model_type() == stormpy.PrismModelType.DTMC assert program.has_undefined_constants() prop = "P=? [F \"observe0Greater1\"]" - formulas = stormpy.parse_formulas_for_program(prop, program) + formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_parametric_model_from_prism_program(program, formulas) model = pair.model assert model.nr_states() == 1367 diff --git a/stormpy/tests/core/test_model.py b/stormpy/tests/core/test_model.py index 8958080b7..1ab438ef6 100644 --- a/stormpy/tests/core/test_model.py +++ b/stormpy/tests/core/test_model.py @@ -4,9 +4,9 @@ import stormpy.logic class TestModel: def test_build_dtmc_from_prism_program(self): stormpy.set_up("") - program = stormpy.parse_program("../examples/dtmc/die/die.pm") + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") prop = "P=? [F \"one\"]" - formulas = stormpy.parse_formulas_for_program(prop, program) + formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_model_from_prism_program(program, formulas) model = pair.model assert model.nr_states() == 13 @@ -16,12 +16,12 @@ class TestModel: assert type(model) is stormpy.SparseDtmc def test_build_parametric_dtmc_from_prism_program(self): - program = stormpy.parse_program("../examples/pdtmc/brp/brp_16_2.pm") + program = stormpy.parse_prism_program("../examples/pdtmc/brp/brp_16_2.pm") assert program.nr_modules() == 5 assert program.model_type() == stormpy.PrismModelType.DTMC assert program.has_undefined_constants() prop = "P=? [F \"target\"]" - formulas = stormpy.parse_formulas_for_program(prop, program) + formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_parametric_model_from_prism_program(program, formulas) model = pair.model assert model.nr_states() == 613 @@ -32,8 +32,8 @@ class TestModel: assert type(model) is stormpy.SparseParametricDtmc def test_build_dtmc(self): - program = stormpy.parse_program("../examples/dtmc/die/die.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"one\" ]", program) + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"one\" ]", program) model = stormpy.build_model(program, formulas[0]) assert model.nr_states() == 13 assert model.nr_transitions() == 20 @@ -42,8 +42,8 @@ class TestModel: assert type(model) is stormpy.SparseDtmc def test_build_parametric_dtmc(self): - program = stormpy.parse_program("../examples/pdtmc/brp/brp_16_2.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"target\" ]", program) + program = stormpy.parse_prism_program("../examples/pdtmc/brp/brp_16_2.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"target\" ]", program) model = stormpy.build_parametric_model(program, formulas[0]) assert model.nr_states() == 613 assert model.nr_transitions() == 803 @@ -53,8 +53,8 @@ class TestModel: assert type(model) is stormpy.SparseParametricDtmc def test_build_dtmc_supporting_parameters(self): - program = stormpy.parse_program("../examples/dtmc/die/die.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"one\" ]", program) + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"one\" ]", program) model = stormpy.build_parametric_model(program, formulas[0]) assert model.nr_states() == 13 assert model.nr_transitions() == 20 @@ -64,8 +64,8 @@ class TestModel: assert type(model) is stormpy.SparseParametricDtmc def test_label(self): - program = stormpy.parse_program("../examples/dtmc/die/die.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"one\" ]", program) + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"one\" ]", program) model = stormpy.build_model(program, formulas[0]) labels = model.labels() assert len(labels) == 2 @@ -75,16 +75,16 @@ class TestModel: assert "one" in model.labels_state(7) def test_initial_states(self): - program = stormpy.parse_program("../examples/dtmc/die/die.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"one\" ]", program) + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"one\" ]", program) model = stormpy.build_model(program, formulas[0]) initial_states = model.initial_states() assert len(initial_states) == 1 assert 0 in initial_states def test_label_parametric(self): - program = stormpy.parse_program("../examples/pdtmc/brp/brp_16_2.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"target\" ]", program) + program = stormpy.parse_prism_program("../examples/pdtmc/brp/brp_16_2.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"target\" ]", program) model = stormpy.build_parametric_model(program, formulas[0]) labels = model.labels() assert len(labels) == 2 diff --git a/stormpy/tests/core/test_modelchecking.py b/stormpy/tests/core/test_modelchecking.py index 334d049cf..a275bc382 100644 --- a/stormpy/tests/core/test_modelchecking.py +++ b/stormpy/tests/core/test_modelchecking.py @@ -3,8 +3,8 @@ import stormpy.logic class TestModelChecking: def test_state_elimination(self): - program = stormpy.parse_program("../examples/dtmc/die/die.pm") - formulas = stormpy.parse_formulas_for_program("P=? [ F \"one\" ]", program) + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") + formulas = stormpy.parse_formulas_for_prism_program("P=? [ F \"one\" ]", program) model = stormpy.build_model(program, formulas[0]) assert model.nr_states() == 13 assert model.nr_transitions() == 20 @@ -14,9 +14,9 @@ class TestModelChecking: def test_parametric_state_elimination(self): import pycarl import pycarl.formula - program = stormpy.parse_program("../examples/pdtmc/brp/brp_16_2.pm") + program = stormpy.parse_prism_program("../examples/pdtmc/brp/brp_16_2.pm") prop = "P=? [F \"target\"]" - formulas = stormpy.parse_formulas_for_program(prop, program) + formulas = stormpy.parse_formulas_for_prism_program(prop, program) pair = stormpy.build_parametric_model_from_prism_program(program, formulas) model = pair.model assert model.nr_states() == 613 diff --git a/stormpy/tests/core/test_parse.py b/stormpy/tests/core/test_parse.py index 6335eb6c5..54fe7ef3a 100644 --- a/stormpy/tests/core/test_parse.py +++ b/stormpy/tests/core/test_parse.py @@ -2,8 +2,8 @@ import stormpy import stormpy.logic class TestParse: - def test_parse_program(self): - program = stormpy.parse_program("../examples/dtmc/die/die.pm") + def test_parse_prism_program(self): + program = stormpy.parse_prism_program("../examples/dtmc/die/die.pm") assert program.nr_modules() == 1 assert program.model_type() == stormpy.PrismModelType.DTMC assert not program.has_undefined_constants() @@ -13,3 +13,19 @@ class TestParse: formulas = stormpy.parse_formulas(prop) assert len(formulas) == 1 assert str(formulas[0]) == prop + + def test_parse_explicit_dtmc(self): + model = stormpy.parse_explicit_model("../examples/dtmc/die/die.tra", "../examples/dtmc/die/die.lab") + assert model.nr_states() == 13 + assert model.nr_transitions() == 20 + assert model.model_type() == stormpy.ModelType.DTMC + assert not model.supports_parameters() + assert type(model) is stormpy.SparseDtmc + + def test_parse_explicit_mdp(self): + model = stormpy.parse_explicit_model("../examples/mdp/two_dice/two_dice.tra", "../examples/mdp/two_dice/two_dice.lab") + assert model.nr_states() == 169 + assert model.nr_transitions() == 436 + assert model.model_type() == stormpy.ModelType.MDP + assert not model.supports_parameters() + assert type(model) is stormpy.SparseMdp