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