Storm
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 using Bdd = sylvan::Bdd;
22
24 std::shared_ptr<storm::dft::storage::SylvanBddManager> sylvanBddManager = std::make_shared<storm::dft::storage::SylvanBddManager>(),
25 storm::dft::utility::RelevantEvents relevantEvents = {})
26 : dft{std::move(dft)}, sylvanBddManager{std::move(sylvanBddManager)}, relevantEvents{relevantEvents} {
27 // create Variables for the BEs
28 for (auto const& i : this->dft->getBasicElements()) {
29 // Filter constantBeTrigger
30 if (i->name() != "constantBeTrigger") {
31 variables.push_back(this->sylvanBddManager->createVariable(i->name()));
32 }
33 }
34 }
35
46 auto const tlName{dft->getTopLevelElement()->name()};
47 if (relevantEventBdds.empty()) {
48 relevantEventBdds[tlName] = translate(dft->getTopLevelElement());
49 }
50 // else relevantEventBdds is not empty and we maintain the invariant
51 // that the toplevel event is in there
52 STORM_LOG_ASSERT(relevantEventBdds.count(tlName) == 1, "Not all relevantEvents where transformed into BDDs.");
53
54 return relevantEventBdds[tlName];
55 }
56
67 std::map<std::string, Bdd> const& transformRelevantEvents() {
68 if (relevantEventBdds.empty()) {
69 relevantEventBdds[dft->getTopLevelElement()->name()] = translate(dft->getTopLevelElement());
70 }
71
72 // we maintain the invariant that if relevantEventBdds is not empty
73 // then we have calculated all relevant bdds
74 STORM_LOG_ASSERT(relevantEventBdds.size() == relevantEvents.count(getDFT()), "Not all relevantEvents where transformed into BDDs.");
75
76 return relevantEventBdds;
77 }
78
82 std::vector<uint32_t> const& getDdVariables() const noexcept {
83 return variables;
84 }
85
89 std::shared_ptr<storm::dft::storage::DFT<ValueType>> getDFT() const noexcept {
90 return dft;
91 }
92
96 std::shared_ptr<storm::dft::storage::SylvanBddManager> getSylvanBddManager() const noexcept {
97 return sylvanBddManager;
98 }
99
100 private:
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;
106
113 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType> const> element) {
114 auto isRelevant{relevantEvents.isRelevant(element->name())};
115 if (isRelevant) {
116 auto const it{relevantEventBdds.find(element->name())};
117 if (it != relevantEventBdds.end()) {
118 return it->second;
119 }
120 }
121
122 Bdd rBdd;
123 if (element->isGate()) {
124 rBdd = translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTGate<ValueType> const>(element));
125 } else if (element->isBasicElement()) {
126 rBdd = translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType> const>(element));
127 } else {
128 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
129 "Element of type \"" << element->typestring() << "\" is not supported. Probably not a SFT.");
130 rBdd = sylvanBddManager->getZero();
131 }
132
133 if (isRelevant) {
134 // rBdd can't be in relevantEventBdds
135 // as we would've returned
136 // at the start of the function
137 relevantEventBdds[element->name()] = rBdd;
138 }
139
140 return rBdd;
141 }
142
149 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTGate<ValueType> const> gate) {
151 // used only in conjunctions therefore neutral element -> 1
152 auto tmpBdd{sylvanBddManager->getOne()};
153 for (auto const& child : gate->children()) {
154 tmpBdd &= translate(child);
155 }
156 return tmpBdd;
157 } else if (gate->type() == storm::dft::storage::elements::DFTElementType::OR) {
158 // used only in disjunctions therefore neutral element -> 0
159 auto tmpBdd{sylvanBddManager->getZero()};
160 for (auto const& child : gate->children()) {
161 tmpBdd |= translate(child);
162 }
163 return tmpBdd;
164 } else if (gate->type() == storm::dft::storage::elements::DFTElementType::VOT) {
165 return translate(std::dynamic_pointer_cast<storm::dft::storage::elements::DFTVot<ValueType> const>(gate));
166 }
167 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Gate of type \"" << gate->typestring() << "\" is not supported. Probably not a SFT.");
168 return sylvanBddManager->getZero();
169 }
170
177 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTVot<ValueType> const> vot) {
178 std::vector<Bdd> bdds;
179 bdds.reserve(vot->children().size());
180
181 for (auto const& child : vot->children()) {
182 bdds.push_back(translate(child));
183 }
184
185 auto const rval{translateVot(0, vot->threshold(), bdds)};
186 return rval;
187 }
188
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();
208 }
209
210 auto const notChosenBdd{translateVot(currentIndex + 1, threshold, bdds)};
211 auto const chosenBdd{translateVot(currentIndex + 1, threshold - 1, bdds)};
212
213 return bdds[currentIndex].Ite(chosenBdd, notChosenBdd);
214 }
215
222 Bdd translate(std::shared_ptr<storm::dft::storage::elements::DFTBE<ValueType> const> const basicElement) {
223 return sylvanBddManager->getPositiveLiteral(basicElement->name());
224 }
225};
226
227} // namespace transformations
228} // 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:39
Abstract base class for gates.
Definition DFTGate.h:13
VOT gate with threshold k.
Definition DFTVot.h:14
Bdd const & transformTopLevel()
Transform a sft into a BDD representing the function of the toplevel event.
std::shared_ptr< storm::dft::storage::SylvanBddManager > getSylvanBddManager() const noexcept
std::map< std::string, Bdd > const & transformRelevantEvents()
Transform a sft into BDDs representing the functions of the given Events if they are reachable from t...
std::shared_ptr< storm::dft::storage::DFT< ValueType > > getDFT() const noexcept
std::vector< uint32_t > const & getDdVariables() const noexcept
Get Variables in the order they where inserted.
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
size_t count(std::shared_ptr< storm::dft::storage::DFT< ValueType > > const dft) const
Count the events that are relevant in the given DFT.
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30