Skip to content

Commit

Permalink
refactoring to prepare TrapAlongRefiner + break every 20 traps found
Browse files Browse the repository at this point in the history
  • Loading branch information
yanntm committed May 5, 2024
1 parent 9e0eda7 commit e2865f6
Showing 1 changed file with 33 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,12 @@ public int refine(SolverState solver, ProblemSet problems, RefinementMode mode,
if (problem.getSolution().getReply() != SMTReply.SAT) {
continue;
} else {
problem.updateWitness(solver, "s");
updateWitness(solver, problem);
}
if (solver.getNumericType() ==SolutionType.Real && problem.getSolution().getReply() == SMTReply.REAL) {
continue;
}
CandidateSolution candidate = problem.getSolution();
boolean newTrapFound = findTrap(net, candidate.getState(), knownTraps, solver);
boolean newTrapFound = findTrap(net, problem.getSolution(), knownTraps, solver);
}
constraintsAdded += knownTraps.refine(solver, problems, mode, current, timeout);
totalConstraints += constraintsAdded;
Expand All @@ -73,18 +72,21 @@ public int refine(SolverState solver, ProblemSet problems, RefinementMode mode,
if (problem.getSolution().getReply() != SMTReply.SAT) {
break;
} else {
problem.updateWitness(solver, "s");
updateWitness(solver, problem);
}

CandidateSolution candidate = problem.getSolution();
boolean newTrapFound = findTrap(net, candidate.getState(), knownTraps, solver);
boolean newTrapFound = findTrap(net, problem.getSolution(), knownTraps, solver);
if (newTrapFound) {
int added = knownTraps.refine(solver, problems, mode, current, timeout);
totalConstraints += added;
constraintsAdded += added;
} else {
break;
}
if (totalConstraints >= 20) {
// let other refiners do some work
return totalConstraints;
}
}
}
problems.update();
Expand All @@ -94,9 +96,22 @@ public int refine(SolverState solver, ProblemSet problems, RefinementMode mode,
return totalConstraints;
}

private boolean findTrap(ISparsePetriNet net, SparseIntArray state, StaticRefiner known, SolverState solver) {
public void updateWitness(SolverState solver, Problem problem) {
problem.updateWitness(solver, "s");
}

/**
* Look for a trap that contradicts the given state, create and add a constraint to the known traps if found.
* @param net the net
* @param state the solution on SAT of the problem
* @param known the known traps to add to
* @param solver the solver state
* @return true if a new trap was found
*/
private boolean findTrap(ISparsePetriNet net, CandidateSolution solution, StaticRefiner known, SolverState solver) {
boolean trapFound = false;

SparseIntArray state = solution.getState();
if (state == null || state.size() == 0) {
return false;
}
Expand All @@ -109,17 +124,23 @@ private boolean findTrap(ISparsePetriNet net, SparseIntArray state, StaticRefine
IFactory ef = solver.getSMT().smtConfig.exprFactory;
List<IExpr> vars = trap.stream().map(n -> ef.symbol("s"+n)).collect(Collectors.toList());
IExpr sum = buildSum(vars);
ICommand constraint = new C_assert(ef.fcn(ef.symbol(">="), sum , ef.numeral(1)));
VarSet support = new VarSet();
for (Integer p : trap) {
support.addVar("s", p);
}
IExpr trapPredicate = ef.fcn(ef.symbol(">="), sum , ef.numeral(1));
VarSet support = computeSupport(trap);
ICommand constraint = new C_assert(trapPredicate);
known.addConstraint(new SMTConstraint(constraint, support));
trapFound = true;
}
return trapFound;
}

public VarSet computeSupport(List<Integer> trap) {
VarSet support = new VarSet();
for (Integer p : trap) {
support.addVar("s", p);
}
return support;
}


@Override
public void reset() {
Expand Down

0 comments on commit e2865f6

Please sign in to comment.