#include "dft.h" #include "src/helpers.h" #include "storm-dft/storage/dft/DFT.h" #include "storm/settings/SettingsManager.h" #include "storm-dft/settings/modules/FaultTreeSettings.h" #include "storm-dft/settings/modules/DftIOSettings.h" #include "storm-dft/storage/dft/DFTIsomorphism.h" template using DFT = storm::storage::DFT; template using DFTElement = storm::storage::DFTElement; using DFTSymmetries = storm::storage::DFTIndependentSymmetries; void define_dft(py::module& m) { m.def("_set_up", []() { storm::settings::addModule(); storm::settings::addModule(); }, "Initialize Storm-dft"); // DFT element py::class_, std::shared_ptr>>(m, "DFTElement", "DFT element") .def_property_readonly("id", &DFTElement::id, "Id") .def_property_readonly("name", &DFTElement::name, "Name") .def("__str__", &DFTElement::toString) ; py::class_, std::shared_ptr>>(m, "ParametricDFTElement", "Parametric DFT element") .def_property_readonly("id", &DFTElement::id, "Id") .def_property_readonly("name", &DFTElement::name, "Name") .def("__str__", &DFTElement::toString) ; // DFT class py::class_, std::shared_ptr>>(m, "DFT", "Dynamic Fault Tree") .def("nr_elements", &DFT::nrElements, "Total number of elements") .def("nr_be", &DFT::nrBasicElements, "Number of basic elements") .def("nr_dynamic", &DFT::nrDynamicElements, "Number of dynamic elements") .def("can_have_nondeterminism", &DFT::canHaveNondeterminism, "Whether the model can contain non-deterministic choices") .def("__str__", &DFT::getInfoString) .def_property_readonly("top_level_element", [](DFT& dft) { return dft.getElement(dft.getTopLevelIndex()); }, "Get top level element") .def("get_element", &DFT::getElement, "Get DFT element at index", py::arg("index")) .def("get_element_by_name", [](DFT& dft, std::string const& name) { return dft.getElement(dft.getIndex(name)); }, "Get DFT element by name", py::arg("name")) .def("modularisation", &DFT::topModularisation, "Split DFT into independent modules") .def("symmetries", [](DFT& dft) { return dft.findSymmetries(dft.colourDFT()); }, "Compute symmetries in DFT") ; py::class_, std::shared_ptr>>(m, "ParametricDFT", "Parametric DFT") .def("nr_elements", &DFT::nrElements, "Total number of elements") .def("nr_be", &DFT::nrBasicElements, "Number of basic elements") .def("nr_dynamic", &DFT::nrDynamicElements, "Number of dynamic elements") .def("can_have_nondeterminism", &DFT::canHaveNondeterminism, "Whether the model can contain non-deterministic choices") .def("__str__", &DFT::getInfoString) .def_property_readonly("top_level_element", [](DFT& dft) { return dft.getElement(dft.getTopLevelIndex()); }, "Get top level element") .def("get_element", &DFT::getElement, "Get DFT element at index", py::arg("index")) .def("get_element_by_name", [](DFT& dft, std::string const& name) { return dft.getElement(dft.getIndex(name)); }, "Get DFT element by name", py::arg("name")) .def("modularisation", &DFT::topModularisation, "Split DFT into independent modules") .def("symmetries", [](DFT& dft) { return dft.findSymmetries(dft.colourDFT()); }, "Compute symmetries in DFT") ; } void define_symmetries(py::module& m) { py::class_>(m, "DFTSymmetries", "Symmetries in DFT") .def_readonly("groups", &DFTSymmetries::groups, "Symmetry groups") .def("__str__", &streamToString) ; }