22#ifdef STORM_HAVE_SYLVAN
23 using Bdd = sylvan::Bdd;
26#ifdef STORM_HAVE_SYLVAN
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;
106 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
107 "version of Storm with Sylvan support.");
112 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
113 "version of Storm with Sylvan support.");
116 std::shared_ptr<storm::dft::storage::DFT<ValueType>>
getDFT() const noexcept {
118 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
119 "version of Storm with Sylvan support.");
124 "This version of Storm was compiled without support for Sylvan. Yet, a method was called that requires this support. Please choose a "
125 "version of Storm with Sylvan support.");
130#ifdef STORM_HAVE_SYLVAN
131 std::map<std::string, Bdd> relevantEventBdds{};
132 std::vector<uint32_t> variables{};
133 std::shared_ptr<storm::dft::storage::DFT<ValueType>>
dft;
134 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager;
144 auto isRelevant{relevantEvents.
isRelevant(element->name())};
146 auto const it{relevantEventBdds.find(element->name())};
147 if (it != relevantEventBdds.end()) {
153 if (element->isGate()) {
154 rBdd = translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTGate<ValueType>
const>(element));
155 }
else if (element->isBasicElement()) {
156 rBdd = translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(element));
159 "Element of type \"" << element->typestring() <<
"\" is not supported. Probably not a SFT.");
160 rBdd = sylvanBddManager->getZero();
167 relevantEventBdds[element->name()] = rBdd;
179 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTGate<ValueType>
const> gate) {
182 auto tmpBdd{sylvanBddManager->getOne()};
183 for (
auto const& child : gate->children()) {
184 tmpBdd &= translate(child);
189 auto tmpBdd{sylvanBddManager->getZero()};
190 for (
auto const& child : gate->children()) {
191 tmpBdd |= translate(child);
195 return translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTVot<ValueType>
const>(gate));
197 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Gate of type \"" << gate->typestring() <<
"\" is not supported. Probably not a SFT.");
198 return sylvanBddManager->getZero();
207 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTVot<ValueType>
const> vot) {
208 std::vector<Bdd> bdds;
209 bdds.reserve(vot->children().size());
211 for (
auto const& child : vot->children()) {
212 bdds.push_back(translate(child));
215 auto const rval{translateVot(0, vot->threshold(), bdds)};
233 Bdd translateVot(
size_t const currentIndex,
size_t const threshold, std::vector<Bdd>
const& bdds)
const {
234 if (threshold == 0) {
235 return sylvanBddManager->getOne();
236 }
else if (currentIndex >= bdds.size()) {
237 return sylvanBddManager->getZero();
240 auto const notChosenBdd{translateVot(currentIndex + 1, threshold, bdds)};
241 auto const chosenBdd{translateVot(currentIndex + 1, threshold - 1, bdds)};
243 return bdds[currentIndex].Ite(chosenBdd, notChosenBdd);
252 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTBE<ValueType>
const>
const basicElement) {
253 return sylvanBddManager->getPositiveLiteral(basicElement->name());