Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DftJsonExporter.cpp
Go to the documentation of this file.
1#include "DftJsonExporter.h"
2
3#include <algorithm>
4#include <string>
5
10#include "storm/io/file.h"
11
12namespace storm::dft {
13namespace storage {
14
15template<typename ValueType>
16void DftJsonExporter<ValueType>::toFile(storm::dft::storage::DFT<ValueType> const& dft, std::string const& filepath) {
17 std::ofstream stream;
18 storm::io::openFile(filepath, stream);
19 toStream(dft, stream);
21}
22
23template<typename ValueType>
25 os << storm::dumpJson(translate(dft)) << '\n';
26}
27
28template<typename ValueType>
29typename DftJsonExporter<ValueType>::Json DftJsonExporter<ValueType>::translate(storm::dft::storage::DFT<ValueType> const& dft) {
30 Json jsonDft;
31 // Top level element
32 jsonDft["toplevel"] = std::to_string(dft.getTopLevelIndex());
33 // Parameters
34 Json jsonParameters = translateParameters(dft);
35 if (!jsonParameters.empty()) {
36 jsonDft["parameters"] = jsonParameters;
37 }
38 // Nodes
39 Json jsonNodes;
40 for (size_t i = 0; i < dft.nrElements(); ++i) {
41 jsonNodes.push_back(translateElement(dft.getElement(i)));
42 }
43 jsonDft["nodes"] = jsonNodes;
44 return jsonDft;
45}
46
47template<>
48typename DftJsonExporter<storm::RationalFunction>::Json DftJsonExporter<storm::RationalFunction>::translateParameters(
50 Json jsonParameters;
51 for (auto const& parameter : storm::dft::storage::getParameters(dft)) {
52 std::stringstream stream;
53 stream << parameter;
54 jsonParameters.push_back(stream.str());
55 }
56 return jsonParameters;
57}
58
59template<typename ValueType>
60typename DftJsonExporter<ValueType>::Json DftJsonExporter<ValueType>::translateParameters(storm::dft::storage::DFT<ValueType> const& dft) {
61 // No parameters for non-parametric models
62 return Json::array();
63}
64
65template<typename ValueType>
66typename DftJsonExporter<ValueType>::Json DftJsonExporter<ValueType>::translateElement(DFTElementCPointer element) {
67 Json nodeData;
68 nodeData["id"] = std::to_string(element->id());
69 nodeData["name"] = element->name();
70 std::string type = storm::dft::storage::elements::toString(element->type());
71 // Make lower case
72 std::transform(type.begin(), type.end(), type.begin(), ::tolower);
73 nodeData["type"] = type;
74 if (element->isRelevant()) {
75 nodeData["relevant"] = true;
76 }
77
78 if (element->isGate() || element->isRestriction()) {
79 // Set children for gate/restriction
80 auto elemWithChildren = std::static_pointer_cast<storm::dft::storage::elements::DFTChildren<ValueType> const>(element);
81 std::vector<std::string> children;
82 for (auto const& child : elemWithChildren->children()) {
83 children.push_back(std::to_string(child->id()));
84 }
85 nodeData["children"] = children;
86
87 // Set additional parameters
88 switch (element->type()) {
90 nodeData["voting"] = std::static_pointer_cast<storm::dft::storage::elements::DFTVot<ValueType> const>(element)->threshold();
91 break;
93 nodeData["inclusive"] = std::static_pointer_cast<storm::dft::storage::elements::DFTPand<ValueType> const>(element)->isInclusive();
94 break;
96 nodeData["inclusive"] = std::static_pointer_cast<storm::dft::storage::elements::DFTPor<ValueType> const>(element)->isInclusive();
97 break;
103 // No additional parameters
104 break;
105 default:
106 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
107 "Element '" << element->name() << "' of type '" << element->type() << "' is not supported.");
108 }
109 } else if (element->isDependency()) {
110 // Set children for dependency
111 auto dependency = std::static_pointer_cast<storm::dft::storage::elements::DFTDependency<ValueType> const>(element);
112 std::vector<std::string> children;
113 children.push_back(std::to_string(dependency->triggerEvent()->id()));
114 for (auto const& child : dependency->dependentEvents()) {
115 children.push_back(std::to_string(child->id()));
116 }
117 nodeData["children"] = children;
118 if (storm::utility::isOne<ValueType>(dependency->probability())) {
119 nodeData["type"] = "fdep";
120 } else {
121 std::stringstream stream;
122 stream << dependency->probability();
123 nodeData["probability"] = stream.str();
124 }
125 } else if (element->isBasicElement()) {
126 DFTBECPointer be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType> const>(element);
127 nodeData = translateBE(be, nodeData);
128 } else {
129 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
130 "Element '" << element->name() << "' of type '" << element->type() << "' is not supported.");
131 }
132
133 Json jsonNode;
134 jsonNode["data"] = nodeData;
135 jsonNode["group"] = "nodes";
136 jsonNode["classes"] = type;
137 return jsonNode;
138}
139
140template<typename ValueType>
141typename DftJsonExporter<ValueType>::Json DftJsonExporter<ValueType>::translateBE(DFTBECPointer be, Json nodeData) {
142 std::string distributionType = storm::dft::storage::elements::toString(be->beType());
143 // Make lower case
144 std::transform(distributionType.begin(), distributionType.end(), distributionType.begin(), ::tolower);
145 nodeData["distribution"] = distributionType;
146
147 // Add distribution specific information
148 switch (be->beType()) {
150 auto beConst = std::static_pointer_cast<storm::dft::storage::elements::BEConst<ValueType> const>(be);
151 nodeData["failed"] = beConst->failed();
152 return nodeData;
153 }
155 auto beProb = std::static_pointer_cast<storm::dft::storage::elements::BEProbability<ValueType> const>(be);
156 std::stringstream stream;
157 stream << beProb->activeFailureProbability();
158 nodeData["prob"] = stream.str();
159 stream.str(std::string()); // Clear stringstream
160 stream << beProb->dormancyFactor();
161 nodeData["dorm"] = stream.str();
162 return nodeData;
163 }
165 auto beExp = std::static_pointer_cast<storm::dft::storage::elements::BEExponential<ValueType> const>(be);
166 std::stringstream stream;
167 stream << beExp->activeFailureRate();
168 nodeData["rate"] = stream.str();
169 stream.str(std::string()); // Clear stringstream
170 stream << beExp->dormancyFactor();
171 nodeData["dorm"] = stream.str();
172 nodeData["transient"] = beExp->isTransient();
173 return nodeData;
174 }
176 auto beErlang = std::static_pointer_cast<storm::dft::storage::elements::BEErlang<ValueType> const>(be);
177 std::stringstream stream;
178 stream << beErlang->activeFailureRate();
179 nodeData["rate"] = stream.str();
180 nodeData["phases"] = beErlang->phases();
181 stream.str(std::string()); // Clear stringstream
182 stream << beErlang->dormancyFactor();
183 nodeData["dorm"] = stream.str();
184 return nodeData;
185 }
187 auto beWeibull = std::static_pointer_cast<storm::dft::storage::elements::BEWeibull<ValueType> const>(be);
188 std::stringstream stream;
189 stream << beWeibull->shape();
190 nodeData["shape"] = stream.str();
191 stream.str(std::string()); // Clear stringstream
192 stream << beWeibull->rate();
193 nodeData["rate"] = stream.str();
194 return nodeData;
195 }
197 auto beLogNormal = std::static_pointer_cast<storm::dft::storage::elements::BELogNormal<ValueType> const>(be);
198 std::stringstream stream;
199 stream << beLogNormal->mean();
200 nodeData["mean"] = stream.str();
201 stream.str(std::string()); // Clear stringstream
202 stream << beLogNormal->standardDeviation();
203 nodeData["stddev"] = stream.str();
204 return nodeData;
205 }
206 default:
207 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "BE of type '" << be->beType() << "' is not known.");
208 return nodeData;
209 }
210}
211
212// Explicitly instantiate the class.
213template class DftJsonExporter<double>;
214template class DftJsonExporter<storm::RationalFunction>;
215
216} // namespace storage
217} // namespace storm::dft
Represents a Dynamic Fault Tree.
Definition DFT.h:52
size_t getTopLevelIndex() const
Definition DFT.h:107
DFTElementCPointer getElement(size_t index) const
Get a pointer to an element in the DFT.
Definition DFT.h:189
size_t nrElements() const
Definition DFT.h:95
Exports a DFT into the JSON format.
static void toFile(storm::dft::storage::DFT< ValueType > const &dft, std::string const &filepath)
Export DFT to given file.
static void toStream(storm::dft::storage::DFT< ValueType > const &dft, std::ostream &os)
Export DFT to given stream.
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
std::string toString(DFTElementType const &type)
std::set< storm::RationalFunctionVariable > getParameters(DFT< storm::RationalFunction > const &dft)
Get all rate/probability parameters occurring in the DFT.
Definition DFT.cpp:825
void closeFile(std::ofstream &stream)
Close the given file after writing.
Definition file.h:47
void openFile(std::string const &filepath, std::ofstream &filestream, bool append=false, bool silent=false)
Open the given file for writing.
Definition file.h:18
std::string dumpJson(storm::json< ValueType > const &j, bool compact)
Dumps the given json object, producing a String.