Browse Source

First version of SMT solver integration for DFT analysis

main
Alexander Bork 6 years ago
parent
commit
29b0c4a78f
  1. 3
      src/storm-dft-cli/storm-dft.cpp
  2. 28
      src/storm-dft/api/storm-dft.cpp
  3. 11
      src/storm-dft/api/storm-dft.h
  4. 2
      src/storm-dft/modelchecker/dft/DFTASFChecker.cpp
  5. 4
      src/storm-dft/modelchecker/dft/DFTASFChecker.h

3
src/storm-dft-cli/storm-dft.cpp

@ -76,8 +76,7 @@ void processOptions() {
if (faultTreeSettings.solveWithSMT()) {
// Solve with SMT
STORM_LOG_DEBUG("Running DFT analysis with use of SMT");
storm::api::exportDFTToSMT(*dft, "test.smt2");
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Only exported to SMT file 'test.smt2' but analysis is not supported.");
storm::api::analyzeDFTSMT(*dft, true);
return;
}
#endif

28
src/storm-dft/api/storm-dft.cpp

@ -42,6 +42,34 @@ namespace storm {
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Export to SMT does not support this data type.");
}
template<>
std::vector<storm::solver::SmtSolver::CheckResult>
analyzeDFTSMT(storm::storage::DFT<double> const &dft, bool printOutput) {
storm::modelchecker::DFTASFChecker smtChecker(dft);
smtChecker.convert();
std::vector<storm::solver::SmtSolver::CheckResult> results = smtChecker.toSolver();
if (printOutput) {
for (size_t i = 0; i < results.size(); ++i) {
std::string tmp = "unknonwn";
if (results.at(i) == storm::solver::SmtSolver::CheckResult::Sat) {
tmp = "SAT";
} else if (results.at(i) == storm::solver::SmtSolver::CheckResult::Unsat) {
tmp = "UNSAT";
}
std::cout << "Query " << std::to_string(i) << " : " << tmp << std::endl;
}
}
return results;
}
template<>
std::vector<storm::solver::SmtSolver::CheckResult>
analyzeDFTSMT(storm::storage::DFT<storm::RationalFunction> const &dft, bool printOutput) {
STORM_LOG_THROW(false, storm::exceptions::NotSupportedException,
"Analysis by SMT not supported for this data type.");
}
template<>
std::pair<std::shared_ptr<storm::gspn::GSPN>, uint64_t> transformToGSPN(storm::storage::DFT<double> const& dft) {
storm::settings::modules::FaultTreeSettings const& ftSettings = storm::settings::getModule<storm::settings::modules::FaultTreeSettings>();

11
src/storm-dft/api/storm-dft.h

@ -112,6 +112,17 @@ namespace storm {
return results;
}
/*!
* Analyze the DFT using the SMT encoding
*
* @param dft DFT.
*
* @return Result result vector
*/
template<typename ValueType>
std::vector<storm::solver::SmtSolver::CheckResult>
analyzeDFTSMT(storm::storage::DFT<ValueType> const &dft, bool printOutput);
/*!
* Export DFT to JSON file.
*

2
src/storm-dft/modelchecker/dft/DFTASFChecker.cpp

@ -14,7 +14,7 @@
namespace storm {
namespace modelchecker {
DFTASFChecker::DFTASFChecker(storm::storage::DFT<double> const& dft) : dft(dft) {
DFTASFChecker::DFTASFChecker(storm::storage::DFT<ValueType> const &dft) : dft(dft) {
// Intentionally left empty.
}

4
src/storm-dft/modelchecker/dft/DFTASFChecker.h

@ -24,8 +24,8 @@ namespace storm {
uint64_t spareIndex;
uint64_t childIndex;
};
class DFTASFChecker {
using ValueType = double;
public:

Loading…
Cancel
Save