21 using Bdd = sylvan::Bdd;
24 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager = std::make_shared<storm::dft::storage::SylvanBddManager>(),
26 : dft{
std::move(dft)}, sylvanBddManager{
std::move(sylvanBddManager)}, relevantEvents{relevantEvents} {
28 for (
auto const& i : this->dft->getBasicElements()) {
30 if (i->name() !=
"constantBeTrigger") {
31 variables.push_back(this->sylvanBddManager->createVariable(i->name()));
46 auto const tlName{dft->getTopLevelElement()->name()};
47 if (relevantEventBdds.empty()) {
48 relevantEventBdds[tlName] = translate(dft->getTopLevelElement());
52 STORM_LOG_ASSERT(relevantEventBdds.count(tlName) == 1,
"Not all relevantEvents where transformed into BDDs.");
54 return relevantEventBdds[tlName];
68 if (relevantEventBdds.empty()) {
69 relevantEventBdds[dft->getTopLevelElement()->name()] = translate(dft->getTopLevelElement());
74 STORM_LOG_ASSERT(relevantEventBdds.size() == relevantEvents.
count(
getDFT()),
"Not all relevantEvents where transformed into BDDs.");
76 return relevantEventBdds;
89 std::shared_ptr<storm::dft::storage::DFT<ValueType>>
getDFT() const noexcept {
97 return sylvanBddManager;
101 std::map<std::string, Bdd> relevantEventBdds{};
102 std::vector<uint32_t> variables{};
103 std::shared_ptr<storm::dft::storage::DFT<ValueType>> dft;
104 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager;
114 auto isRelevant{relevantEvents.
isRelevant(element->name())};
116 auto const it{relevantEventBdds.find(element->name())};
117 if (it != relevantEventBdds.end()) {
123 if (element->isGate()) {
125 }
else if (element->isBasicElement()) {
129 "Element of type \"" << element->typestring() <<
"\" is not supported. Probably not a SFT.");
130 rBdd = sylvanBddManager->getZero();
137 relevantEventBdds[element->name()] = rBdd;
152 auto tmpBdd{sylvanBddManager->getOne()};
153 for (
auto const& child : gate->children()) {
154 tmpBdd &= translate(child);
159 auto tmpBdd{sylvanBddManager->getZero()};
160 for (
auto const& child : gate->children()) {
161 tmpBdd |= translate(child);
167 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Gate of type \"" << gate->typestring() <<
"\" is not supported. Probably not a SFT.");
168 return sylvanBddManager->getZero();
178 std::vector<Bdd> bdds;
179 bdds.reserve(vot->children().size());
181 for (
auto const& child : vot->children()) {
182 bdds.push_back(translate(child));
185 auto const rval{translateVot(0, vot->threshold(), bdds)};
203 Bdd translateVot(
size_t const currentIndex,
size_t const threshold, std::vector<Bdd>
const& bdds)
const {
204 if (threshold == 0) {
205 return sylvanBddManager->getOne();
206 }
else if (currentIndex >= bdds.size()) {
207 return sylvanBddManager->getZero();
210 auto const notChosenBdd{translateVot(currentIndex + 1, threshold, bdds)};
211 auto const chosenBdd{translateVot(currentIndex + 1, threshold - 1, bdds)};
213 return bdds[currentIndex].Ite(chosenBdd, notChosenBdd);
223 return sylvanBddManager->getPositiveLiteral(basicElement->name());