You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.8 KiB
58 lines
2.8 KiB
#include "storm/storage/prism/OverlappingGuardAnalyser.h"
|
|
#include "storm/storage/prism/Program.h"
|
|
#include "storm/solver/SmtSolver.h"
|
|
|
|
|
|
namespace storm {
|
|
namespace prism {
|
|
OverlappingGuardAnalyser::OverlappingGuardAnalyser(Program const& program, std::shared_ptr<storm::utility::solver::SmtSolverFactory>& smtSolverFactory) :
|
|
program(program), smtSolver(smtSolverFactory->create(program.getManager())), initializedWithStateConstraints(false) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
|
|
bool OverlappingGuardAnalyser::hasModuleWithInnerActionOverlap() {
|
|
if(!initializedWithStateConstraints) {
|
|
for(auto const& integerVariable : program.getGlobalIntegerVariables()) {
|
|
smtSolver->add(integerVariable.getExpressionVariable().getExpression() >= integerVariable.getLowerBoundExpression());
|
|
smtSolver->add(integerVariable.getExpressionVariable().getExpression() <= integerVariable.getUpperBoundExpression());
|
|
}
|
|
for (auto const& module : program.getModules()) {
|
|
for(auto const& integerVariable : module.getIntegerVariables()) {
|
|
smtSolver->add(integerVariable.getExpressionVariable().getExpression() >= integerVariable.getLowerBoundExpression());
|
|
smtSolver->add(integerVariable.getExpressionVariable().getExpression() <= integerVariable.getUpperBoundExpression());
|
|
}
|
|
}
|
|
}
|
|
|
|
for(auto const& module : program.getModules()) {
|
|
for (auto const& actionIndex : module.getSynchronizingActionIndices()) {
|
|
auto const& commandIndices = module.getCommandIndicesByActionIndex(actionIndex);
|
|
if (commandIndices.size() == 1) {
|
|
continue;
|
|
} else {
|
|
for (uint64_t commandIndexA : commandIndices) {
|
|
for (uint64_t commandIndexB : commandIndices) {
|
|
if (commandIndexA == commandIndexB) {
|
|
continue;
|
|
}
|
|
smtSolver->push();
|
|
smtSolver->add(module.getCommand(commandIndexA).getGuardExpression());
|
|
smtSolver->add(module.getCommand(commandIndexB).getGuardExpression());
|
|
auto smtCheckResult = smtSolver->check();
|
|
smtSolver->pop();
|
|
if (smtCheckResult == storm::solver::SmtSolver::CheckResult::Sat) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
}
|
|
}
|