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