From a3cab185b6275cc299c0063d93da3f924280e1c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Fri, 31 Jan 2014 16:38:46 +0100
Subject: [PATCH] remove the need for innerXXX methods

Refactor the TimeoutSolver and TimeoutAssumptionSolver so
that they no longer use innerCheck methods. We now only
create solver as subclassing Solver or IncrementalSolver and
implementing the interuptible trait, and we can turn them into
TimeoutSolver at instantiation time with a mixin.
---
 .../scala/leon/codegen/runtime/ChooseEntryPoint.scala     | 3 ++-
 src/main/scala/leon/evaluators/RecursiveEvaluator.scala   | 4 +++-
 src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala | 8 +++-----
 src/main/scala/leon/solvers/TimeoutSolver.scala           | 8 +++-----
 src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala     | 4 ++--
 src/main/scala/leon/solvers/z3/FairZ3Solver.scala         | 4 ++--
 .../scala/leon/solvers/z3/UninterpretedZ3Solver.scala     | 4 ++--
 src/main/scala/leon/synthesis/SynthesisContext.scala      | 4 ++--
 src/main/scala/leon/synthesis/Synthesizer.scala           | 2 +-
 src/main/scala/leon/termination/Processor.scala           | 2 +-
 src/main/scala/leon/testgen/TestGeneration.scala          | 4 ++--
 src/main/scala/leon/verification/AnalysisPhase.scala      | 2 +-
 src/test/scala/leon/test/solvers/TimeoutSolverTests.scala | 7 ++++---
 13 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala b/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala
index c5ed3070e..0316953f1 100644
--- a/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala
+++ b/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala
@@ -9,6 +9,7 @@ import purescala.Definitions._
 import purescala.Trees.{Tuple => LeonTuple, _}
 import purescala.TreeOps.valuateWithModel
 import purescala.TypeTrees._
+import solvers.TimeoutSolver
 import solvers.z3._
 
 import codegen.CompilationUnit
@@ -41,7 +42,7 @@ object ChooseEntryPoint {
 
     val tStart = System.currentTimeMillis;
 
-    val solver = new FairZ3Solver(ctx, program).setTimeout(10000L)
+    val solver = (new FairZ3Solver(ctx, program) with TimeoutSolver).setTimeout(10000L)
 
     val inputsMap = (p.as zip inputs).map {
       case (id, v) =>
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index ab78f94dc..0d61de439 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -9,6 +9,8 @@ import purescala.TreeOps._
 import purescala.Trees._
 import purescala.TypeTrees._
 
+import solvers.TimeoutSolver
+
 import xlang.Trees._
 
 abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program) extends Evaluator(ctx, prog) {
@@ -370,7 +372,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program) extends Evalu
 
       val tStart = System.currentTimeMillis;
 
-      val solver = new FairZ3Solver(ctx, program).setTimeout(10000L)
+      val solver = (new FairZ3Solver(ctx, program) with TimeoutSolver).setTimeout(10000L)
 
       val inputsMap = p.as.map {
         case id =>
diff --git a/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala b/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala
index ae59400da..bfae8365d 100644
--- a/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala
+++ b/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala
@@ -7,16 +7,14 @@ import purescala.Trees.Expr
 
 trait TimeoutAssumptionSolver extends TimeoutSolver with AssumptionSolver {
 
-  protected def innerCheckAssumptions(assumptions: Set[Expr]): Option[Boolean]
-
-  override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
+  abstract override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
     optTimeout match {
       case Some(to) =>
         interruptAfter(to) {
-          innerCheckAssumptions(assumptions)
+          super.checkAssumptions(assumptions)
         }
       case None =>
-        innerCheckAssumptions(assumptions)
+        super.checkAssumptions(assumptions)
     }
   }
 }
diff --git a/src/main/scala/leon/solvers/TimeoutSolver.scala b/src/main/scala/leon/solvers/TimeoutSolver.scala
index ab98755c2..1f805c3db 100644
--- a/src/main/scala/leon/solvers/TimeoutSolver.scala
+++ b/src/main/scala/leon/solvers/TimeoutSolver.scala
@@ -55,16 +55,14 @@ trait TimeoutSolver extends Solver with Interruptible {
     this
   }
 
-  protected def innerCheck: Option[Boolean]
-
-  override def check: Option[Boolean] = {
+  abstract override def check: Option[Boolean] = {
     optTimeout match {
       case Some(to) =>
         interruptAfter(to) {
-          innerCheck
+          super.check
         }
       case None =>
-        innerCheck
+        super.check
     }
   }
 
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index aebc32347..873388137 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -21,9 +21,9 @@ import scala.collection.mutable.{Set => MutableSet}
 // with a Z3 instance"
 trait AbstractZ3Solver
   extends Solver
-     with TimeoutAssumptionSolver
      with AssumptionSolver
-     with IncrementalSolver {
+     with IncrementalSolver 
+     with Interruptible {
 
   val context : LeonContext
   val program : Program
diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
index b863c5ac8..71589d58f 100644
--- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
@@ -354,11 +354,11 @@ class FairZ3Solver(val context : LeonContext, val program: Program)
     frameExpressions = frameExpressions.drop(lvl)
   }
 
-  def innerCheck: Option[Boolean] = {
+  override def check: Option[Boolean] = {
     fairCheck(Set())
   }
 
-  def innerCheckAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
+  override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
     fairCheck(assumptions)
   }
 
diff --git a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala
index d9f2696ca..59b0f79fe 100644
--- a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala
@@ -76,7 +76,7 @@ class UninterpretedZ3Solver(val context : LeonContext, val program: Program)
     solver.assertCnstr(toZ3Formula(expression).get)
   }
 
-  def innerCheck: Option[Boolean] = {
+  override def check: Option[Boolean] = {
     solver.check match {
       case Some(true) =>
         if (containsFunCalls) {
@@ -90,7 +90,7 @@ class UninterpretedZ3Solver(val context : LeonContext, val program: Program)
     }
   }
 
-  def innerCheckAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
+  override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
     variables ++= assumptions.flatMap(variablesOf(_))
     solver.checkAssumptions(assumptions.toSeq.map(toZ3Formula(_).get) : _*)
   }
diff --git a/src/main/scala/leon/synthesis/SynthesisContext.scala b/src/main/scala/leon/synthesis/SynthesisContext.scala
index adf89f1cc..cd938e946 100644
--- a/src/main/scala/leon/synthesis/SynthesisContext.scala
+++ b/src/main/scala/leon/synthesis/SynthesisContext.scala
@@ -21,11 +21,11 @@ case class SynthesisContext(
 ) {
 
   def newSolver: SynthesisContext.SynthesisSolver = {
-    new FairZ3Solver(context, program)
+    new FairZ3Solver(context, program) with TimeoutAssumptionSolver
   }
 
   def newFastSolver: SynthesisContext.SynthesisSolver = {
-    new UninterpretedZ3Solver(context, program)
+    new UninterpretedZ3Solver(context, program) with TimeoutAssumptionSolver
   }
 
   val solverFactory = SolverFactory(() => newSolver)
diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala
index 78e5f20a2..9bb0bda00 100644
--- a/src/main/scala/leon/synthesis/Synthesizer.scala
+++ b/src/main/scala/leon/synthesis/Synthesizer.scala
@@ -81,7 +81,7 @@ class Synthesizer(val context : LeonContext,
 
     val (npr, fds) = solutionToProgram(sol)
 
-    val solverf = SolverFactory(() => new FairZ3Solver(context, npr).setTimeout(timeoutMs))
+    val solverf = SolverFactory(() => (new FairZ3Solver(context, npr) with TimeoutSolver).setTimeout(timeoutMs))
 
     val vcs = generateVerificationConditions(reporter, npr, fds.map(_.id.name))
     val vctx = VerificationContext(context, Seq(solverf), context.reporter)
diff --git a/src/main/scala/leon/termination/Processor.scala b/src/main/scala/leon/termination/Processor.scala
index c66333a4f..6c72adb98 100644
--- a/src/main/scala/leon/termination/Processor.scala
+++ b/src/main/scala/leon/termination/Processor.scala
@@ -99,7 +99,7 @@ trait Solvable { self: Processor =>
       val newProgram  : Program         = program.copy(mainObject = program.mainObject.copy(defs = allDefs))
       val context     : LeonContext     = self.checker.context
 
-      solvers = new TimeoutSolverFactory(SolverFactory(() => new FairZ3Solver(context, newProgram)), 500) :: Nil
+      solvers = new TimeoutSolverFactory(SolverFactory(() => new FairZ3Solver(context, newProgram) with TimeoutSolver), 500) :: Nil
     }
   }
 
diff --git a/src/main/scala/leon/testgen/TestGeneration.scala b/src/main/scala/leon/testgen/TestGeneration.scala
index e08e7b172..ce6d2fa6d 100644
--- a/src/main/scala/leon/testgen/TestGeneration.scala
+++ b/src/main/scala/leon/testgen/TestGeneration.scala
@@ -59,7 +59,7 @@ class TestGeneration(context : LeonContext) {
   }
 
   def generatePathConditions(program: Program): Set[Expr] = {
-    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program))
+    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program) with TimeoutSolver)
 
     val callGraph = new CallGraph(program)
     callGraph.writeDotFile("testgen.dot")
@@ -74,7 +74,7 @@ class TestGeneration(context : LeonContext) {
 
   private def generateTestCases(program: Program): Set[Map[Identifier, Expr]] = {
     val allPaths = generatePathConditions(program)
-    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program))
+    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program) with TimeoutSolver)
 
     allPaths.flatMap(pathCond => {
       reporter.info("Now considering path condition: " + pathCond)
diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala
index 905b37484..dc67963e7 100644
--- a/src/main/scala/leon/verification/AnalysisPhase.scala
+++ b/src/main/scala/leon/verification/AnalysisPhase.scala
@@ -151,7 +151,7 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] {
     val reporter = ctx.reporter
 
     val baseFactories = Seq(
-      SolverFactory(() => new FairZ3Solver(ctx, program))
+      SolverFactory(() => new FairZ3Solver(ctx, program) with TimeoutSolver)
     )
 
     val solverFactories = timeout match {
diff --git a/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala b/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala
index edd96fdc1..5678bd627 100644
--- a/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala
+++ b/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala
@@ -4,6 +4,7 @@ package leon.test
 package solvers
 
 import leon._
+import leon.utils.Interruptible
 import leon.solvers._
 import leon.solvers.combinators._
 import leon.purescala.Common._
@@ -12,13 +13,13 @@ import leon.purescala.Trees._
 import leon.purescala.TypeTrees._
 
 class TimeoutSolverTests extends LeonTestSuite {
-  private class IdioticSolver(val context : LeonContext, val program: Program) extends Solver with TimeoutSolver {
+  private class IdioticSolver(val context : LeonContext, val program: Program) extends Solver with Interruptible{
     val name = "Idiotic"
     val description = "Loops"
 
     var interrupted = false
 
-    def innerCheck = {
+    override def check: Option[Boolean] = {
       while(!interrupted) {
         Thread.sleep(100)
       }
@@ -41,7 +42,7 @@ class TimeoutSolverTests extends LeonTestSuite {
   }
 
   private def getTOSolver : SolverFactory[Solver] = {
-    SolverFactory(() => new IdioticSolver(testContext, Program.empty).setTimeout(1000L))
+    SolverFactory(() => (new IdioticSolver(testContext, Program.empty) with TimeoutSolver).setTimeout(1000L))
   }
 
   private def check(sf: SolverFactory[Solver], e: Expr): Option[Boolean] = {
-- 
GitLab