24 double const mttfPrecision,
double const mttfStepsize, std::string
const mttfAlgorithmName,
bool const calculateMCS,
25 bool const calculateProbability,
bool const useModularisation, std::string
const importanceMeasureName,
26 std::vector<double>
const& timepoints, std::vector<std::shared_ptr<storm::logic::Formula const>>
const& properties,
27 std::vector<std::string>
const& additionalRelevantEventNames,
size_t const chunksize) {
28#ifdef STORM_HAVE_SYLVAN
30 if (mttfAlgorithmName ==
"proceeding") {
32 }
else if (mttfAlgorithmName ==
"variableChange") {
37 if (useModularisation && calculateProbability) {
40 for (
auto const& timebound : timepoints) {
42 std::cout <<
"System failure probability at timebound " << timebound <<
" is " << probability <<
'\n';
45 auto const probabilities{checker.getProbabilitiesAtTimepoints(timepoints, chunksize)};
46 for (
size_t i{0}; i < timepoints.size(); ++i) {
47 auto const timebound{timepoints[i]};
48 auto const probability{probabilities[i]};
49 std::cout <<
"System failure probability at timebound " << timebound <<
" is " << probability <<
'\n';
52 if (!properties.empty()) {
53 auto const probabilities{checker.check(properties, chunksize)};
54 for (
size_t i{0}; i < probabilities.size(); ++i) {
55 std::cout <<
"Property \"" << properties.at(i)->toString() <<
"\" has result " << probabilities.at(i) <<
'\n';
60 STORM_LOG_THROW(dft->nrDynamicElements() == 0, storm::exceptions::NotSupportedException,
62 "Bdds can only be used on static fault trees. "
63 "Try modularisation.");
66 auto sylvanBddManager{std::make_shared<storm::dft::storage::SylvanBddManager>()};
67 sylvanBddManager->execute([&]() {
73 checker->exportBddToDot(filename);
77 auto const minimalCutSets{checker->getMinimalCutSetsAsIndices()};
78 auto const sylvanBddManager{checker->getSylvanBddManager()};
81 for (
auto const& minimalCutSet : minimalCutSets) {
83 for (
auto const& be : minimalCutSet) {
84 std::cout << sylvanBddManager->getName(be) <<
' ';
91 if (calculateProbability) {
93 for (
auto const& timebound : timepoints) {
94 auto const probability{checker->getProbabilityAtTimebound(timebound)};
95 std::cout <<
"System failure probability at timebound " << timebound <<
" is " << probability <<
'\n';
98 auto const probabilities{checker->getProbabilitiesAtTimepoints(timepoints, chunksize)};
99 for (
size_t i{0}; i < timepoints.size(); ++i) {
100 auto const timebound{timepoints[i]};
101 auto const probability{probabilities[i]};
102 std::cout <<
"System failure probability at timebound " << timebound <<
" is " << probability <<
'\n';
106 if (!properties.empty()) {
107 auto const probabilities{adapter.check(chunksize)};
108 for (
size_t i{0}; i < probabilities.size(); ++i) {
109 std::cout <<
"Property \"" << properties.at(i)->toString() <<
"\" has result " << probabilities.at(i) <<
'\n';
114 if (importanceMeasureName !=
"" && timepoints.size() == 1) {
115 auto const bes{dft->getBasicElements()};
116 std::vector<double> values{};
117 if (importanceMeasureName ==
"MIF") {
118 values = checker->getAllBirnbaumFactorsAtTimebound(timepoints[0]);
120 if (importanceMeasureName ==
"CIF") {
121 values = checker->getAllCIFsAtTimebound(timepoints[0]);
123 if (importanceMeasureName ==
"DIF") {
124 values = checker->getAllDIFsAtTimebound(timepoints[0]);
126 if (importanceMeasureName ==
"RAW") {
127 values = checker->getAllRAWsAtTimebound(timepoints[0]);
129 if (importanceMeasureName ==
"RRW") {
130 values = checker->getAllRRWsAtTimebound(timepoints[0]);
133 for (
size_t i{0}; i < bes.size(); ++i) {
134 std::cout << importanceMeasureName <<
" for the basic event " << bes[i]->name() <<
" at timebound " << timepoints[0] <<
" is " << values[i]
137 }
else if (importanceMeasureName !=
"") {
138 auto const bes{dft->getBasicElements()};
139 std::vector<std::vector<double>> values{};
140 if (importanceMeasureName ==
"MIF") {
141 values = checker->getAllBirnbaumFactorsAtTimepoints(timepoints, chunksize);
143 if (importanceMeasureName ==
"CIF") {
144 values = checker->getAllCIFsAtTimepoints(timepoints, chunksize);
146 if (importanceMeasureName ==
"DIF") {
147 values = checker->getAllDIFsAtTimepoints(timepoints, chunksize);
149 if (importanceMeasureName ==
"RAW") {
150 values = checker->getAllRAWsAtTimepoints(timepoints, chunksize);
152 if (importanceMeasureName ==
"RRW") {
153 values = checker->getAllRRWsAtTimepoints(timepoints, chunksize);
155 for (
size_t i{0}; i < bes.size(); ++i) {
156 for (
size_t j{0}; j < timepoints.size(); ++j) {
157 std::cout << importanceMeasureName <<
" for the basic event " << bes[i]->name() <<
" at timebound " << timepoints[j] <<
" is "
158 << values[i][j] <<
'\n';
165 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
166 "version of Storm with Sylvan support.");