Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SFTBDDChecker.cpp
Go to the documentation of this file.
2
3#include <memory>
4#include <vector>
5
8
9namespace storm::dft {
10namespace modelchecker {
11
13#ifdef STORM_HAVE_SYLVAN
14using Bdd = SFTBDDChecker::Bdd;
15#endif
16
17#ifdef STORM_HAVE_SYLVAN
18namespace {
36ValueType recursiveProbability(Bdd const bdd, std::map<uint32_t, ValueType> const &indexToProbability, std::map<uint64_t, ValueType> &bddToProbability) {
37 if (bdd.isOne()) {
38 return 1;
39 } else if (bdd.isZero()) {
40 return 0;
41 }
42
43 auto const it{bddToProbability.find(bdd.GetBDD())};
44 if (it != bddToProbability.end()) {
45 return it->second;
46 }
47
48 auto const currentVar{bdd.TopVar()};
49 auto const currentProbability{indexToProbability.at(currentVar)};
50
51 auto const thenProbability{recursiveProbability(bdd.Then(), indexToProbability, bddToProbability)};
52 auto const elseProbability{recursiveProbability(bdd.Else(), indexToProbability, bddToProbability)};
53
54 // P(Ite(x, f1, f2)) = P(x) * P(f1) + P(!x) * P(f2)
55 auto const probability{currentProbability * thenProbability + (1 - currentProbability) * elseProbability};
56 bddToProbability[bdd.GetBDD()] = probability;
57 return probability;
58}
59
84ValueType recursiveBirnbaumFactor(uint32_t const variableIndex, Bdd const bdd, std::map<uint32_t, ValueType> const &indexToProbability,
85 std::map<uint64_t, ValueType> &bddToProbability, std::map<uint64_t, ValueType> &bddToBirnbaumFactor) {
86 if (bdd.isTerminal()) {
87 return 0;
88 }
89
90 auto const it{bddToBirnbaumFactor.find(bdd.GetBDD())};
91 if (it != bddToBirnbaumFactor.end()) {
92 return it->second;
93 }
94
95 auto const currentVar{bdd.TopVar()};
96 auto const currentProbability{indexToProbability.at(currentVar)};
97
98 ValueType birnbaumFactor{0};
99
100 if (currentVar > variableIndex) {
101 return 0;
102 } else if (currentVar == variableIndex) {
103 auto const thenProbability{recursiveProbability(bdd.Then(), indexToProbability, bddToProbability)};
104 auto const elseProbability{recursiveProbability(bdd.Else(), indexToProbability, bddToProbability)};
105 birnbaumFactor = thenProbability - elseProbability;
106 } else if (currentVar < variableIndex) {
107 auto const thenBirnbaumFactor{recursiveBirnbaumFactor(variableIndex, bdd.Then(), indexToProbability, bddToProbability, bddToBirnbaumFactor)};
108 auto const elseBirnbaumFactor{recursiveBirnbaumFactor(variableIndex, bdd.Else(), indexToProbability, bddToProbability, bddToBirnbaumFactor)};
109
110 birnbaumFactor = currentProbability * thenBirnbaumFactor + (1 - currentProbability) * elseBirnbaumFactor;
111 }
112
113 bddToBirnbaumFactor[bdd.GetBDD()] = birnbaumFactor;
114 return birnbaumFactor;
115}
116
142Eigen::ArrayXd const *recursiveProbabilities(size_t const chunksize, Bdd const bdd, std::map<uint32_t, Eigen::ArrayXd> const &indexToProbabilities,
143 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> &bddToProbabilities) {
144 auto const bddId{bdd.GetBDD()};
145 auto const it{bddToProbabilities.find(bddId)};
146 if (it != bddToProbabilities.end() && it->second.first) {
147 return &it->second.second;
148 }
149
150 auto &bddToProbabilitiesElement{bddToProbabilities[bddId]};
151 if (bdd.isOne()) {
152 bddToProbabilitiesElement.first = true;
153 bddToProbabilitiesElement.second = Eigen::ArrayXd::Constant(chunksize, 1);
154 return &bddToProbabilitiesElement.second;
155 } else if (bdd.isZero()) {
156 bddToProbabilitiesElement.first = true;
157 bddToProbabilitiesElement.second = Eigen::ArrayXd::Constant(chunksize, 0);
158 return &bddToProbabilitiesElement.second;
159 }
160
161 auto const &thenProbabilities{*recursiveProbabilities(chunksize, bdd.Then(), indexToProbabilities, bddToProbabilities)};
162 auto const &elseProbabilities{*recursiveProbabilities(chunksize, bdd.Else(), indexToProbabilities, bddToProbabilities)};
163
164 auto const currentVar{bdd.TopVar()};
165 auto const &currentProbabilities{indexToProbabilities.at(currentVar)};
166
167 // P(Ite(x, f1, f2)) = P(x) * P(f1) + P(!x) * P(f2)
168 bddToProbabilitiesElement.first = true;
169 bddToProbabilitiesElement.second = currentProbabilities * thenProbabilities + (1 - currentProbabilities) * elseProbabilities;
170 return &bddToProbabilitiesElement.second;
171}
172
200Eigen::ArrayXd const *recursiveBirnbaumFactors(size_t const chunksize, uint32_t const variableIndex, Bdd const bdd,
201 std::map<uint32_t, Eigen::ArrayXd> const &indexToProbabilities,
202 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> &bddToProbabilities,
203 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> &bddToBirnbaumFactors) {
204 auto const bddId{bdd.GetBDD()};
205 auto const it{bddToBirnbaumFactors.find(bddId)};
206 if (it != bddToBirnbaumFactors.end() && it->second.first) {
207 return &it->second.second;
208 }
209
210 auto &bddToBirnbaumFactorsElement{bddToBirnbaumFactors[bddId]};
211 if (bdd.isTerminal() || bdd.TopVar() > variableIndex) {
212 // return vector 0;
213 bddToBirnbaumFactorsElement.second = Eigen::ArrayXd::Constant(chunksize, 0);
214 return &bddToBirnbaumFactorsElement.second;
215 }
216
217 auto const currentVar{bdd.TopVar()};
218 auto const &currentProbabilities{indexToProbabilities.at(currentVar)};
219
220 if (currentVar == variableIndex) {
221 auto const &thenProbabilities{*recursiveProbabilities(chunksize, bdd.Then(), indexToProbabilities, bddToProbabilities)};
222 auto const &elseProbabilities{*recursiveProbabilities(chunksize, bdd.Else(), indexToProbabilities, bddToProbabilities)};
223
224 bddToBirnbaumFactorsElement.first = true;
225 bddToBirnbaumFactorsElement.second = thenProbabilities - elseProbabilities;
226 return &bddToBirnbaumFactorsElement.second;
227 }
228
229 // currentVar < variableIndex
230 auto const &thenBirnbaumFactors{
231 *recursiveBirnbaumFactors(chunksize, variableIndex, bdd.Then(), indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
232 auto const &elseBirnbaumFactors{
233 *recursiveBirnbaumFactors(chunksize, variableIndex, bdd.Else(), indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
234
235 bddToBirnbaumFactorsElement.first = true;
236 bddToBirnbaumFactorsElement.second = currentProbabilities * thenBirnbaumFactors + (1 - currentProbabilities) * elseBirnbaumFactors;
237 return &bddToBirnbaumFactorsElement.second;
238}
239} // namespace
240
241SFTBDDChecker::SFTBDDChecker(std::shared_ptr<storm::dft::storage::DFT<ValueType>> dft, std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager)
242 : transformator{std::make_shared<storm::dft::transformations::SftToBddTransformator<ValueType>>(dft, sylvanBddManager)} {}
243
244SFTBDDChecker::SFTBDDChecker(std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> transformator) : transformator{transformator} {}
245
246Bdd SFTBDDChecker::getTopLevelElementBdd() {
247 return transformator->transformTopLevel();
248}
249
250std::shared_ptr<storm::dft::storage::DFT<ValueType>> SFTBDDChecker::getDFT() const {
251 return transformator->getDFT();
252}
253std::shared_ptr<storm::dft::storage::SylvanBddManager> SFTBDDChecker::getSylvanBddManager() const {
254 return transformator->getSylvanBddManager();
255}
256
257std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> SFTBDDChecker::getTransformator() const {
258 return transformator;
259}
260
261std::vector<std::vector<std::string>> SFTBDDChecker::getMinimalCutSets() {
262 std::vector<std::vector<uint32_t>> mcs{getMinimalCutSetsAsIndices()};
263
264 std::vector<std::vector<std::string>> rval{};
265 rval.reserve(mcs.size());
266 while (!mcs.empty()) {
267 std::vector<std::string> tmp{};
268 tmp.reserve(mcs.back().size());
269 for (auto const &be : mcs.back()) {
270 tmp.push_back(getSylvanBddManager()->getName(be));
271 }
272 rval.push_back(std::move(tmp));
273 mcs.pop_back();
274 }
275
276 return rval;
277}
278
279std::vector<std::vector<uint32_t>> SFTBDDChecker::getMinimalCutSetsAsIndices() {
280 auto const bdd{getTopLevelElementBdd().Minsol()};
281
282 std::vector<std::vector<uint32_t>> mcs{};
283 std::vector<uint32_t> buffer{};
284 recursiveMCS(bdd, buffer, mcs);
285
286 return mcs;
287}
288
289template<typename FuncType>
290void SFTBDDChecker::chunkCalculationTemplate(std::vector<ValueType> const &timepoints, size_t chunksize, FuncType func) const {
291 if (chunksize == 0) {
292 chunksize = timepoints.size();
293 }
294
295 // caches
296 auto const basicElements{getDFT()->getBasicElements()};
297 std::map<uint32_t, Eigen::ArrayXd> indexToProbabilities{};
298
299 // The current timepoints we calculate with
300 Eigen::ArrayXd timepointsArray{chunksize};
301
302 for (size_t currentIndex{0}; currentIndex < timepoints.size(); currentIndex += chunksize) {
303 auto const sizeLeft{timepoints.size() - currentIndex};
304 if (sizeLeft < chunksize) {
305 chunksize = sizeLeft;
306 timepointsArray = Eigen::ArrayXd{chunksize};
307 }
308
309 // Update current timepoints
310 for (size_t i{currentIndex}; i < currentIndex + chunksize; ++i) {
311 timepointsArray(i - currentIndex) = timepoints[i];
312 }
313
314 // Update the probabilities of the basic elements
315 for (auto const &be : basicElements) {
316 auto const beIndex{getSylvanBddManager()->getIndex(be->name())};
317 // Vectorize known BETypes
318 // fallback to getUnreliability() otherwise
320 auto const failureRate{std::static_pointer_cast<storm::dft::storage::elements::BEExponential<ValueType> const>(be)->activeFailureRate()};
321
322 // exponential distribution
323 // p(T <= t) = 1 - exp(-lambda*t)
324 indexToProbabilities[beIndex] = 1 - (-failureRate * timepointsArray).exp();
325 } else {
326 auto probabilities{timepointsArray};
327 for (size_t i{0}; i < chunksize; ++i) {
328 probabilities(i) = be->getUnreliability(timepointsArray(i));
329 }
330 indexToProbabilities[beIndex] = probabilities;
331 }
332 }
333
334 func(chunksize, timepointsArray, indexToProbabilities);
335 }
336}
337
338ValueType SFTBDDChecker::getProbabilityAtTimebound(Bdd bdd, ValueType timebound) const {
339 std::map<uint32_t, ValueType> indexToProbability{};
340 for (auto const &be : getDFT()->getBasicElements()) {
341 auto const currentIndex{getSylvanBddManager()->getIndex(be->name())};
342 indexToProbability[currentIndex] = be->getUnreliability(timebound);
343 }
344
345 std::map<uint64_t, ValueType> bddToProbability{};
346 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
347 return probability;
348}
349
350std::vector<ValueType> SFTBDDChecker::getProbabilitiesAtTimepoints(Bdd bdd, std::vector<ValueType> const &timepoints, size_t chunksize) const {
351 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToProbabilities{};
352 std::vector<ValueType> resultProbabilities{};
353 resultProbabilities.reserve(timepoints.size());
354
355 chunkCalculationTemplate(timepoints, chunksize, [&](auto const currentChunksize, auto const &timepointsArray, auto const &indexToProbabilities) {
356 // Invalidate bdd cache
357 for (auto &i : bddToProbabilities) {
358 i.second.first = false;
359 }
360
361 // Great care was made so that the pointer returned is always valid
362 // and points to an element in bddToProbabilities
363 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
364
365 // Update result Probabilities
366 for (size_t i{0}; i < currentChunksize; ++i) {
367 resultProbabilities.push_back(probabilitiesArray(i));
368 }
369 });
370
371 return resultProbabilities;
372}
373
374template<typename FuncType>
375ValueType SFTBDDChecker::getImportanceMeasureAtTimebound(std::string const &beName, ValueType timebound, FuncType func) {
376 std::map<uint32_t, ValueType> indexToProbability{};
377 for (auto const &be : getDFT()->getBasicElements()) {
378 auto const currentIndex{getSylvanBddManager()->getIndex(be->name())};
379 indexToProbability[currentIndex] = be->getUnreliability(timebound);
380 }
381
382 auto const bdd{getTopLevelElementBdd()};
383 auto const index{getSylvanBddManager()->getIndex(beName)};
384 std::map<uint64_t, ValueType> bddToProbability{};
385 std::map<uint64_t, ValueType> bddToBirnbaumFactor{};
386 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
387 auto const birnbaumFactor{recursiveBirnbaumFactor(index, bdd, indexToProbability, bddToProbability, bddToBirnbaumFactor)};
388 auto const &beProbability{indexToProbability[index]};
389
390 return func(beProbability, probability, birnbaumFactor);
391}
392
393template<typename FuncType>
394std::vector<ValueType> SFTBDDChecker::getAllImportanceMeasuresAtTimebound(ValueType timebound, FuncType func) {
395 auto const bdd{getTopLevelElementBdd()};
396
397 std::vector<ValueType> resultVector{};
398 resultVector.reserve(getDFT()->getBasicElements().size());
399
400 std::map<uint32_t, ValueType> indexToProbability{};
401 for (auto const &be : getDFT()->getBasicElements()) {
402 auto const currentIndex{getSylvanBddManager()->getIndex(be->name())};
403 indexToProbability[currentIndex] = be->getUnreliability(timebound);
404 }
405 std::map<uint64_t, ValueType> bddToProbability{};
406
407 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
408
409 for (auto const &be : getDFT()->getBasicElements()) {
410 auto const index{getSylvanBddManager()->getIndex(be->name())};
411 std::map<uint64_t, ValueType> bddToBirnbaumFactor{};
412 auto const birnbaumFactor{recursiveBirnbaumFactor(index, bdd, indexToProbability, bddToProbability, bddToBirnbaumFactor)};
413 auto const &beProbability{indexToProbability[index]};
414 resultVector.push_back(func(beProbability, probability, birnbaumFactor));
415 }
416 return resultVector;
417}
418
419template<typename FuncType>
420std::vector<ValueType> SFTBDDChecker::getImportanceMeasuresAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize,
421 FuncType func) {
422 auto const bdd{getTopLevelElementBdd()};
423 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToProbabilities{};
424 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToBirnbaumFactors{};
425 std::vector<ValueType> resultVector{};
426 resultVector.reserve(timepoints.size());
427
428 chunkCalculationTemplate(timepoints, chunksize, [&](auto const currentChunksize, auto const &timepointsArray, auto const &indexToProbabilities) {
429 // Invalidate bdd caches
430 for (auto &i : bddToProbabilities) {
431 i.second.first = false;
432 }
433 for (auto &i : bddToBirnbaumFactors) {
434 i.second.first = false;
435 }
436
437 // Great care was made so that the pointer returned is always valid
438 auto const index{getSylvanBddManager()->getIndex(beName)};
439 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
440 auto const &birnbaumFactorsArray{
441 *recursiveBirnbaumFactors(currentChunksize, index, bdd, indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
442
443 auto const &beProbabilitiesArray{indexToProbabilities.at(index)};
444 auto const ImportanceMeasureArray{func(beProbabilitiesArray, probabilitiesArray, birnbaumFactorsArray)};
445
446 // Update result Probabilities
447 for (size_t i{0}; i < currentChunksize; ++i) {
448 resultVector.push_back(ImportanceMeasureArray(i));
449 }
450 });
451
452 return resultVector;
453}
454
455template<typename FuncType>
456std::vector<std::vector<ValueType>> SFTBDDChecker::getAllImportanceMeasuresAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize,
457 FuncType func) {
458 auto const bdd{getTopLevelElementBdd()};
459 auto const basicElements{getDFT()->getBasicElements()};
460
461 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToProbabilities{};
462 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToBirnbaumFactors{};
463 std::vector<std::vector<ValueType>> resultVector{};
464 resultVector.resize(getDFT()->getBasicElements().size());
465 for (auto &i : resultVector) {
466 i.reserve(timepoints.size());
467 }
468
469 chunkCalculationTemplate(timepoints, chunksize, [&](auto const currentChunksize, auto const &timepointsArray, auto const &indexToProbabilities) {
470 // Invalidate bdd cache
471 for (auto &i : bddToProbabilities) {
472 i.second.first = false;
473 }
474
475 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
476
477 for (size_t basicElementIndex{0}; basicElementIndex < basicElements.size(); ++basicElementIndex) {
478 auto const &be{basicElements[basicElementIndex]};
479 // Invalidate bdd cache
480 for (auto &i : bddToBirnbaumFactors) {
481 i.second.first = false;
482 }
483
484 // Great care was made so that the pointer returned is always
485 // valid and points to an element in bddToProbabilities
486 auto const index{getSylvanBddManager()->getIndex(be->name())};
487 auto const &birnbaumFactorsArray{
488 *recursiveBirnbaumFactors(currentChunksize, index, bdd, indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
489
490 auto const &beProbabilitiesArray{indexToProbabilities.at(index)};
491
492 auto const ImportanceMeasureArray{func(beProbabilitiesArray, probabilitiesArray, birnbaumFactorsArray)};
493
494 // Update result Probabilities
495 for (size_t i{0}; i < currentChunksize; ++i) {
496 resultVector[basicElementIndex].push_back(ImportanceMeasureArray(i));
497 }
498 }
499 });
500
501 return resultVector;
502}
503
504namespace {
505
506struct BirnbaumFunctor {
507 template<typename T>
508 constexpr auto operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
509 return birnbaumFactor;
510 }
511};
512
513struct CIFFunctor {
514 template<typename T>
515 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
516 return (beProbability / probability) * birnbaumFactor;
517 }
518};
519
520struct DIFFunctor {
521 template<typename T>
522 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
523 return beProbability + (beProbability * (1 - beProbability) * birnbaumFactor) / probability;
524 }
525};
526
527struct RAWFunctor {
528 template<typename T>
529 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
530 return 1 + ((1 - beProbability) * birnbaumFactor) / probability;
531 }
532};
533
534struct RRWFunctor {
535 template<typename T>
536 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
537 return probability / (probability - beProbability * birnbaumFactor);
538 }
539};
540
541} // namespace
542
543ValueType SFTBDDChecker::getBirnbaumFactorAtTimebound(std::string const &beName, ValueType timebound) {
544 return getImportanceMeasureAtTimebound(beName, timebound, BirnbaumFunctor{});
545}
546
547std::vector<ValueType> SFTBDDChecker::getAllBirnbaumFactorsAtTimebound(ValueType timebound) {
548 return getAllImportanceMeasuresAtTimebound(timebound, BirnbaumFunctor{});
549}
550
551std::vector<ValueType> SFTBDDChecker::getBirnbaumFactorsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
552 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, BirnbaumFunctor{});
553}
554
555std::vector<std::vector<ValueType>> SFTBDDChecker::getAllBirnbaumFactorsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
556 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, BirnbaumFunctor{});
557}
558
559ValueType SFTBDDChecker::getCIFAtTimebound(std::string const &beName, ValueType timebound) {
560 return getImportanceMeasureAtTimebound(beName, timebound, CIFFunctor{});
561}
562
563std::vector<ValueType> SFTBDDChecker::getAllCIFsAtTimebound(ValueType timebound) {
564 return getAllImportanceMeasuresAtTimebound(timebound, CIFFunctor{});
565}
566
567std::vector<ValueType> SFTBDDChecker::getCIFsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
568 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, CIFFunctor{});
569}
570
571std::vector<std::vector<ValueType>> SFTBDDChecker::getAllCIFsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
572 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, CIFFunctor{});
573}
574
575ValueType SFTBDDChecker::getDIFAtTimebound(std::string const &beName, ValueType timebound) {
576 return getImportanceMeasureAtTimebound(beName, timebound, DIFFunctor{});
577}
578
579std::vector<ValueType> SFTBDDChecker::getAllDIFsAtTimebound(ValueType timebound) {
580 return getAllImportanceMeasuresAtTimebound(timebound, DIFFunctor{});
581}
582
583std::vector<ValueType> SFTBDDChecker::getDIFsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
584 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, DIFFunctor{});
585}
586
587std::vector<std::vector<ValueType>> SFTBDDChecker::getAllDIFsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
588 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, DIFFunctor{});
589}
590
591ValueType SFTBDDChecker::getRAWAtTimebound(std::string const &beName, ValueType timebound) {
592 return getImportanceMeasureAtTimebound(beName, timebound, RAWFunctor{});
593}
594
595std::vector<ValueType> SFTBDDChecker::getAllRAWsAtTimebound(ValueType timebound) {
596 return getAllImportanceMeasuresAtTimebound(timebound, RAWFunctor{});
597}
598
599std::vector<ValueType> SFTBDDChecker::getRAWsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
600 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, RAWFunctor{});
601}
602
603std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRAWsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
604 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, RAWFunctor{});
605}
606
607ValueType SFTBDDChecker::getRRWAtTimebound(std::string const &beName, ValueType timebound) {
608 return getImportanceMeasureAtTimebound(beName, timebound, RRWFunctor{});
609}
610
611std::vector<ValueType> SFTBDDChecker::getAllRRWsAtTimebound(ValueType timebound) {
612 return getAllImportanceMeasuresAtTimebound(timebound, RRWFunctor{});
613}
614
615std::vector<ValueType> SFTBDDChecker::getRRWsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
616 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, RRWFunctor{});
617}
618
619std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRRWsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
620 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, RRWFunctor{});
621}
622
623void SFTBDDChecker::recursiveMCS(Bdd const bdd, std::vector<uint32_t> &buffer, std::vector<std::vector<uint32_t>> &minimalCutSets) const {
624 if (bdd.isOne()) {
625 minimalCutSets.push_back(buffer);
626 } else if (!bdd.isZero()) {
627 auto const currentVar{bdd.TopVar()};
628
629 buffer.push_back(currentVar);
630 recursiveMCS(bdd.Then(), buffer, minimalCutSets);
631 buffer.pop_back();
632
633 recursiveMCS(bdd.Else(), buffer, minimalCutSets);
634 }
635}
636#else
637SFTBDDChecker::SFTBDDChecker(std::shared_ptr<storm::dft::storage::DFT<ValueType>> dft,
638 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager) {
639 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
640 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
641 "version of Storm with Sylvan support.");
642}
643
644SFTBDDChecker::SFTBDDChecker(std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> transformator) {
645 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
646 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
647 "version of Storm with Sylvan support.");
648}
649
650std::shared_ptr<storm::dft::storage::DFT<ValueType>> SFTBDDChecker::getDFT() const {
651 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
652 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
653 "version of Storm with Sylvan support.");
654}
655std::shared_ptr<storm::dft::storage::SylvanBddManager> SFTBDDChecker::getSylvanBddManager() const {
656 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
657 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
658 "version of Storm with Sylvan support.");
659}
660
661std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> SFTBDDChecker::getTransformator() const {
662 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
663 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
664 "version of Storm with Sylvan support.");
665}
666
667std::vector<std::vector<std::string>> SFTBDDChecker::getMinimalCutSets() {
668 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
669 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
670 "version of Storm with Sylvan support.");
671}
672
673std::vector<std::vector<uint32_t>> SFTBDDChecker::getMinimalCutSetsAsIndices() {
674 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
675 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
676 "version of Storm with Sylvan support.");
677}
678
679ValueType SFTBDDChecker::getBirnbaumFactorAtTimebound(std::string const &beName, ValueType timebound) {
680 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
681 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
682 "version of Storm with Sylvan support.");
683}
684
685std::vector<ValueType> SFTBDDChecker::getAllBirnbaumFactorsAtTimebound(ValueType timebound) {
686 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
687 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
688 "version of Storm with Sylvan support.");
689}
690
691std::vector<ValueType> SFTBDDChecker::getBirnbaumFactorsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
692 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
693 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
694 "version of Storm with Sylvan support.");
695}
696
697std::vector<std::vector<ValueType>> SFTBDDChecker::getAllBirnbaumFactorsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
698 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
699 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
700 "version of Storm with Sylvan support.");
701}
702
703ValueType SFTBDDChecker::getCIFAtTimebound(std::string const &beName, ValueType timebound) {
704 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
705 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
706 "version of Storm with Sylvan support.");
707}
708
709std::vector<ValueType> SFTBDDChecker::getAllCIFsAtTimebound(ValueType timebound) {
710 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
711 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
712 "version of Storm with Sylvan support.");
713}
714
715std::vector<ValueType> SFTBDDChecker::getCIFsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
716 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
717 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
718 "version of Storm with Sylvan support.");
719}
720
721std::vector<std::vector<ValueType>> SFTBDDChecker::getAllCIFsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
722 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
723 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
724 "version of Storm with Sylvan support.");
725}
726
727ValueType SFTBDDChecker::getDIFAtTimebound(std::string const &beName, ValueType timebound) {
728 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
729 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
730 "version of Storm with Sylvan support.");
731}
732
733std::vector<ValueType> SFTBDDChecker::getAllDIFsAtTimebound(ValueType timebound) {
734 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
735 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
736 "version of Storm with Sylvan support.");
737}
738
739std::vector<ValueType> SFTBDDChecker::getDIFsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
740 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
741 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
742 "version of Storm with Sylvan support.");
743}
744
745std::vector<std::vector<ValueType>> SFTBDDChecker::getAllDIFsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
746 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
747 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
748 "version of Storm with Sylvan support.");
749}
750
751ValueType SFTBDDChecker::getRAWAtTimebound(std::string const &beName, ValueType timebound) {
752 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
753 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
754 "version of Storm with Sylvan support.");
755}
756
757std::vector<ValueType> SFTBDDChecker::getAllRAWsAtTimebound(ValueType timebound) {
758 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
759 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
760 "version of Storm with Sylvan support.");
761}
762
763std::vector<ValueType> SFTBDDChecker::getRAWsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
764 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
765 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
766 "version of Storm with Sylvan support.");
767}
768
769std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRAWsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
770 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
771 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
772 "version of Storm with Sylvan support.");
773}
774
775ValueType SFTBDDChecker::getRRWAtTimebound(std::string const &beName, ValueType timebound) {
776 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
777 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
778 "version of Storm with Sylvan support.");
779}
780
781std::vector<ValueType> SFTBDDChecker::getAllRRWsAtTimebound(ValueType timebound) {
782 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
783 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
784 "version of Storm with Sylvan support.");
785}
786
787std::vector<ValueType> SFTBDDChecker::getRRWsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
788 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
789 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
790 "version of Storm with Sylvan support.");
791}
792
793std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRRWsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
794 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
795 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
796 "version of Storm with Sylvan support.");
797}
798
799#endif
800
801} // namespace modelchecker
802} // namespace storm::dft
SFTBDDChecker(std::shared_ptr< storm::dft::storage::DFT< ValueType > > dft, std::shared_ptr< storm::dft::storage::SylvanBddManager > sylvanBddManager=std::make_shared< storm::dft::storage::SylvanBddManager >())
Represents a Dynamic Fault Tree.
Definition DFT.h:52
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
SFTBDDChecker::ValueType ValueType