21#ifdef STORM_HAVE_SYLVAN
22 using Bdd = sylvan::Bdd;
25#ifdef STORM_HAVE_SYLVAN
27 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager = std::make_shared<storm::dft::storage::SylvanBddManager>(),
29 : dft{std::move(dft)}, sylvanBddManager{std::move(sylvanBddManager)}, relevantEvents{relevantEvents} {
31 for (
auto const& i : this->dft->getBasicElements()) {
33 if (i->name() !=
"constantBeTrigger") {
34 variables.push_back(this->sylvanBddManager->createVariable(i->name()));
48 Bdd
const& transformTopLevel() {
49 auto const tlName{dft->getTopLevelElement()->name()};
50 if (relevantEventBdds.empty()) {
51 relevantEventBdds[tlName] = translate(dft->getTopLevelElement());
55 STORM_LOG_ASSERT(relevantEventBdds.count(tlName) == 1,
"Not all relevantEvents where transformed into BDDs.");
57 return relevantEventBdds[tlName];
70 std::map<std::string, Bdd>
const& transformRelevantEvents() {
71 if (relevantEventBdds.empty()) {
72 relevantEventBdds[dft->getTopLevelElement()->name()] = translate(dft->getTopLevelElement());
77 STORM_LOG_ASSERT(relevantEventBdds.size() == relevantEvents.count(
getDFT()),
"Not all relevantEvents where transformed into BDDs.");
79 return relevantEventBdds;
92 std::shared_ptr<storm::dft::storage::DFT<ValueType>>
getDFT()
const noexcept {
99 std::shared_ptr<storm::dft::storage::SylvanBddManager>
getSylvanBddManager()
const noexcept {
100 return sylvanBddManager;
104 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager = std::make_shared<storm::dft::storage::SylvanBddManager>(),
107 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
108 "version of Storm with Sylvan support.");
113 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
114 "version of Storm with Sylvan support.");
117 std::shared_ptr<storm::dft::storage::DFT<ValueType>>
getDFT() const noexcept {
119 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
120 "version of Storm with Sylvan support.");
125 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
126 "version of Storm with Sylvan support.");
131#ifdef STORM_HAVE_SYLVAN
132 std::map<std::string, Bdd> relevantEventBdds{};
133 std::vector<uint32_t> variables{};
134 std::shared_ptr<storm::dft::storage::DFT<ValueType>> dft;
135 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager;
145 auto isRelevant{relevantEvents.
isRelevant(element->name())};
147 auto const it{relevantEventBdds.find(element->name())};
148 if (it != relevantEventBdds.end()) {
154 if (element->isGate()) {
156 }
else if (element->isBasicElement()) {
160 "Element of type \"" << element->typestring() <<
"\" is not supported. Probably not a SFT.");
161 rBdd = sylvanBddManager->getZero();
168 relevantEventBdds[element->name()] = rBdd;
183 auto tmpBdd{sylvanBddManager->getOne()};
184 for (
auto const& child : gate->children()) {
185 tmpBdd &= translate(child);
190 auto tmpBdd{sylvanBddManager->getZero()};
191 for (
auto const& child : gate->children()) {
192 tmpBdd |= translate(child);
198 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Gate of type \"" << gate->typestring() <<
"\" is not supported. Probably not a SFT.");
199 return sylvanBddManager->getZero();
209 std::vector<Bdd> bdds;
210 bdds.reserve(vot->children().size());
212 for (
auto const& child : vot->children()) {
213 bdds.push_back(translate(child));
216 auto const rval{translateVot(0, vot->threshold(), bdds)};
234 Bdd translateVot(
size_t const currentIndex,
size_t const threshold, std::vector<Bdd>
const& bdds)
const {
235 if (threshold == 0) {
236 return sylvanBddManager->getOne();
237 }
else if (currentIndex >= bdds.size()) {
238 return sylvanBddManager->getZero();
241 auto const notChosenBdd{translateVot(currentIndex + 1, threshold, bdds)};
242 auto const chosenBdd{translateVot(currentIndex + 1, threshold - 1, bdds)};
244 return bdds[currentIndex].Ite(chosenBdd, notChosenBdd);
254 return sylvanBddManager->getPositiveLiteral(basicElement->name());