10namespace modelchecker {
13#ifdef STORM_HAVE_SYLVAN
14using Bdd = SFTBDDChecker::Bdd;
17#ifdef STORM_HAVE_SYLVAN
36ValueType recursiveProbability(Bdd
const bdd, std::map<uint32_t, ValueType>
const &indexToProbability, std::map<uint64_t, ValueType> &bddToProbability) {
39 }
else if (bdd.isZero()) {
43 auto const it{bddToProbability.find(bdd.GetBDD())};
44 if (it != bddToProbability.end()) {
48 auto const currentVar{bdd.TopVar()};
49 auto const currentProbability{indexToProbability.at(currentVar)};
51 auto const thenProbability{recursiveProbability(bdd.Then(), indexToProbability, bddToProbability)};
52 auto const elseProbability{recursiveProbability(bdd.Else(), indexToProbability, bddToProbability)};
55 auto const probability{currentProbability * thenProbability + (1 - currentProbability) * elseProbability};
56 bddToProbability[bdd.GetBDD()] = probability;
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()) {
90 auto const it{bddToBirnbaumFactor.find(bdd.GetBDD())};
91 if (it != bddToBirnbaumFactor.end()) {
95 auto const currentVar{bdd.TopVar()};
96 auto const currentProbability{indexToProbability.at(currentVar)};
100 if (currentVar > variableIndex) {
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)};
110 birnbaumFactor = currentProbability * thenBirnbaumFactor + (1 - currentProbability) * elseBirnbaumFactor;
113 bddToBirnbaumFactor[bdd.GetBDD()] = birnbaumFactor;
114 return birnbaumFactor;
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;
150 auto &bddToProbabilitiesElement{bddToProbabilities[bddId]};
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;
161 auto const &thenProbabilities{*recursiveProbabilities(chunksize, bdd.Then(), indexToProbabilities, bddToProbabilities)};
162 auto const &elseProbabilities{*recursiveProbabilities(chunksize, bdd.Else(), indexToProbabilities, bddToProbabilities)};
164 auto const currentVar{bdd.TopVar()};
165 auto const ¤tProbabilities{indexToProbabilities.at(currentVar)};
168 bddToProbabilitiesElement.first =
true;
169 bddToProbabilitiesElement.second = currentProbabilities * thenProbabilities + (1 - currentProbabilities) * elseProbabilities;
170 return &bddToProbabilitiesElement.second;
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;
210 auto &bddToBirnbaumFactorsElement{bddToBirnbaumFactors[bddId]};
211 if (bdd.isTerminal() || bdd.TopVar() > variableIndex) {
213 bddToBirnbaumFactorsElement.second = Eigen::ArrayXd::Constant(chunksize, 0);
214 return &bddToBirnbaumFactorsElement.second;
217 auto const currentVar{bdd.TopVar()};
218 auto const ¤tProbabilities{indexToProbabilities.at(currentVar)};
220 if (currentVar == variableIndex) {
221 auto const &thenProbabilities{*recursiveProbabilities(chunksize, bdd.Then(), indexToProbabilities, bddToProbabilities)};
222 auto const &elseProbabilities{*recursiveProbabilities(chunksize, bdd.Else(), indexToProbabilities, bddToProbabilities)};
224 bddToBirnbaumFactorsElement.first =
true;
225 bddToBirnbaumFactorsElement.second = thenProbabilities - elseProbabilities;
226 return &bddToBirnbaumFactorsElement.second;
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)};
235 bddToBirnbaumFactorsElement.first =
true;
236 bddToBirnbaumFactorsElement.second = currentProbabilities * thenBirnbaumFactors + (1 - currentProbabilities) * elseBirnbaumFactors;
237 return &bddToBirnbaumFactorsElement.second;
242 : transformator{
std::make_shared<
storm::dft::transformations::SftToBddTransformator<
ValueType>>(dft, sylvanBddManager)} {}
246Bdd SFTBDDChecker::getTopLevelElementBdd() {
247 return transformator->transformTopLevel();
250std::shared_ptr<storm::dft::storage::DFT<ValueType>> SFTBDDChecker::getDFT()
const {
251 return transformator->getDFT();
253std::shared_ptr<storm::dft::storage::SylvanBddManager> SFTBDDChecker::getSylvanBddManager()
const {
254 return transformator->getSylvanBddManager();
257std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> SFTBDDChecker::getTransformator()
const {
258 return transformator;
261std::vector<std::vector<std::string>> SFTBDDChecker::getMinimalCutSets() {
262 std::vector<std::vector<uint32_t>> mcs{getMinimalCutSetsAsIndices()};
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));
272 rval.push_back(std::move(tmp));
279std::vector<std::vector<uint32_t>> SFTBDDChecker::getMinimalCutSetsAsIndices() {
280 auto const bdd{getTopLevelElementBdd().Minsol()};
282 std::vector<std::vector<uint32_t>> mcs{};
283 std::vector<uint32_t> buffer{};
284 recursiveMCS(bdd, buffer, mcs);
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();
296 auto const basicElements{getDFT()->getBasicElements()};
297 std::map<uint32_t, Eigen::ArrayXd> indexToProbabilities{};
300 Eigen::ArrayXd timepointsArray{chunksize};
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};
310 for (
size_t i{currentIndex};
i < currentIndex + chunksize; ++
i) {
311 timepointsArray(i - currentIndex) = timepoints[
i];
315 for (
auto const &be : basicElements) {
316 auto const beIndex{getSylvanBddManager()->getIndex(be->name())};
320 auto const failureRate{std::static_pointer_cast<storm::dft::storage::elements::BEExponential<ValueType>
const>(be)->activeFailureRate()};
324 indexToProbabilities[beIndex] = 1 - (-failureRate * timepointsArray).exp();
326 auto probabilities{timepointsArray};
327 for (
size_t i{0};
i < chunksize; ++
i) {
328 probabilities(i) = be->getUnreliability(timepointsArray(i));
330 indexToProbabilities[beIndex] = probabilities;
334 func(chunksize, timepointsArray, indexToProbabilities);
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);
345 std::map<uint64_t, ValueType> bddToProbability{};
346 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
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());
355 chunkCalculationTemplate(timepoints, chunksize, [&](
auto const currentChunksize,
auto const &timepointsArray,
auto const &indexToProbabilities) {
357 for (
auto &i : bddToProbabilities) {
358 i.second.first =
false;
363 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
366 for (
size_t i{0};
i < currentChunksize; ++
i) {
367 resultProbabilities.push_back(probabilitiesArray(i));
371 return resultProbabilities;
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);
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]};
390 return func(beProbability, probability, birnbaumFactor);
393template<
typename FuncType>
394std::vector<ValueType> SFTBDDChecker::getAllImportanceMeasuresAtTimebound(ValueType timebound, FuncType func) {
395 auto const bdd{getTopLevelElementBdd()};
397 std::vector<ValueType> resultVector{};
398 resultVector.reserve(getDFT()->getBasicElements().size());
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);
405 std::map<uint64_t, ValueType> bddToProbability{};
407 auto const probability{recursiveProbability(bdd, indexToProbability, bddToProbability)};
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));
419template<
typename FuncType>
420std::vector<ValueType> SFTBDDChecker::getImportanceMeasuresAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize,
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());
428 chunkCalculationTemplate(timepoints, chunksize, [&](
auto const currentChunksize,
auto const &timepointsArray,
auto const &indexToProbabilities) {
430 for (
auto &i : bddToProbabilities) {
431 i.second.first =
false;
433 for (
auto &i : bddToBirnbaumFactors) {
434 i.second.first =
false;
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)};
443 auto const &beProbabilitiesArray{indexToProbabilities.at(index)};
444 auto const ImportanceMeasureArray{func(beProbabilitiesArray, probabilitiesArray, birnbaumFactorsArray)};
447 for (
size_t i{0};
i < currentChunksize; ++
i) {
448 resultVector.push_back(ImportanceMeasureArray(i));
455template<
typename FuncType>
456std::vector<std::vector<ValueType>> SFTBDDChecker::getAllImportanceMeasuresAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize,
458 auto const bdd{getTopLevelElementBdd()};
459 auto const basicElements{getDFT()->getBasicElements()};
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());
469 chunkCalculationTemplate(timepoints, chunksize, [&](
auto const currentChunksize,
auto const &timepointsArray,
auto const &indexToProbabilities) {
471 for (
auto &i : bddToProbabilities) {
472 i.second.first =
false;
475 auto const &probabilitiesArray{*recursiveProbabilities(currentChunksize, bdd, indexToProbabilities, bddToProbabilities)};
477 for (
size_t basicElementIndex{0}; basicElementIndex < basicElements.size(); ++basicElementIndex) {
478 auto const &be{basicElements[basicElementIndex]};
480 for (
auto &i : bddToBirnbaumFactors) {
481 i.second.first =
false;
486 auto const index{getSylvanBddManager()->getIndex(be->name())};
487 auto const &birnbaumFactorsArray{
488 *recursiveBirnbaumFactors(currentChunksize, index, bdd, indexToProbabilities, bddToProbabilities, bddToBirnbaumFactors)};
490 auto const &beProbabilitiesArray{indexToProbabilities.at(index)};
492 auto const ImportanceMeasureArray{func(beProbabilitiesArray, probabilitiesArray, birnbaumFactorsArray)};
495 for (
size_t i{0};
i < currentChunksize; ++
i) {
496 resultVector[basicElementIndex].push_back(ImportanceMeasureArray(i));
506struct BirnbaumFunctor {
508 constexpr auto operator()(T
const &beProbability, T
const &probability, T
const &birnbaumFactor)
const {
509 return birnbaumFactor;
515 constexpr T operator()(T
const &beProbability, T
const &probability, T
const &birnbaumFactor)
const {
516 return (beProbability / probability) * birnbaumFactor;
522 constexpr T operator()(T
const &beProbability, T
const &probability, T
const &birnbaumFactor)
const {
523 return beProbability + (beProbability * (1 - beProbability) * birnbaumFactor) / probability;
529 constexpr T operator()(T
const &beProbability, T
const &probability, T
const &birnbaumFactor)
const {
530 return 1 + ((1 - beProbability) * birnbaumFactor) / probability;
536 constexpr T operator()(T
const &beProbability, T
const &probability, T
const &birnbaumFactor)
const {
537 return probability / (probability - beProbability * birnbaumFactor);
543ValueType SFTBDDChecker::getBirnbaumFactorAtTimebound(std::string
const &beName, ValueType timebound) {
544 return getImportanceMeasureAtTimebound(beName, timebound, BirnbaumFunctor{});
547std::vector<ValueType> SFTBDDChecker::getAllBirnbaumFactorsAtTimebound(ValueType timebound) {
548 return getAllImportanceMeasuresAtTimebound(timebound, BirnbaumFunctor{});
551std::vector<ValueType> SFTBDDChecker::getBirnbaumFactorsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
552 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, BirnbaumFunctor{});
555std::vector<std::vector<ValueType>> SFTBDDChecker::getAllBirnbaumFactorsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
556 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, BirnbaumFunctor{});
559ValueType SFTBDDChecker::getCIFAtTimebound(std::string
const &beName, ValueType timebound) {
560 return getImportanceMeasureAtTimebound(beName, timebound, CIFFunctor{});
563std::vector<ValueType> SFTBDDChecker::getAllCIFsAtTimebound(ValueType timebound) {
564 return getAllImportanceMeasuresAtTimebound(timebound, CIFFunctor{});
567std::vector<ValueType> SFTBDDChecker::getCIFsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
568 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, CIFFunctor{});
571std::vector<std::vector<ValueType>> SFTBDDChecker::getAllCIFsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
572 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, CIFFunctor{});
575ValueType SFTBDDChecker::getDIFAtTimebound(std::string
const &beName, ValueType timebound) {
576 return getImportanceMeasureAtTimebound(beName, timebound, DIFFunctor{});
579std::vector<ValueType> SFTBDDChecker::getAllDIFsAtTimebound(ValueType timebound) {
580 return getAllImportanceMeasuresAtTimebound(timebound, DIFFunctor{});
583std::vector<ValueType> SFTBDDChecker::getDIFsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
584 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, DIFFunctor{});
587std::vector<std::vector<ValueType>> SFTBDDChecker::getAllDIFsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
588 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, DIFFunctor{});
591ValueType SFTBDDChecker::getRAWAtTimebound(std::string
const &beName, ValueType timebound) {
592 return getImportanceMeasureAtTimebound(beName, timebound, RAWFunctor{});
595std::vector<ValueType> SFTBDDChecker::getAllRAWsAtTimebound(ValueType timebound) {
596 return getAllImportanceMeasuresAtTimebound(timebound, RAWFunctor{});
599std::vector<ValueType> SFTBDDChecker::getRAWsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
600 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, RAWFunctor{});
603std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRAWsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
604 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, RAWFunctor{});
607ValueType SFTBDDChecker::getRRWAtTimebound(std::string
const &beName, ValueType timebound) {
608 return getImportanceMeasureAtTimebound(beName, timebound, RRWFunctor{});
611std::vector<ValueType> SFTBDDChecker::getAllRRWsAtTimebound(ValueType timebound) {
612 return getAllImportanceMeasuresAtTimebound(timebound, RRWFunctor{});
615std::vector<ValueType> SFTBDDChecker::getRRWsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
616 return getImportanceMeasuresAtTimepoints(beName, timepoints, chunksize, RRWFunctor{});
619std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRRWsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
620 return getAllImportanceMeasuresAtTimepoints(timepoints, chunksize, RRWFunctor{});
623void SFTBDDChecker::recursiveMCS(Bdd
const bdd, std::vector<uint32_t> &buffer, std::vector<std::vector<uint32_t>> &minimalCutSets)
const {
625 minimalCutSets.push_back(buffer);
626 }
else if (!bdd.isZero()) {
627 auto const currentVar{bdd.TopVar()};
629 buffer.push_back(currentVar);
630 recursiveMCS(bdd.Then(), buffer, minimalCutSets);
633 recursiveMCS(bdd.Else(), buffer, minimalCutSets);
638 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager) {
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.");
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.");
650std::shared_ptr<storm::dft::storage::DFT<ValueType>> SFTBDDChecker::getDFT()
const {
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.");
655std::shared_ptr<storm::dft::storage::SylvanBddManager> SFTBDDChecker::getSylvanBddManager()
const {
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.");
661std::shared_ptr<storm::dft::transformations::SftToBddTransformator<ValueType>> SFTBDDChecker::getTransformator()
const {
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.");
667std::vector<std::vector<std::string>> SFTBDDChecker::getMinimalCutSets() {
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.");
673std::vector<std::vector<uint32_t>> SFTBDDChecker::getMinimalCutSetsAsIndices() {
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.");
679ValueType SFTBDDChecker::getBirnbaumFactorAtTimebound(std::string
const &beName,
ValueType timebound) {
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.");
685std::vector<ValueType> SFTBDDChecker::getAllBirnbaumFactorsAtTimebound(
ValueType timebound) {
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.");
691std::vector<ValueType> SFTBDDChecker::getBirnbaumFactorsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
697std::vector<std::vector<ValueType>> SFTBDDChecker::getAllBirnbaumFactorsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
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.");
709std::vector<ValueType> SFTBDDChecker::getAllCIFsAtTimebound(
ValueType timebound) {
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.");
715std::vector<ValueType> SFTBDDChecker::getCIFsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
721std::vector<std::vector<ValueType>> SFTBDDChecker::getAllCIFsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
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.");
733std::vector<ValueType> SFTBDDChecker::getAllDIFsAtTimebound(
ValueType timebound) {
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.");
739std::vector<ValueType> SFTBDDChecker::getDIFsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
745std::vector<std::vector<ValueType>> SFTBDDChecker::getAllDIFsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
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.");
757std::vector<ValueType> SFTBDDChecker::getAllRAWsAtTimebound(
ValueType timebound) {
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.");
763std::vector<ValueType> SFTBDDChecker::getRAWsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
769std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRAWsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
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.");
781std::vector<ValueType> SFTBDDChecker::getAllRRWsAtTimebound(
ValueType timebound) {
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.");
787std::vector<ValueType> SFTBDDChecker::getRRWsAtTimepoints(std::string
const &beName, std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
793std::vector<std::vector<ValueType>> SFTBDDChecker::getAllRRWsAtTimepoints(std::vector<ValueType>
const &timepoints,
size_t chunksize) {
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.");
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.
#define STORM_LOG_THROW(cond, exception, message)
SFTBDDChecker::ValueType ValueType