Skip to content
Snippets Groups Projects
Commit c5e13beb authored by Etienne Kneuss's avatar Etienne Kneuss
Browse files

Provide reliable way to shutdown long-lasting rules

parent 7378ba6f
Branches
Tags
No related merge requests found
...@@ -432,7 +432,7 @@ class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ ...@@ -432,7 +432,7 @@ class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ
reporter.info("UNSAT BECAUSE: "+core.mkString(" AND ")) reporter.info("UNSAT BECAUSE: "+core.mkString(" AND "))
if (!forceStop) { if (!forceStop) {
if (Settings.luckyTest) { if (Settings.luckyTest && false) {
// we need the model to perform the additional test // we need the model to perform the additional test
reporter.info(" - Running search without blocked literals (w/ lucky test)") reporter.info(" - Running search without blocked literals (w/ lucky test)")
} else { } else {
...@@ -447,7 +447,7 @@ class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ ...@@ -447,7 +447,7 @@ class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ
foundAnswer(Some(false), core = z3CoreToCore(solver.getUnsatCore)) foundAnswer(Some(false), core = z3CoreToCore(solver.getUnsatCore))
case Some(true) => case Some(true) =>
//reporter.info("SAT WITHOUT Blockers") //reporter.info("SAT WITHOUT Blockers")
if (Settings.luckyTest && !forceStop) { if (Settings.luckyTest && !forceStop && false) {
// we might have been lucky :D // we might have been lucky :D
val (wereWeLucky, cleanModel) = validateAndDeleteModel(solver.getModel, entireFormula, varsInVC) val (wereWeLucky, cleanModel) = validateAndDeleteModel(solver.getModel, entireFormula, varsInVC)
if(wereWeLucky) { if(wereWeLucky) {
......
...@@ -20,7 +20,7 @@ class ParallelSearch(synth: Synthesizer, ...@@ -20,7 +20,7 @@ class ParallelSearch(synth: Synthesizer,
solver.initZ3 solver.initZ3
SynthesisContext(solver = solver, reporter = synth.reporter) SynthesisContext(solver = solver, reporter = synth.reporter, shouldStop = synth.shouldStop)
} }
def expandAndTask(ref: ActorRef, sctx: SynthesisContext)(t: TaskRunRule) = { def expandAndTask(ref: ActorRef, sctx: SynthesisContext)(t: TaskRunRule) = {
......
...@@ -3,12 +3,15 @@ package synthesis ...@@ -3,12 +3,15 @@ package synthesis
import solvers.Solver import solvers.Solver
import java.util.concurrent.atomic.AtomicBoolean
case class SynthesisContext( case class SynthesisContext(
solver: Solver, solver: Solver,
reporter: Reporter reporter: Reporter,
shouldStop: AtomicBoolean
) )
object SynthesisContext { object SynthesisContext {
def fromSynthesizer(synth: Synthesizer) = SynthesisContext(synth.solver, synth.reporter) def fromSynthesizer(synth: Synthesizer) = SynthesisContext(synth.solver, synth.reporter, new AtomicBoolean(false))
} }
...@@ -15,6 +15,8 @@ import collection.mutable.PriorityQueue ...@@ -15,6 +15,8 @@ import collection.mutable.PriorityQueue
import synthesis.search._ import synthesis.search._
import java.util.concurrent.atomic.AtomicBoolean
class Synthesizer(val context : LeonContext, class Synthesizer(val context : LeonContext,
val solver: Solver, val solver: Solver,
val program: Program, val program: Program,
...@@ -26,7 +28,7 @@ class Synthesizer(val context : LeonContext, ...@@ -26,7 +28,7 @@ class Synthesizer(val context : LeonContext,
import reporter.{error,warning,info,fatalError} import reporter.{error,warning,info,fatalError}
var continue = true var shouldStop = new AtomicBoolean(false)
def synthesize(): (Solution, Boolean) = { def synthesize(): (Solution, Boolean) = {
...@@ -43,7 +45,7 @@ class Synthesizer(val context : LeonContext, ...@@ -43,7 +45,7 @@ class Synthesizer(val context : LeonContext,
println println
reporter.info("Aborting...") reporter.info("Aborting...")
continue = false shouldStop.set(true)
search.stop() search.stop()
Signal.handle(sigINT, oldHandler) Signal.handle(sigINT, oldHandler)
......
...@@ -163,7 +163,7 @@ case object CEGIS extends Rule("CEGIS", 150) { ...@@ -163,7 +163,7 @@ case object CEGIS extends Rule("CEGIS", 150) {
//println("Unrolling #"+unrolings+" bss size: "+bss.size) //println("Unrolling #"+unrolings+" bss size: "+bss.size)
while (result.isEmpty && continue) { while (result.isEmpty && continue && !sctx.shouldStop.get) {
//println("Looking for CE...") //println("Looking for CE...")
//println("-"*80) //println("-"*80)
//println(basePhi) //println(basePhi)
...@@ -262,7 +262,7 @@ case object CEGIS extends Rule("CEGIS", 150) { ...@@ -262,7 +262,7 @@ case object CEGIS extends Rule("CEGIS", 150) {
} }
unrolings += 1 unrolings += 1
} while(unrolings < maxUnrolings && result.isEmpty) } while(unrolings < maxUnrolings && result.isEmpty && !sctx.shouldStop.get)
result.getOrElse(RuleApplicationImpossible) result.getOrElse(RuleApplicationImpossible)
......
...@@ -4,6 +4,7 @@ import akka.actor._ ...@@ -4,6 +4,7 @@ import akka.actor._
import akka.util.duration._ import akka.util.duration._
import akka.util.Timeout import akka.util.Timeout
import akka.pattern.ask import akka.pattern.ask
import akka.pattern.AskTimeoutException
import akka.dispatch.Await import akka.dispatch.Await
abstract class AndOrGraphParallelSearch[WC, abstract class AndOrGraphParallelSearch[WC,
...@@ -27,7 +28,11 @@ abstract class AndOrGraphParallelSearch[WC, ...@@ -27,7 +28,11 @@ abstract class AndOrGraphParallelSearch[WC,
system.actorOf(Props(new Worker(master)), name = "Worker"+i) system.actorOf(Props(new Worker(master)), name = "Worker"+i)
} }
Await.result(master.ask(Protocol.BeginSearch)(timeout), timeout) try {
Await.result(master.ask(Protocol.BeginSearch)(timeout), timeout)
} catch {
case e: AskTimeoutException =>
}
if (system ne null) { if (system ne null) {
system.shutdown system.shutdown
...@@ -92,8 +97,6 @@ abstract class AndOrGraphParallelSearch[WC, ...@@ -92,8 +97,6 @@ abstract class AndOrGraphParallelSearch[WC,
w ! RequestOrTask(ol.task) w ! RequestOrTask(ol.task)
} }
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment