4 changed files with 194 additions and 1 deletions
-
120src/builder/DftSmtBuilder.cpp
-
49src/builder/DftSmtBuilder.h
-
14src/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