22 auto const& dftIOSettings = storm::settings::getModule<storm::dft::settings::modules::DftIOSettings>();
23 auto const& faultTreeSettings = storm::settings::getModule<storm::dft::settings::modules::FaultTreeSettings>();
24 auto const& ioSettings = storm::settings::getModule<storm::settings::modules::IOSettings>();
25 auto const& dftGspnSettings = storm::settings::getModule<storm::dft::settings::modules::DftGspnSettings>();
26 auto const& transformationSettings = storm::settings::getModule<storm::settings::modules::TransformationSettings>();
29 std::shared_ptr<storm::dft::storage::DFT<ValueType>> dft;
30 if (dftIOSettings.isDftFileSet()) {
31 STORM_LOG_DEBUG(
"Loading DFT from Galileo file " << dftIOSettings.getDftFilename());
32 dft = storm::dft::api::loadDFTGalileoFile<ValueType>(dftIOSettings.getDftFilename());
33 }
else if (dftIOSettings.isDftJsonFileSet()) {
34 STORM_LOG_DEBUG(
"Loading DFT from Json file " << dftIOSettings.getDftJsonFilename());
35 dft = storm::dft::api::loadDFTJsonFile<ValueType>(dftIOSettings.getDftJsonFilename());
37 STORM_LOG_THROW(
false, storm::exceptions::InvalidSettingsException,
"No input model given.");
41 if (dftIOSettings.isShowDftStatisticsSet()) {
42 dft->writeStatsToStream(std::cout);
47 if (dftIOSettings.isExportToJson()) {
48 storm::dft::api::exportDFTToJsonFile<ValueType>(*dft, dftIOSettings.getExportJsonFilename());
53 STORM_LOG_THROW(wellFormedResult.first, storm::exceptions::UnmetRequirementException,
"DFT is not well-formed: " << wellFormedResult.second);
59 if (dftGspnSettings.isTransformToGspn()) {
61 std::shared_ptr<storm::gspn::GSPN> gspn = pair.first;
62 uint64_t toplevelFailedPlace = pair.second;
74 if (dftIOSettings.isExportToSmt()) {
75 storm::dft::api::exportDFTToSMT<ValueType>(*dft, dftIOSettings.getExportSmtFilename());
80 uint64_t solverTimeout = 10;
82 if (faultTreeSettings.solveWithSMT()) {
97 STORM_LOG_DEBUG(
"BE failure bounds: lower bound: " << bounds.first <<
", upper bound: " << bounds.second <<
".");
109 if (dftIOSettings.isExportToBddDot() || dftIOSettings.isAnalyzeWithBdds() || dftIOSettings.isMinimalCutSets() || dftIOSettings.isImportanceMeasureSet()) {
110 bool const isImportanceMeasureSet{dftIOSettings.isImportanceMeasureSet()};
111 bool const isMinimalCutSets{dftIOSettings.isMinimalCutSets()};
112 bool const isMTTF{dftIOSettings.usePropExpectedTime()};
113 double const mttfPrecision{faultTreeSettings.getMttfPrecision()};
114 double const mttfStepsize{faultTreeSettings.getMttfStepsize()};
115 std::string
const mttfAlgorithm{faultTreeSettings.getMttfAlgorithm()};
116 bool const isExportToBddDot{dftIOSettings.isExportToBddDot()};
117 bool const isTimebound{dftIOSettings.usePropTimebound()};
118 bool const isTimepoints{dftIOSettings.usePropTimepoints()};
120 bool const probabilityAnalysis{ioSettings.isPropertySet() || !isImportanceMeasureSet};
121 size_t const chunksize{faultTreeSettings.getChunksize()};
122 bool const isModularisation{faultTreeSettings.useModularisation()};
124 std::vector<double> timepoints{};
126 timepoints = dftIOSettings.getPropTimepoints();
129 timepoints.push_back(dftIOSettings.getPropTimebound());
132 std::string filename{
""};
133 if (isExportToBddDot) {
134 filename = dftIOSettings.getExportBddDotFilename();
138 std::vector<std::shared_ptr<storm::logic::Formula const>> manuallyInputtedProperties;
139 if (ioSettings.isPropertySet()) {
143 std::string importanceMeasureName{
""};
144 if (isImportanceMeasureSet) {
145 importanceMeasureName = dftIOSettings.getImportanceMeasure();
149 if (dftIOSettings.isVariableOrderingFileSet()) {
151 dft->setBEOrder(beOrder);
154 auto const additionalRelevantEventNames{faultTreeSettings.getRelevantEvents()};
155 storm::dft::api::analyzeDFTBdd<ValueType>(dft, isExportToBddDot, filename, isMTTF, mttfPrecision, mttfStepsize, mttfAlgorithm, isMinimalCutSets,
156 probabilityAnalysis, isModularisation, importanceMeasureName, timepoints, manuallyInputtedProperties,
157 additionalRelevantEventNames, chunksize);
160 if (dftIOSettings.isAnalyzeWithBdds()) {
168 std::string optimizationDirection =
"min";
169 if (dftIOSettings.isComputeMaximalValue()) {
170 optimizationDirection =
"max";
175 std::vector<std::string> properties;
176 if (ioSettings.isPropertySet()) {
177 properties.push_back(ioSettings.getProperty());
179 if (dftIOSettings.usePropExpectedTime()) {
180 properties.push_back(
"T" + optimizationDirection +
"=? [F \"failed\"]");
182 if (dftIOSettings.usePropProbability()) {
183 properties.push_back(
"P" + optimizationDirection +
"=? [F \"failed\"]");
185 if (dftIOSettings.usePropTimebound()) {
186 std::stringstream stream;
187 stream <<
"P" << optimizationDirection <<
"=? [F<=" << dftIOSettings.getPropTimebound() <<
" \"failed\"]";
188 properties.push_back(stream.str());
190 if (dftIOSettings.usePropTimepoints()) {
191 for (
double timepoint : dftIOSettings.getPropTimepoints()) {
192 std::stringstream stream;
193 stream <<
"P" << optimizationDirection <<
"=? [F<=" << timepoint <<
" \"failed\"]";
194 properties.push_back(stream.str());
199 std::vector<std::shared_ptr<storm::logic::Formula const>> props;
200 if (!properties.empty()) {
201 std::string propString;
202 for (
size_t i = 0; i < properties.size(); ++i) {
203 propString += properties[i];
204 if (i + 1 < properties.size()) {
212 std::vector<std::string> additionalRelevantEventNames;
213 if (faultTreeSettings.areRelevantEventsSet()) {
215 additionalRelevantEventNames = faultTreeSettings.getRelevantEvents();
216 }
else if (faultTreeSettings.isDisableDC()) {
218 additionalRelevantEventNames = {
"all"};
223 dft = storm::dft::api::prepareForMarkovAnalysis<ValueType>(*dft);
224 STORM_LOG_DEBUG(
"DFT after preparation for Markov analysis:\n" << dft->getElementsString());
236 STORM_LOG_WARN(
"No property given. No analysis will be performed.");
238 double approximationError = 0.0;
239 if (faultTreeSettings.isApproximationErrorSet()) {
240 approximationError = faultTreeSettings.getApproximationError();
242 storm::dft::api::analyzeDFT<ValueType>(*dft, props, faultTreeSettings.useSymmetryReduction(), faultTreeSettings.useModularisation(), relevantEvents,
243 faultTreeSettings.isAllowDCForRelevantEvents(), approximationError,
244 faultTreeSettings.getApproximationHeuristic(), transformationSettings.isChainEliminationSet(),
245 transformationSettings.getLabelBehavior(),
true);