Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SftToBddTransformator.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <vector>
5
11
12namespace storm::dft {
13namespace transformations {
14
18template<typename ValueType>
20 public:
21#ifdef STORM_HAVE_SYLVAN
22 using Bdd = sylvan::Bdd;
23#endif
24
25#ifdef STORM_HAVE_SYLVAN
27 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager = std::make_shared<storm::dft::storage::SylvanBddManager>(),
28 storm::dft::utility::RelevantEvents relevantEvents = {})
29 : dft{std::move(dft)}, sylvanBddManager{std::move(sylvanBddManager)}, relevantEvents{relevantEvents} {
30 // create Variables for the BEs
31 for (auto const& i : this->dft->getBasicElements()) {
32 // Filter constantBeTrigger
33 if (i->name() != "constantBeTrigger") {
34 variables.push_back(this->sylvanBddManager->createVariable(i->name()));
35 }
36 }
37 }
38
48 Bdd const& transformTopLevel() {
49 auto const tlName{dft->getTopLevelElement()->name()};
50 if (relevantEventBdds.empty()) {
51 relevantEventBdds[tlName] = translate(dft->getTopLevelElement());
52 }
53 // else relevantEventBdds is not empty and we maintain the invariant
54 // that the toplevel event is in there
55 STORM_LOG_ASSERT(relevantEventBdds.count(tlName) == 1, "Not all relevantEvents where transformed into BDDs.");
56
57 return relevantEventBdds[tlName];
58 }
59
70 std::map<std::string, Bdd> const& transformRelevantEvents() {
71 if (relevantEventBdds.empty()) {
72 relevantEventBdds[dft->getTopLevelElement()->name()] = translate(dft->getTopLevelElement());
73 }
74
75 // we maintain the invariant that if relevantEventBdds is not empty
76 // then we have calculated all relevant bdds
77 STORM_LOG_ASSERT(relevantEventBdds.size() == relevantEvents.count(getDFT()), "Not all relevantEvents where transformed into BDDs.");
78
79 return relevantEventBdds;
80 }
81
85 std::vector<uint32_t> const& getDdVariables() const noexcept {
86 return variables;
87 }
88
92 std::shared_ptr<storm::dft::storage::DFT<ValueType>> getDFT() const noexcept {
93 return dft;
94 }
95
99 std::shared_ptr<storm::dft::storage::SylvanBddManager> getSylvanBddManager() const noexcept {
100 return sylvanBddManager;
101 }
102#else
104 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager = std::make_shared<storm::dft::storage::SylvanBddManager>(),
105 storm::dft::utility::RelevantEvents relevantEvents = {}) {
106 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
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.");
109 }
110
111 std::vector<uint32_t> const& getDdVariables() const noexcept {
112 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
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.");
115 }
116
117 std::shared_ptr<storm::dft::storage::DFT<ValueType>> getDFT() const noexcept {
118 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
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.");
121 }
122
123 std::shared_ptr<storm::dft::storage::SylvanBddManager> getSylvanBddManager() const noexcept {
124 STORM_LOG_THROW(false, storm::exceptions::MissingLibraryException,
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.");
127 }
128#endif
129
130 private:
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;
137
144 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType> const> element) {
145 auto isRelevant{relevantEvents.isRelevant(element->name())};
146 if (isRelevant) {
147 auto const it{relevantEventBdds.find(element->name())};
148 if (it != relevantEventBdds.end()) {
149 return it->second;
150 }
151 }
152
153 Bdd rBdd;
154 if (element->isGate()) {
155 rBdd = translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTGate<ValueType> const>(element));
156 } else if (element->isBasicElement()) {
157 rBdd = translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType> const>(element));
158 } else {
159 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
160 "Element of type \"" << element->typestring() << "\" is not supported. Probably not a SFT.");
161 rBdd = sylvanBddManager->getZero();
162 }
163
164 if (isRelevant) {
165 // rBdd can't be in relevantEventBdds
166 // as we would've returned
167 // at the start of the function
168 relevantEventBdds[element->name()] = rBdd;
169 }
170
171 return rBdd;
172 }
173
180 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTGate<ValueType> const> gate) {
182 // used only in conjunctions therefore neutral element -> 1
183 auto tmpBdd{sylvanBddManager->getOne()};
184 for (auto const& child : gate->children()) {
185 tmpBdd &= translate(child);
186 }
187 return tmpBdd;
188 } else if (gate->type() == storm::dft::storage::elements::DFTElementType::OR) {
189 // used only in disjunctions therefore neutral element -> 0
190 auto tmpBdd{sylvanBddManager->getZero()};
191 for (auto const& child : gate->children()) {
192 tmpBdd |= translate(child);
193 }
194 return tmpBdd;
195 } else if (gate->type() == storm::dft::storage::elements::DFTElementType::VOT) {
196 return translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTVot<ValueType> const>(gate));
197 }
198 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Gate of type \"" << gate->typestring() << "\" is not supported. Probably not a SFT.");
199 return sylvanBddManager->getZero();
200 }
201
208 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTVot<ValueType> const> vot) {
209 std::vector<Bdd> bdds;
210 bdds.reserve(vot->children().size());
211
212 for (auto const& child : vot->children()) {
213 bdds.push_back(translate(child));
214 }
215
216 auto const rval{translateVot(0, vot->threshold(), bdds)};
217 return rval;
218 }
219
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();
239 }
240
241 auto const notChosenBdd{translateVot(currentIndex + 1, threshold, bdds)};
242 auto const chosenBdd{translateVot(currentIndex + 1, threshold - 1, bdds)};
243
244 return bdds[currentIndex].Ite(chosenBdd, notChosenBdd);
245 }
246
253 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTBE<ValueType> const> const basicElement) {
254 return sylvanBddManager->getPositiveLiteral(basicElement->name());
255 }
256#endif
257};
258
259} // namespace transformations
260} // namespace storm::dft
Represents a Dynamic Fault Tree.
Definition DFT.h:52
Abstract base class for basic events (BEs) in DFTs.
Definition DFTBE.h:14
Abstract base class for DFT elements.
Definition DFTElement.h:38
Abstract base class for gates.
Definition DFTGate.h:13
VOT gate with threshold k.
Definition DFTVot.h:14
std::shared_ptr< storm::dft::storage::SylvanBddManager > getSylvanBddManager() const noexcept
std::shared_ptr< storm::dft::storage::DFT< ValueType > > getDFT() const noexcept
std::vector< uint32_t > const & getDdVariables() const noexcept
SftToBddTransformator(std::shared_ptr< storm::dft::storage::DFT< ValueType > > dft, std::shared_ptr< storm::dft::storage::SylvanBddManager > sylvanBddManager=std::make_shared< storm::dft::storage::SylvanBddManager >(), storm::dft::utility::RelevantEvents relevantEvents={})
bool isRelevant(std::string const &name) const
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30