Storm 1.10.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SFTBDDChecker.cpp
Go to the documentation of this file.
1
2#include <memory>
3#include <vector>
4
8
9namespace storm::dft {
10namespace modelchecker {
11
14
15namespace {
16
34ValueType recursiveProbability(Bdd const bdd, std::map<uint32_t, ValueType> const &indexToProbability, std::map<uint64_t, ValueType> &bddToProbability) {
35 if (bdd.isOne()) {
36 return 1;
37 } else if (bdd.isZero()) {
38 return 0;
39 }
40
41 auto const it{bddToProbability.find(bdd.GetBDD())};
42 if (it != bddToProbability.end()) {
43 return it->second;
44 }
45
46 auto const currentVar{bdd.TopVar()};
47 auto const currentProbability{indexToProbability.at(currentVar)};
48
49 auto const thenProbability{recursiveProbability(bdd.Then(), indexToProbability, bddToProbability)};
50 auto const elseProbability{recursiveProbability(bdd.Else(), indexToProbability, bddToProbability)};
51
52 // P(Ite(x, f1, f2)) = P(x) * P(f1) + P(!x) * P(f2)
53 auto const probability{currentProbability * thenProbability + (1 - currentProbability) * elseProbability};
54 bddToProbability[bdd.GetBDD()] = probability;
55 return probability;
56}
57
82ValueType recursiveBirnbaumFactor(uint32_t const variableIndex, Bdd const bdd, std::map<uint32_t, ValueType> const &indexToProbability,
83 std::map<uint64_t, ValueType> &bddToProbability, std::map<uint64_t, ValueType> &bddToBirnbaumFactor) {
84 if (bdd.isTerminal()) {
85 return 0;
86 }
87
88 auto const it{bddToBirnbaumFactor.find(bdd.GetBDD())};
89 if (it != bddToBirnbaumFactor.end()) {
90 return it->second;
91 }
92
93 auto const currentVar{bdd.TopVar()};
94 auto const currentProbability{indexToProbability.at(currentVar)};
95
96 ValueType birnbaumFactor{0};
97
98 if (currentVar > variableIndex) {
99 return 0;
100 } else if (currentVar == variableIndex) {
101 auto const thenProbability{recursiveProbability(bdd.Then(), indexToProbability, bddToProbability)};
102 auto const elseProbability{recursiveProbability(bdd.Else(), indexToProbability, bddToProbability)};
103 birnbaumFactor = thenProbability - elseProbability;
104 } else if (currentVar < variableIndex) {
105 auto const thenBirnbaumFactor{recursiveBirnbaumFactor(variableIndex, bdd.Then(), indexToProbability, bddToProbability, bddToBirnbaumFactor)};
106 auto const elseBirnbaumFactor{recursiveBirnbaumFactor(variableIndex, bdd.Else(), indexToProbability, bddToProbability, bddToBirnbaumFactor)};
107
108 birnbaumFactor = currentProbability * thenBirnbaumFactor + (1 - currentProbability) * elseBirnbaumFactor;
109 }
110
111 bddToBirnbaumFactor[bdd.GetBDD()] = birnbaumFactor;
112 return birnbaumFactor;
113}
114
140Eigen::ArrayXd const *recursiveProbabilities(size_t const chunksize, Bdd const bdd, std::map<uint32_t, Eigen::ArrayXd> const &indexToProbabilities,
141 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> &bddToProbabilities) {
142 auto const bddId{bdd.GetBDD()};
143 auto const it{bddToProbabilities.find(bddId)};
144 if (it != bddToProbabilities.end() && it->second.first) {
145 return &it->second.second;
146 }
147
148 auto &bddToProbabilitiesElement{bddToProbabilities[bddId]};
149 if (bdd.isOne()) {
150 bddToProbabilitiesElement.first = true;
151 bddToProbabilitiesElement.second = Eigen::ArrayXd::Constant(chunksize, 1);
152 return &bddToProbabilitiesElement.second;
153 } else if (bdd.isZero()) {
154 bddToProbabilitiesElement.first = true;
155 bddToProbabilitiesElement.second = Eigen::ArrayXd::Constant(chunksize, 0);
156 return &bddToProbabilitiesElement.second;
157 }
158
159 auto const &thenProbabilities{*recursiveProbabilities(chunksize, bdd.Then(), indexToProbabilities, bddToProbabilities)};
160 auto const &elseProbabilities{*recursiveProbabilities(chunksize, bdd.Else(), indexToProbabilities, bddToProbabilities)};
161
162 auto const currentVar{bdd.TopVar()};
163 auto const &currentProbabilities{indexToProbabilities.at(currentVar)};
164
165 // P(Ite(x, f1, f2)) = P(x) * P(f1) + P(!x) * P(f2)
166 bddToProbabilitiesElement.first = true;
167 bddToProbabilitiesElement.second = currentProbabilities * thenProbabilities + (1 - currentProbabilities) * elseProbabilities;
168 return &bddToProbabilitiesElement.second;
169}
170
198Eigen::ArrayXd const *recursiveBirnbaumFactors(size_t const chunksize, uint32_t const variableIndex, Bdd const bdd,
199 std::map<uint32_t, Eigen::ArrayXd> const &indexToProbabilities,
200 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> &bddToProbabilities,
201 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> &bddToBirnbaumFactors) {
202 auto const bddId{bdd.GetBDD()};
203 auto const it{bddToBirnbaumFactors.find(bddId)};
204 if (it != bddToBirnbaumFactors.end() && it->second.first) {
205 return &it->second.second;
206 }
207
208 auto &bddToBirnbaumFactorsElement{bddToBirnbaumFactors[bddId]};
209 if (bdd.isTerminal() || bdd.TopVar() > variableIndex) {
210 // return vector 0;
211 bddToBirnbaumFactorsElement.second = Eigen::ArrayXd::Constant(chunksize, 0);
212 return &bddToBirnbaumFactorsElement.second;
213 }
214
215 auto const currentVar{bdd.TopVar()};
216 auto const &currentProbabilities{indexToProbabilities.at(currentVar)};
217
218 if (currentVar == variableIndex) {
219 auto const &thenProbabilities{*recursiveProbabilities(chunksize, bdd.Then(), indexToProbabilities, bddToProbabilities)};
220 auto const &elseProbabilities{*recursiveProbabilities(chunksize, bdd.Else(), indexToProbabilities, bddToProbabilities)};
221
222 bddToBirnbaumFactorsElement.first = true;
223 bddToBirnbaumFactorsElement.second = thenProbabilities - elseProbabilities;
224 return &bddToBirnbaumFactorsElement.second;
225 }
226
227 // currentVar < variableIndex
228 auto const &thenBirnbaumFactors{
229 *recursiveBirnbaumFactors(chunksize, variableIndex, bdd.Then(), indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
230 auto const &elseBirnbaumFactors{
231 *recursiveBirnbaumFactors(chunksize, variableIndex, bdd.Else(), indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
232
233 bddToBirnbaumFactorsElement.first = true;
234 bddToBirnbaumFactorsElement.second = currentProbabilities * thenBirnbaumFactors + (1 - currentProbabilities) * elseBirnbaumFactors;
235 return &bddToBirnbaumFactorsElement.second;
236}
237} // namespace
238
239SFTBDDChecker::SFTBDDChecker(std::shared_ptr<storm::dft::storage::DFT<ValueType>> dft, std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager)
240 : transformator{std::make_shared<storm::dft::transformations::SftToBddTransformator<ValueType>>(dft, sylvanBddManager)} {}
241
242SFTBDDChecker::SFTBDDChecker(std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> transformator) : transformator{transformator} {}
243
244Bdd SFTBDDChecker::getTopLevelElementBdd() {
245 return transformator->transformTopLevel();
246}
247
248std::shared_ptr<storm::dft::storage::DFT<ValueType>> SFTBDDChecker::getDFT() const noexcept {
249 return transformator->getDFT();
250}
251std::shared_ptr<storm::dft::storage::SylvanBddManager> SFTBDDChecker::getSylvanBddManager() const noexcept {
252 return transformator->getSylvanBddManager();
253}
254
255std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> SFTBDDChecker::getTransformator() const noexcept {
256 return transformator;
257}
258
259std::vector<std::vector<std::string>> SFTBDDChecker::getMinimalCutSets() {
260 std::vector<std::vector<uint32_t>> mcs{getMinimalCutSetsAsIndices()};
261
262 std::vector<std::vector<std::string>> rval{};
263 rval.reserve(mcs.size());
264 while (!mcs.empty()) {
265 std::vector<std::string> tmp{};
266 tmp.reserve(mcs.back().size());
267 for (auto const &be : mcs.back()) {
268 tmp.push_back(getSylvanBddManager()->getName(be));
269 }
270 rval.push_back(std::move(tmp));
271 mcs.pop_back();
272 }
273
274 return rval;
275}
276
277std::vector<std::vector<uint32_t>> SFTBDDChecker::getMinimalCutSetsAsIndices() {
278 auto const bdd{getTopLevelElementBdd().Minsol()};
279
280 std::vector<std::vector<uint32_t>> mcs{};
281 std::vector<uint32_t> buffer{};
282 recursiveMCS(bdd, buffer, mcs);
283
284 return mcs;
285}
286
287template<typename FuncType>
288void SFTBDDChecker::chunkCalculationTemplate(std::vector<ValueType> const &timepoints, size_t chunksize, FuncType func) const {
289 if (chunksize == 0) {
290 chunksize = timepoints.size();
291 }
292
293 // caches
294 auto const basicElements{getDFT()->getBasicElements()};
295 std::map<uint32_t, Eigen::ArrayXd> indexToProbabilities{};
296
297 // The current timepoints we calculate with
298 Eigen::ArrayXd timepointsArray{chunksize};
299
300 for (size_t currentIndex{0}; currentIndex < timepoints.size(); currentIndex += chunksize) {
301 auto const sizeLeft{timepoints.size() - currentIndex};
302 if (sizeLeft < chunksize) {
303 chunksize = sizeLeft;
304 timepointsArray = Eigen::ArrayXd{chunksize};
305 }
306
307 // Update current timepoints
308 for (size_t i{currentIndex}; i < currentIndex + chunksize; ++i) {
309 timepointsArray(i - currentIndex) = timepoints[i];
310 }
311
312 // Update the probabilities of the basic elements
313 for (auto const &be : basicElements) {
314 auto const beIndex{getSylvanBddManager()->getIndex(be->name())};
315 // Vectorize known BETypes
316 // fallback to getUnreliability() otherwise
318 auto const failureRate{std::static_pointer_cast<storm::dft::storage::elements::BEExponential<ValueType> const>(be)->activeFailureRate()};
319
320 // exponential distribution
321 // p(T <= t) = 1 - exp(-lambda*t)
322 indexToProbabilities[beIndex] = 1 - (-failureRate * timepointsArray).exp();
323 } else {
324 auto probabilities{timepointsArray};
325 for (size_t i{0}; i < chunksize; ++i) {
326 probabilities(i) = be->getUnreliability(timepointsArray(i));
327 }
328 indexToProbabilities[beIndex] = probabilities;
329 }
330 }
331
332 func(chunksize, timepointsArray, indexToProbabilities);
333 }
334}
335
337 std::map<uint32_t, ValueType> indexToProbability{};
338 for (auto const &be : getDFT()->getBasicElements()) {
339 auto const currentIndex{getSylvanBddManager()->getIndex(be->name())};
340 indexToProbability[currentIndex] = be->getUnreliability(timebound);
341 }
342
343 std::map<uint64_t, ValueType> bddToProbability{};
344 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
345 return probability;
346}
347
348std::vector<ValueType> SFTBDDChecker::getProbabilitiesAtTimepoints(Bdd bdd, std::vector<ValueType> const &timepoints, size_t chunksize) const {
349 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToProbabilities{};
350 std::vector<ValueType> resultProbabilities{};
351 resultProbabilities.reserve(timepoints.size());
352
353 chunkCalculationTemplate(timepoints, chunksize, [&](auto const currentChunksize, auto const &timepointsArray, auto const &indexToProbabilities) {
354 // Invalidate bdd cache
355 for (auto &i : bddToProbabilities) {
356 i.second.first = false;
357 }
358
359 // Great care was made so that the pointer returned is always valid
360 // and points to an element in bddToProbabilities
361 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
362
363 // Update result Probabilities
364 for (size_t i{0}; i < currentChunksize; ++i) {
365 resultProbabilities.push_back(probabilitiesArray(i));
366 }
367 });
368
369 return resultProbabilities;
370}
371
372template<typename FuncType>
373ValueType SFTBDDChecker::getImportanceMeasureAtTimebound(std::string const &beName, ValueType timebound, FuncType func) {
374 std::map<uint32_t, ValueType> indexToProbability{};
375 for (auto const &be : getDFT()->getBasicElements()) {
376 auto const currentIndex{getSylvanBddManager()->getIndex(be->name())};
377 indexToProbability[currentIndex] = be->getUnreliability(timebound);
378 }
379
380 auto const bdd{getTopLevelElementBdd()};
381 auto const index{getSylvanBddManager()->getIndex(beName)};
382 std::map<uint64_t, ValueType> bddToProbability{};
383 std::map<uint64_t, ValueType> bddToBirnbaumFactor{};
384 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
385 auto const birnbaumFactor{recursiveBirnbaumFactor(index, bdd, indexToProbability, bddToProbability, bddToBirnbaumFactor)};
386 auto const &beProbability{indexToProbability[index]};
387
388 return func(beProbability, probability, birnbaumFactor);
389}
390
391template<typename FuncType>
392std::vector<ValueType> SFTBDDChecker::getAllImportanceMeasuresAtTimebound(ValueType timebound, FuncType func) {
393 auto const bdd{getTopLevelElementBdd()};
394
395 std::vector<ValueType> resultVector{};
396 resultVector.reserve(getDFT()->getBasicElements().size());
397
398 std::map<uint32_t, ValueType> indexToProbability{};
399 for (auto const &be : getDFT()->getBasicElements()) {
400 auto const currentIndex{getSylvanBddManager()->getIndex(be->name())};
401 indexToProbability[currentIndex] = be->getUnreliability(timebound);
402 }
403 std::map<uint64_t, ValueType> bddToProbability{};
404
405 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
406
407 for (auto const &be : getDFT()->getBasicElements()) {
408 auto const index{getSylvanBddManager()->getIndex(be->name())};
409 std::map<uint64_t, ValueType> bddToBirnbaumFactor{};
410 auto const birnbaumFactor{recursiveBirnbaumFactor(index, bdd, indexToProbability, bddToProbability, bddToBirnbaumFactor)};
411 auto const &beProbability{indexToProbability[index]};
412 resultVector.push_back(func(beProbability, probability, birnbaumFactor));
413 }
414 return resultVector;
415}
416
417template<typename FuncType>
418std::vector<ValueType> SFTBDDChecker::getImportanceMeasuresAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize,
419 FuncType func) {
420 auto const bdd{getTopLevelElementBdd()};
421 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToProbabilities{};
422 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToBirnbaumFactors{};
423 std::vector<ValueType> resultVector{};
424 resultVector.reserve(timepoints.size());
425
426 chunkCalculationTemplate(timepoints, chunksize, [&](auto const currentChunksize, auto const &timepointsArray, auto const &indexToProbabilities) {
427 // Invalidate bdd caches
428 for (auto &i : bddToProbabilities) {
429 i.second.first = false;
430 }
431 for (auto &i : bddToBirnbaumFactors) {
432 i.second.first = false;
433 }
434
435 // Great care was made so that the pointer returned is always valid
436 auto const index{getSylvanBddManager()->getIndex(beName)};
437 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
438 auto const &birnbaumFactorsArray{
439 *recursiveBirnbaumFactors(currentChunksize, index, bdd, indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
440
441 auto const &beProbabilitiesArray{indexToProbabilities.at(index)};
442 auto const ImportanceMeasureArray{func(beProbabilitiesArray, probabilitiesArray, birnbaumFactorsArray)};
443
444 // Update result Probabilities
445 for (size_t i{0}; i < currentChunksize; ++i) {
446 resultVector.push_back(ImportanceMeasureArray(i));
447 }
448 });
449
450 return resultVector;
451}
452
453template<typename FuncType>
454std::vector<std::vector<ValueType>> SFTBDDChecker::getAllImportanceMeasuresAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize,
455 FuncType func) {
456 auto const bdd{getTopLevelElementBdd()};
457 auto const basicElements{getDFT()->getBasicElements()};
458
459 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToProbabilities{};
460 std::unordered_map<uint64_t, std::pair<bool, Eigen::ArrayXd>> bddToBirnbaumFactors{};
461 std::vector<std::vector<ValueType>> resultVector{};
462 resultVector.resize(getDFT()->getBasicElements().size());
463 for (auto &i : resultVector) {
464 i.reserve(timepoints.size());
465 }
466
467 chunkCalculationTemplate(timepoints, chunksize, [&](auto const currentChunksize, auto const &timepointsArray, auto const &indexToProbabilities) {
468 // Invalidate bdd cache
469 for (auto &i : bddToProbabilities) {
470 i.second.first = false;
471 }
472
473 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
474
475 for (size_t basicElementIndex{0}; basicElementIndex < basicElements.size(); ++basicElementIndex) {
476 auto const &be{basicElements[basicElementIndex]};
477 // Invalidate bdd cache
478 for (auto &i : bddToBirnbaumFactors) {
479 i.second.first = false;
480 }
481
482 // Great care was made so that the pointer returned is always
483 // valid and points to an element in bddToProbabilities
484 auto const index{getSylvanBddManager()->getIndex(be->name())};
485 auto const &birnbaumFactorsArray{
486 *recursiveBirnbaumFactors(currentChunksize, index, bdd, indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
487
488 auto const &beProbabilitiesArray{indexToProbabilities.at(index)};
489
490 auto const ImportanceMeasureArray{func(beProbabilitiesArray, probabilitiesArray, birnbaumFactorsArray)};
491
492 // Update result Probabilities
493 for (size_t i{0}; i < currentChunksize; ++i) {
494 resultVector[basicElementIndex].push_back(ImportanceMeasureArray(i));
495 }
496 }
497 });
498
499 return resultVector;
500}
501
502namespace {
503
504struct BirnbaumFunctor {
505 template<typename T>
506 constexpr auto operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
507 return birnbaumFactor;
508 }
509};
510
511struct CIFFunctor {
512 template<typename T>
513 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
514 return (beProbability / probability) * birnbaumFactor;
515 }
516};
517
518struct DIFFunctor {
519 template<typename T>
520 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
521 return beProbability + (beProbability * (1 - beProbability) * birnbaumFactor) / probability;
522 }
523};
524
525struct RAWFunctor {
526 template<typename T>
527 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
528 return 1 + ((1 - beProbability) * birnbaumFactor) / probability;
529 }
530};
531
532struct RRWFunctor {
533 template<typename T>
534 constexpr T operator()(T const &beProbability, T const &probability, T const &birnbaumFactor) const {
535 return probability / (probability - beProbability * birnbaumFactor);
536 }
537};
538
539} // namespace
540
542 return getImportanceMeasureAtTimebound(beName, timebound, BirnbaumFunctor{});
543}
544
546 return getAllImportanceMeasuresAtTimebound(timebound, BirnbaumFunctor{});
547}
548
549std::vector<ValueType> SFTBDDChecker::getBirnbaumFactorsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
550 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, BirnbaumFunctor{});
551}
552
553std::vector<std::vector<ValueType>> SFTBDDChecker::getAllBirnbaumFactorsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
554 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, BirnbaumFunctor{});
555}
556
557ValueType SFTBDDChecker::getCIFAtTimebound(std::string const &beName, ValueType timebound) {
558 return getImportanceMeasureAtTimebound(beName, timebound, CIFFunctor{});
559}
560
561std::vector<ValueType> SFTBDDChecker::getAllCIFsAtTimebound(ValueType timebound) {
562 return getAllImportanceMeasuresAtTimebound(timebound, CIFFunctor{});
563}
564
565std::vector<ValueType> SFTBDDChecker::getCIFsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
566 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, CIFFunctor{});
567}
568
569std::vector<std::vector<ValueType>> SFTBDDChecker::getAllCIFsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
570 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, CIFFunctor{});
571}
572
573ValueType SFTBDDChecker::getDIFAtTimebound(std::string const &beName, ValueType timebound) {
574 return getImportanceMeasureAtTimebound(beName, timebound, DIFFunctor{});
575}
576
577std::vector<ValueType> SFTBDDChecker::getAllDIFsAtTimebound(ValueType timebound) {
578 return getAllImportanceMeasuresAtTimebound(timebound, DIFFunctor{});
579}
580
581std::vector<ValueType> SFTBDDChecker::getDIFsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
582 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, DIFFunctor{});
583}
584
585std::vector<std::vector<ValueType>> SFTBDDChecker::getAllDIFsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
586 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, DIFFunctor{});
587}
588
589ValueType SFTBDDChecker::getRAWAtTimebound(std::string const &beName, ValueType timebound) {
590 return getImportanceMeasureAtTimebound(beName, timebound, RAWFunctor{});
591}
592
593std::vector<ValueType> SFTBDDChecker::getAllRAWsAtTimebound(ValueType timebound) {
594 return getAllImportanceMeasuresAtTimebound(timebound, RAWFunctor{});
595}
596
597std::vector<ValueType> SFTBDDChecker::getRAWsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
598 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, RAWFunctor{});
599}
600
601std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRAWsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
602 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, RAWFunctor{});
603}
604
605ValueType SFTBDDChecker::getRRWAtTimebound(std::string const &beName, ValueType timebound) {
606 return getImportanceMeasureAtTimebound(beName, timebound, RRWFunctor{});
607}
608
609std::vector<ValueType> SFTBDDChecker::getAllRRWsAtTimebound(ValueType timebound) {
610 return getAllImportanceMeasuresAtTimebound(timebound, RRWFunctor{});
611}
612
613std::vector<ValueType> SFTBDDChecker::getRRWsAtTimepoints(std::string const &beName, std::vector<ValueType> const &timepoints, size_t chunksize) {
614 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, RRWFunctor{});
615}
616
617std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRRWsAtTimepoints(std::vector<ValueType> const &timepoints, size_t chunksize) {
618 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, RRWFunctor{});
619}
620
621void SFTBDDChecker::recursiveMCS(Bdd const bdd, std::vector<uint32_t> &buffer, std::vector<std::vector<uint32_t>> &minimalCutSets) const {
622 if (bdd.isOne()) {
623 minimalCutSets.push_back(buffer);
624 } else if (!bdd.isZero()) {
625 auto const currentVar{bdd.TopVar()};
626
627 buffer.push_back(currentVar);
628 recursiveMCS(bdd.Then(), buffer, minimalCutSets);
629 buffer.pop_back();
630
631 recursiveMCS(bdd.Else(), buffer, minimalCutSets);
632 }
633}
634
635} // namespace modelchecker
636} // namespace storm::dft
std::shared_ptr< storm::dft::storage::SylvanBddManager > getSylvanBddManager() const noexcept
std::vector< ValueType > getAllRRWsAtTimebound(ValueType timebound)
ValueType getRAWAtTimebound(std::string const &beName, ValueType timebound)
std::vector< std::vector< ValueType > > getAllRAWsAtTimepoints(std::vector< ValueType > const &timepoints, size_t chunksize=0)
ValueType getCIFAtTimebound(std::string const &beName, ValueType timebound)
std::vector< std::vector< ValueType > > getAllBirnbaumFactorsAtTimepoints(std::vector< ValueType > const &timepoints, size_t chunksize=0)
std::vector< ValueType > getAllDIFsAtTimebound(ValueType timebound)
std::vector< ValueType > getAllRAWsAtTimebound(ValueType timebound)
std::vector< ValueType > getRRWsAtTimepoints(std::string const &beName, std::vector< ValueType > const &timepoints, size_t chunksize=0)
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 >())
std::shared_ptr< storm::dft::transformations::SftToBddTransformator< ValueType > > getTransformator() const noexcept
std::vector< std::vector< ValueType > > getAllDIFsAtTimepoints(std::vector< ValueType > const &timepoints, size_t chunksize=0)
ValueType getRRWAtTimebound(std::string const &beName, ValueType timebound)
std::vector< std::vector< ValueType > > getAllRRWsAtTimepoints(std::vector< ValueType > const &timepoints, size_t chunksize=0)
std::vector< ValueType > getAllBirnbaumFactorsAtTimebound(ValueType timebound)
std::vector< ValueType > getRAWsAtTimepoints(std::string const &beName, std::vector< ValueType > const &timepoints, size_t chunksize=0)
ValueType getBirnbaumFactorAtTimebound(std::string const &beName, ValueType timebound)
std::vector< ValueType > getProbabilitiesAtTimepoints(std::vector< ValueType > const &timepoints, size_t const chunksize=0)
std::shared_ptr< storm::dft::storage::DFT< ValueType > > getDFT() const noexcept
std::vector< std::vector< ValueType > > getAllCIFsAtTimepoints(std::vector< ValueType > const &timepoints, size_t chunksize=0)
std::vector< ValueType > getBirnbaumFactorsAtTimepoints(std::string const &beName, std::vector< ValueType > const &timepoints, size_t chunksize=0)
std::vector< std::vector< uint32_t > > getMinimalCutSetsAsIndices()
std::vector< ValueType > getCIFsAtTimepoints(std::string const &beName, std::vector< ValueType > const &timepoints, size_t chunksize=0)
std::vector< std::vector< std::string > > getMinimalCutSets()
std::vector< ValueType > getAllCIFsAtTimebound(ValueType timebound)
ValueType getDIFAtTimebound(std::string const &beName, ValueType timebound)
std::vector< ValueType > getDIFsAtTimepoints(std::string const &beName, std::vector< ValueType > const &timepoints, size_t chunksize=0)
ValueType getProbabilityAtTimebound(ValueType timebound)
Represents a Dynamic Fault Tree.
Definition DFT.h:52
SFTBDDChecker::ValueType ValueType
SFTBDDChecker::Bdd Bdd
LabParser.cpp.
Definition cli.cpp:18