Browse Source

smt check for almost surely failing dfts fixed for spares with more than 3 children

Former-commit-id: f7e973ab3d [formerly 3d921b3206]
Former-commit-id: 73e1b8ad45
tempestpy_adaptions
sjunges 8 years ago
committed by Sebastian Junges
parent
commit
05cca06b14
  1. 34
      src/storm/modelchecker/dft/DFTASFChecker.cpp

34
src/storm/modelchecker/dft/DFTASFChecker.cpp

@ -362,22 +362,26 @@ namespace storm {
constraints.push_back(std::make_shared<Iff>(std::make_shared<IsLEqual>(getClaimVariableIndex(spare->id(), children.back()->id()), childVarIndices.back()), std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.back()))); constraints.push_back(std::make_shared<Iff>(std::make_shared<IsLEqual>(getClaimVariableIndex(spare->id(), children.back()->id()), childVarIndices.back()), std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.back())));
constraints.back()->setDescription("Last child & claimed -> spare fails"); constraints.back()->setDescription("Last child & claimed -> spare fails");
std::vector<std::shared_ptr<DFTConstraint>> ifcs;
uint64_t xv = childVarIndices.at(childVarIndices.size()-2); // if v is the child, xv is the time x fails.
uint64_t csn = getClaimVariableIndex(spare->id(), children.back()->id()); // csn is the moment the spare claims the next child
uint64_t xn = childVarIndices.back(); // xn is the moment the next child fails
ifcs.push_back(std::make_shared<IsLEqual>(xv, xn));
for(auto const& otherSpare : children.back()->parents()) {
if(otherSpare->id() == i) { continue; }// not a OTHER spare.
ifcs.push_back(std::make_shared<IsConstantValue>(getClaimVariableIndex(otherSpare->id(), children.back()->id()), dft.nrBasicElements()+1));
}
std::shared_ptr<DFTConstraint> ite = std::make_shared<IfThenElse>(std::make_shared<And>(ifcs), std::make_shared<IsEqual>(csn, xv), std::make_shared<IsEqual>(timePointVariables.at(i), xv));
constraints.push_back(std::make_shared<Iff>(std::make_shared<IsLEqual>(getClaimVariableIndex(spare->id(), children.at(children.size()-2)->id()), xv), ite));
constraints.back()->setDescription("1 but last child & claimed");
for( uint64_t j = 0; j < children.size() - 2; ++j) {
uint64_t currChild = children.size() - 1 - j;
std::shared_ptr<DFTConstraint> elseCase = nullptr;
for( uint64_t j = 0; j < children.size(); ++j) {
uint64_t currChild = children.size() - 2 - j;
std::vector<std::shared_ptr<DFTConstraint>> ifcs;
uint64_t xv = childVarIndices.at(currChild); // if v is the child, xv is the time x fails.
uint64_t csn = getClaimVariableIndex(spare->id(), childVarIndices.at(currChild+1)); // csn is the moment the spare claims the next child
uint64_t xn = childVarIndices.at(currChild+1); // xn is the moment the next child fails
if (j == 0) {
elseCase = std::make_shared<IsEqual>(timePointVariables.at(i), xv);
}
ifcs.push_back(std::make_shared<IsLEqual>(xv, xn));
for(auto const& otherSpare : children.at(currChild+1)->parents()) {
if(otherSpare->id() == i) { continue; }// not a OTHER spare.
ifcs.push_back(std::make_shared<IsConstantValue>(getClaimVariableIndex(otherSpare->id(), children.at(currChild+1)->id()), dft.nrBasicElements()+1));
}
std::shared_ptr<DFTConstraint> ite = std::make_shared<IfThenElse>(std::make_shared<And>(ifcs), std::make_shared<IsEqual>(csn, xv), elseCase);
elseCase = ite;
constraints.push_back(std::make_shared<Iff>(std::make_shared<IsLEqual>(getClaimVariableIndex(spare->id(), children.at(currChild)->id()), xv), ite));
constraints.back()->setDescription(std::to_string(j+1) + " but last child & claimed");
} }
break; break;
} }

Loading…
Cancel
Save