From 510168a811ef0b3c7e9230e5cc4d775fa71f314d Mon Sep 17 00:00:00 2001 From: Philippe Suter <philippe.suter@gmail.com> Date: Tue, 11 Dec 2012 15:29:28 +0100 Subject: [PATCH] Solvers are LeonComponents. --- .../scala/leon/solvers/ParallelSolver.scala | 18 +++++++++--------- src/main/scala/leon/solvers/RandomSolver.scala | 2 +- src/main/scala/leon/solvers/Solver.scala | 6 +----- .../scala/leon/solvers/TrivialSolver.scala | 2 +- .../scala/leon/solvers/z3/FairZ3Solver.scala | 15 +++++++-------- .../solvers/z3/UninterpretedZ3Solver.scala | 2 +- .../leon/verification/AnalysisPhase.scala | 4 ++-- .../verification/VerificationCondition.scala | 2 +- 8 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/main/scala/leon/solvers/ParallelSolver.scala b/src/main/scala/leon/solvers/ParallelSolver.scala index 3ecf8df6f..b6e66ff07 100644 --- a/src/main/scala/leon/solvers/ParallelSolver.scala +++ b/src/main/scala/leon/solvers/ParallelSolver.scala @@ -22,8 +22,8 @@ class ParallelSolver(solvers : Solver*) extends Solver(solvers(0).context) with private val reporter = context.reporter val description = "Solver running subsolvers in parallel " + solvers.map(_.description).mkString("(", ", ", ")") - override val shortDescription = solvers.map(_.shortDescription).mkString("//") - override val superseeds : Seq[String] = solvers.map(_.shortDescription).toSeq + override val name = solvers.map(_.name).mkString("//") + override val superseeds : Seq[String] = solvers.map(_.name).toSeq case class Solve(expr: Expr) case object Init @@ -39,10 +39,10 @@ class ParallelSolver(solvers : Solver*) extends Solver(solvers(0).context) with while(true) { receive { case Solve(expr) => { - reporter.info("Starting solver " + s.shortDescription) + reporter.info("Starting solver " + s.name) val res = s.solve(expr) that ! Result(res) - reporter.info("Ending solver " + s.shortDescription) + reporter.info("Ending solver " + s.name) } } } @@ -54,15 +54,15 @@ class ParallelSolver(solvers : Solver*) extends Solver(solvers(0).context) with while(true) { receive { case Init => { - reporter.info("Init solver " + s.shortDescription) + reporter.info("Init solver " + s.name) s.init coordinator ! Ready } case Solve(expr) => { - reporter.info("Starting solver " + s.shortDescription) + reporter.info("Starting solver " + s.name) val res = s.solve(expr) coordinator ! Result(res) - reporter.info("Ending solver " + s.shortDescription) + reporter.info("Ending solver " + s.name) } } } @@ -140,7 +140,7 @@ class ParallelSolver(solvers : Solver*) extends Solver(solvers(0).context) with class SolverRunner(s: Solver, expr: Expr) extends Actor { def act() { - reporter.info("Starting solver " + s.shortDescription) + reporter.info("Starting solver " + s.name) s.solve(expr) match { case Some(b) => { lock.acquire @@ -162,7 +162,7 @@ class ParallelSolver(solvers : Solver*) extends Solver(solvers(0).context) with if(nbResponses >= nbSolvers) resultNotReady = false lock.release - reporter.info("Ending solver " + s.shortDescription) + reporter.info("Ending solver " + s.name) } } */ diff --git a/src/main/scala/leon/solvers/RandomSolver.scala b/src/main/scala/leon/solvers/RandomSolver.scala index fead03a79..f7c8ee3e9 100644 --- a/src/main/scala/leon/solvers/RandomSolver.scala +++ b/src/main/scala/leon/solvers/RandomSolver.scala @@ -17,8 +17,8 @@ class RandomSolver(context: LeonContext, val nbTrial: Option[Int] = None) extend private val reporter = context.reporter + val name = "QC" val description = "Solver applying random testing (QuickCheck-like)" - override val shortDescription = "QC" private val random = new Random() diff --git a/src/main/scala/leon/solvers/Solver.scala b/src/main/scala/leon/solvers/Solver.scala index 0cd3dcac0..777e4dc1c 100644 --- a/src/main/scala/leon/solvers/Solver.scala +++ b/src/main/scala/leon/solvers/Solver.scala @@ -6,11 +6,7 @@ import purescala.Definitions._ import purescala.TreeOps._ import purescala.Trees._ -abstract class Solver(val context : LeonContext) extends IncrementalSolverBuilder { - // This used to be in Extension - val description : String - val shortDescription : String - +abstract class Solver(val context : LeonContext) extends IncrementalSolverBuilder with LeonComponent { // This can be used by solvers to "see" the programs from which the // formulas come. (e.g. to set up some datastructures for the defined // ADTs, etc.) diff --git a/src/main/scala/leon/solvers/TrivialSolver.scala b/src/main/scala/leon/solvers/TrivialSolver.scala index bd8edcf50..3451aa759 100644 --- a/src/main/scala/leon/solvers/TrivialSolver.scala +++ b/src/main/scala/leon/solvers/TrivialSolver.scala @@ -7,8 +7,8 @@ import purescala.Trees._ import purescala.TypeTrees._ class TrivialSolver(context: LeonContext) extends Solver(context) with NaiveIncrementalSolver { + val name = "trivial" val description = "Solver for syntactically trivial formulas" - override val shortDescription = "trivial" def solve(expression: Expr) : Option[Boolean] = expression match { case BooleanLiteral(v) => Some(v) diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala index e572bab23..5990c7165 100644 --- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala @@ -15,23 +15,22 @@ import purescala.TypeTrees._ import scala.collection.mutable.{Map => MutableMap} import scala.collection.mutable.{Set => MutableSet} -class FairZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ3Solver with Z3ModelReconstruction { - // have to comment this to use the solver for constraint solving... - // assert(Settings.useFairInstantiator) - - private val UNKNOWNASSAT : Boolean = !Settings.noForallAxioms +class FairZ3Solver(context : LeonContext) + extends Solver(context) + with AbstractZ3Solver + with Z3ModelReconstruction + with LeonComponent { + val name = "Z3-f" val description = "Fair Z3 Solver" - override val shortDescription = "Z3-f" // this is fixed protected[leon] val z3cfg = new Z3Config( "MODEL" -> true, "MBQI" -> false, - // "SOFT_TIMEOUT" -> 100, "TYPE_CHECK" -> true, "WELL_SORTED_CHECK" -> true - ) + ) toggleWarningMessages(true) def isKnownDef(funDef: FunDef) : Boolean = functionMap.isDefinedAt(funDef) diff --git a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala index 87ef4ecd2..d0024b737 100644 --- a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala @@ -20,8 +20,8 @@ import purescala.TypeTrees._ * Results should come back very quickly. */ class UninterpretedZ3Solver(context : LeonContext) extends Solver(context) with AbstractZ3Solver with Z3ModelReconstruction { + val name = "Z3-u" val description = "Uninterpreted Z3 Solver" - override val shortDescription = "Z3-u" // this is fixed protected[leon] val z3cfg = new Z3Config( diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala index e8bb9791c..d4a2b71b7 100644 --- a/src/main/scala/leon/verification/AnalysisPhase.scala +++ b/src/main/scala/leon/verification/AnalysisPhase.scala @@ -89,8 +89,8 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] { // try all solvers until one returns a meaningful answer var superseeded : Set[String] = Set.empty[String] solvers.find(se => { - reporter.info("Trying with solver: " + se.shortDescription) - if(superseeded(se.shortDescription) || superseeded(se.description)) { + reporter.info("Trying with solver: " + se.name) + if(superseeded(se.name) || superseeded(se.description)) { reporter.info("Solver was superseeded. Skipping.") false } else { diff --git a/src/main/scala/leon/verification/VerificationCondition.scala b/src/main/scala/leon/verification/VerificationCondition.scala index 217eb94b7..573bcd699 100644 --- a/src/main/scala/leon/verification/VerificationCondition.scala +++ b/src/main/scala/leon/verification/VerificationCondition.scala @@ -27,7 +27,7 @@ class VerificationCondition(val condition: Expr, val funDef: FunDef, val kind: V } def solverStr = solvedWith match { - case Some(s) => s.shortDescription + case Some(s) => s.name case None => "" } -- GitLab