From 6a5b1b67ca7d68eba97edeb35fb4db5b17036816 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Thu, 6 Dec 2012 18:44:36 +0100 Subject: [PATCH] Reintroduce luckytests fix two problems arising from parallelism of task dispatching --- .../scala/leon/solvers/z3/FairZ3Solver.scala | 2 +- .../leon/synthesis/search/AndOrGraph.scala | 22 +++++++++++-------- .../synthesis/search/AndOrGraphSearch.scala | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala index 3646cc2d8..70368d7c8 100644 --- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala @@ -447,7 +447,7 @@ class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ foundAnswer(Some(false), core = z3CoreToCore(solver.getUnsatCore)) case Some(true) => //reporter.info("SAT WITHOUT Blockers") - if (Settings.luckyTest && !forceStop && false) { + if (Settings.luckyTest && !forceStop) { // we might have been lucky :D val (wereWeLucky, cleanModel) = validateAndDeleteModel(solver.getModel, entireFormula, varsInVC) if(wereWeLucky) { diff --git a/src/main/scala/leon/synthesis/search/AndOrGraph.scala b/src/main/scala/leon/synthesis/search/AndOrGraph.scala index 5a61217a0..48f38675a 100644 --- a/src/main/scala/leon/synthesis/search/AndOrGraph.scala +++ b/src/main/scala/leon/synthesis/search/AndOrGraph.scala @@ -142,15 +142,19 @@ class AndOrGraph[AT <: AOAndTask[S], OT <: AOOrTask[S], S](val root: OT, val cos } def unsolvable(l: AndTree) { - triedAlternatives += l.task -> alternatives(l.task) - alternatives -= l.task - - - if (alternatives.isEmpty) { - isUnsolvable = true - parent.unsolvable(this) - } else { - updateMin() + if (alternatives contains l.task) { + triedAlternatives += l.task -> alternatives(l.task) + alternatives -= l.task + + + if (alternatives.isEmpty) { + isUnsolvable = true + if (parent ne null) { + parent.unsolvable(this) + } + } else { + updateMin() + } } } diff --git a/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala b/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala index bf3fed4e9..e8d402b4f 100644 --- a/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala +++ b/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala @@ -15,7 +15,7 @@ abstract class AndOrGraphSearch[AT <: AOAndTask[S], def collectFromAnd(at: g.AndTree, costs: List[Int]) { val newCosts = at.minCost.value :: costs - if (!at.isSolved) { + if (!at.isSolved && !at.isUnsolvable) { at match { case l: g.Leaf => collectLeaf(WL(l, newCosts.reverse)) @@ -30,7 +30,7 @@ abstract class AndOrGraphSearch[AT <: AOAndTask[S], def collectFromOr(ot: g.OrTree, costs: List[Int]) { val newCosts = ot.minCost.value :: costs - if (!ot.isSolved) { + if (!ot.isSolved && !ot.isUnsolvable) { ot match { case l: g.Leaf => collectLeaf(WL(l, newCosts.reverse)) -- GitLab