4 changed files with 194 additions and 1 deletions
-
120src/builder/DftSmtBuilder.cpp
-
49src/builder/DftSmtBuilder.h
-
12src/settings/modules/DFTSettings.cpp
-
12src/settings/modules/DFTSettings.h
@ -0,0 +1,120 @@ |
|||||
|
#include "src/builder/DFTSMTBuilder.h"
|
||||
|
#include "src/exceptions/NotImplementedException.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace builder { |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
DFTSMTBuilder<ValueType>::DFTSMTBuilder() : manager(std::make_shared<storm::expressions::ExpressionManager>()) { |
||||
|
solver = storm::utility::solver::SmtSolverFactory().create(*manager); |
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
void DFTSMTBuilder<ValueType>::convertToSMT(storm::storage::DFT<ValueType> const& dft) { |
||||
|
std::cout << "Convert DFT to SMT" << std::endl; |
||||
|
timeMax = manager->integer(dft.nrBasicElements()); |
||||
|
timeFailSafe = manager->integer(dft.nrBasicElements() + 1); |
||||
|
timeZero = manager->integer(0); |
||||
|
|
||||
|
// Convert all elements
|
||||
|
for (size_t i = 0; i < dft.nrElements(); ++i) { |
||||
|
std::shared_ptr<storm::storage::DFTElement<ValueType> const> element = dft.getElement(i); |
||||
|
std::cout << "Consider " << element->toString() << std::endl; |
||||
|
if (element->isBasicElement()) { |
||||
|
storm::expressions::Variable varBE = convert(std::static_pointer_cast<storm::storage::DFTBE<ValueType> const>(element)); |
||||
|
varsBE.push_back(varBE); |
||||
|
} else if (element->isGate()) { |
||||
|
storm::expressions::Variable varGate = convert(std::static_pointer_cast<storm::storage::DFTGate<ValueType> const>(element)); |
||||
|
if (dft.getTopLevelIndex() == i) { |
||||
|
topLevel = varGate; |
||||
|
} |
||||
|
} else if (element->isDependency()) { |
||||
|
convert(std::static_pointer_cast<storm::storage::DFTDependency<ValueType> const>(element)); |
||||
|
} else if (element->isRestriction()) { |
||||
|
convert(std::static_pointer_cast<storm::storage::DFTRestriction<ValueType> const>(element)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// No simultaneous fails can occur
|
||||
|
for (size_t i = 0; i < varsBE.size() - 1; ++i) { |
||||
|
storm::expressions::Expression be = varsBE[i]; |
||||
|
for (size_t j = i + 1; j < varsBE.size(); ++j) { |
||||
|
storm::expressions::Expression assertion = be != varsBE[j]; |
||||
|
solver->add(assertion); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// For every time-point one BE must fail
|
||||
|
for (size_t time = 1; time <= dft.nrBasicElements(); ++time) { |
||||
|
storm::expressions::Expression exprTime = manager->integer(time); |
||||
|
storm::expressions::Expression assertion = varsBE[0] == exprTime; |
||||
|
for (size_t i = 1; i < varsBE.size(); ++i) { |
||||
|
assertion = assertion || varsBE[i] == exprTime; |
||||
|
} |
||||
|
assertion = assertion || topLevel <= exprTime; |
||||
|
solver->add(assertion); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
storm::expressions::Variable DFTSMTBuilder<ValueType>::convert(std::shared_ptr<storm::storage::DFTBE<ValueType> const> const& be) { |
||||
|
storm::expressions::Variable var = manager->declareIntegerVariable(be->name()); |
||||
|
storm::expressions::Expression assertion = timeZero < var && var < timeFailSafe; |
||||
|
solver->add(assertion); |
||||
|
return var; |
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
storm::expressions::Variable DFTSMTBuilder<ValueType>::convert(std::shared_ptr<storm::storage::DFTGate<ValueType> const> const& gate) { |
||||
|
storm::expressions::Variable var = manager->declareIntegerVariable(gate->name()); |
||||
|
storm::expressions::Expression assertion = timeZero < var && var <= timeFailSafe; |
||||
|
solver->add(assertion); |
||||
|
return var; |
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
storm::expressions::Variable DFTSMTBuilder<ValueType>::convert(std::shared_ptr<storm::storage::DFTDependency<ValueType> const> const& dependency) { |
||||
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The dependency cannot be converted into SMT."); |
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
storm::expressions::Variable DFTSMTBuilder<ValueType>::convert(std::shared_ptr<storm::storage::DFTRestriction<ValueType> const> const& restriction) { |
||||
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The restriction cannot be converted into SMT."); |
||||
|
} |
||||
|
|
||||
|
template <typename ValueType> |
||||
|
bool DFTSMTBuilder<ValueType>::check() const { |
||||
|
std::cout << "Check" << std::endl; |
||||
|
storm::solver::SmtSolver::CheckResult result = solver->check(); |
||||
|
switch (result) { |
||||
|
case solver::SmtSolver::CheckResult::Sat: |
||||
|
{ |
||||
|
std::cout << "SAT with model:" << std::endl; |
||||
|
std::shared_ptr<storm::solver::SmtSolver::ModelReference> model = solver->getModel(); |
||||
|
for (auto const& pair : *manager) { |
||||
|
std::cout << pair.first.getName() << "->" << model->getIntegerValue(pair.first) << std::endl; |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
case solver::SmtSolver::CheckResult::Unsat: |
||||
|
return false; |
||||
|
case solver::SmtSolver::CheckResult::Unknown: |
||||
|
default: |
||||
|
STORM_LOG_ASSERT(false, "Result is unknown."); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// Explicitly instantiate the class.
|
||||
|
template class DFTSMTBuilder<double>; |
||||
|
|
||||
|
#ifdef STORM_HAVE_CARL
|
||||
|
template class DFTSMTBuilder<storm::RationalFunction>; |
||||
|
#endif
|
||||
|
|
||||
|
} // namespace builder
|
||||
|
} // namespace storm
|
||||
|
|
||||
|
|
@ -0,0 +1,49 @@ |
|||||
|
#ifndef DFTSMTBUILDER_H |
||||
|
#define DFTSMTBUILDER_H |
||||
|
|
||||
|
#include "src/solver/SmtSolver.h" |
||||
|
#include "src/utility/solver.h" |
||||
|
#include "src/storage/dft/DFT.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace builder { |
||||
|
|
||||
|
template<typename ValueType> |
||||
|
class DFTSMTBuilder { |
||||
|
|
||||
|
public: |
||||
|
DFTSMTBuilder(); |
||||
|
|
||||
|
void convertToSMT(storm::storage::DFT<ValueType> const& dft); |
||||
|
|
||||
|
bool check() const; |
||||
|
|
||||
|
private: |
||||
|
|
||||
|
std::shared_ptr<storm::solver::SmtSolver> solver; |
||||
|
|
||||
|
std::shared_ptr<storm::expressions::ExpressionManager> manager; |
||||
|
|
||||
|
storm::expressions::Expression timeMax; |
||||
|
|
||||
|
storm::expressions::Expression timeFailSafe; |
||||
|
|
||||
|
storm::expressions::Expression timeZero; |
||||
|
|
||||
|
storm::expressions::Expression topLevel; |
||||
|
|
||||
|
std::vector<storm::expressions::Variable> varsBE; |
||||
|
|
||||
|
storm::expressions::Variable convert(std::shared_ptr<storm::storage::DFTBE<ValueType> const> const& be); |
||||
|
|
||||
|
storm::expressions::Variable convert(std::shared_ptr<storm::storage::DFTGate<ValueType> const> const& gate); |
||||
|
|
||||
|
storm::expressions::Variable convert(std::shared_ptr<storm::storage::DFTDependency<ValueType> const> const& dependency); |
||||
|
|
||||
|
storm::expressions::Variable convert(std::shared_ptr<storm::storage::DFTRestriction<ValueType> const> const& restriction); |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif /* DFTSMTBUILDER_H */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue