From aad51002d8e49853ece43c1485f01d13f220e913 Mon Sep 17 00:00:00 2001 From: Philippe Suter <philippe.suter@gmail.com> Date: Fri, 23 Nov 2012 18:32:11 +0100 Subject: [PATCH] No more extensions. --- src/main/scala/leon/Extensions.scala | 86 ------------------- src/main/scala/leon/Settings.scala | 2 +- src/main/scala/leon/isabelle/Main.scala | 4 +- .../isabelle/StrongConnectedComponents.scala | 1 - .../scala/leon/solvers/ParallelSolver.scala | 1 - .../scala/leon/solvers/RandomSolver.scala | 1 - src/main/scala/leon/solvers/Solver.scala | 8 +- .../scala/leon/solvers/TimeoutSolver.scala | 1 - .../scala/leon/solvers/TrivialSolver.scala | 1 - .../leon/solvers/z3/AbstractZ3Solver.scala | 1 - .../scala/leon/solvers/z3/FairZ3Solver.scala | 1 - .../solvers/z3/UninterpretedZ3Solver.scala | 1 - .../solvers/z3/Z3ModelReconstruction.scala | 1 - .../scala/leon/testgen/TestGeneration.scala | 3 +- .../scala/leon/verification/Analyser.scala | 4 +- .../scala/leon/verification/Analysis.scala | 25 +++--- src/main/scala/leon/verification/Tactic.scala | 7 +- 17 files changed, 26 insertions(+), 122 deletions(-) delete mode 100644 src/main/scala/leon/Extensions.scala diff --git a/src/main/scala/leon/Extensions.scala b/src/main/scala/leon/Extensions.scala deleted file mode 100644 index acc1707eb..000000000 --- a/src/main/scala/leon/Extensions.scala +++ /dev/null @@ -1,86 +0,0 @@ -package leon - -import purescala.Common._ -import purescala.Trees._ -import purescala.TreeOps._ -import purescala.Definitions._ - -object Extensions { - import leon.verification.{Analyser,Tactic} - import leon.solvers.Solver - - abstract class Extension(reporter: Reporter) { - def description: String - def shortDescription: String = description - } - - // The rest of the code is for dynamically loading extensions - - private var allLoaded : Seq[Extension] = Nil - private var analysisExtensions : Seq[Analyser] = Nil - private var solverExtensions : Seq[Solver] = Nil - - // Returns the list of the newly loaded. - def loadAll(extensionsReporter : Reporter = Settings.reporter) : Seq[Extension] = { - val allNames: Seq[String] = Settings.extensionNames - val loaded = (if(!allNames.isEmpty) { - val classLoader = Extensions.getClass.getClassLoader - - val classes: Seq[Class[_]] = (for(name <- allNames) yield { - try { - classLoader.loadClass(name) - } catch { - case _ => { - Settings.reporter.error("Couldn't load extension class " + name) - null - } - } - }).filter(_ != null) - - classes.map(cl => { - try { - val cons = cl.getConstructor(classOf[Reporter]) - cons.newInstance(extensionsReporter).asInstanceOf[Extension] - } catch { - case _ => { - Settings.reporter.error("Extension class " + cl.getName + " does not seem to be of a proper type.") - null - } - } - }).filter(_ != null) - } else { - Nil - }) - if(!loaded.isEmpty) { - Settings.reporter.info("The following extensions are loaded:\n" + loaded.toList.map(_.description).mkString(" ", "\n ", "")) - } - // these extensions are always loaded, unless specified otherwise - val defaultExtensions: Seq[Extension] = if(Settings.runDefaultExtensions) { - val z3 : Solver = new solvers.z3.FairZ3Solver(extensionsReporter) - z3 :: Nil - } else { - Nil - } - - allLoaded = defaultExtensions ++ loaded - analysisExtensions = allLoaded.filter(_.isInstanceOf[Analyser]).map(_.asInstanceOf[Analyser]) - //analysisExtensions = new TestGeneration(extensionsReporter) +: analysisExtensions - - val solverExtensions0 = allLoaded.filter(_.isInstanceOf[Solver]).map(_.asInstanceOf[Solver]) - val solverExtensions1 = if(Settings.useQuickCheck) new solvers.RandomSolver(extensionsReporter) +: solverExtensions0 else solverExtensions0 - val solverExtensions2 = if(Settings.useParallel) Seq(new solvers.ParallelSolver(solverExtensions1: _*)) else solverExtensions1 - val solverExtensions3 = - if(Settings.solverTimeout == None) { - solverExtensions2 - } else { - val t = Settings.solverTimeout.get - solverExtensions2.map(s => new solvers.TimeoutSolver(s, t)) - } - solverExtensions = solverExtensions3 - loaded - } - - def loadedExtensions : Seq[Extension] = allLoaded - def loadedAnalysisExtensions : Seq[Analyser] = analysisExtensions - def loadedSolverExtensions : Seq[Solver] = solverExtensions -} diff --git a/src/main/scala/leon/Settings.scala b/src/main/scala/leon/Settings.scala index f643c3a24..5e2585eb5 100644 --- a/src/main/scala/leon/Settings.scala +++ b/src/main/scala/leon/Settings.scala @@ -18,7 +18,7 @@ object Settings { var useCores : Boolean = false var pruneBranches : Boolean = false var solverTimeout : Option[Int] = None - //var luckyTest : Boolean = true + var luckyTest : Boolean = true var verifyModel : Boolean = true var useQuickCheck : Boolean = false var useParallel : Boolean = false diff --git a/src/main/scala/leon/isabelle/Main.scala b/src/main/scala/leon/isabelle/Main.scala index 3db02146e..080e7d038 100644 --- a/src/main/scala/leon/isabelle/Main.scala +++ b/src/main/scala/leon/isabelle/Main.scala @@ -1,6 +1,5 @@ package leon.isabelle -import leon.Extensions._ import leon.Reporter import leon.Settings._ @@ -20,7 +19,8 @@ import scala.collection.mutable.ListMap class Main(reporter: Reporter) extends Analyser(reporter) { val description = "Generates Isabelle source" - override val shortDescription = "isabelle" + val shortDescription = "isabelle" + var mapParentTypes = new ListMap[String, String] //map for each function keeps the functions that it calls inside it diff --git a/src/main/scala/leon/isabelle/StrongConnectedComponents.scala b/src/main/scala/leon/isabelle/StrongConnectedComponents.scala index 78eb355ff..497e16884 100644 --- a/src/main/scala/leon/isabelle/StrongConnectedComponents.scala +++ b/src/main/scala/leon/isabelle/StrongConnectedComponents.scala @@ -1,6 +1,5 @@ package leon.isabelle -import leon.Extensions._ import leon.Reporter import leon.Settings._ diff --git a/src/main/scala/leon/solvers/ParallelSolver.scala b/src/main/scala/leon/solvers/ParallelSolver.scala index 9a9e39829..6ac173414 100644 --- a/src/main/scala/leon/solvers/ParallelSolver.scala +++ b/src/main/scala/leon/solvers/ParallelSolver.scala @@ -5,7 +5,6 @@ import purescala.Common._ import purescala.Definitions._ import purescala.Trees._ import purescala.TypeTrees._ -import Extensions._ import Evaluator._ diff --git a/src/main/scala/leon/solvers/RandomSolver.scala b/src/main/scala/leon/solvers/RandomSolver.scala index 89c0c6752..3b44cae39 100644 --- a/src/main/scala/leon/solvers/RandomSolver.scala +++ b/src/main/scala/leon/solvers/RandomSolver.scala @@ -6,7 +6,6 @@ import purescala.Definitions._ import purescala.Trees._ import purescala.TreeOps._ import purescala.TypeTrees._ -import Extensions._ import Evaluator._ diff --git a/src/main/scala/leon/solvers/Solver.scala b/src/main/scala/leon/solvers/Solver.scala index 947f4ce28..b31a083be 100644 --- a/src/main/scala/leon/solvers/Solver.scala +++ b/src/main/scala/leon/solvers/Solver.scala @@ -1,14 +1,16 @@ package leon package solvers -import Extensions.Extension - import purescala.Common._ import purescala.Definitions._ import purescala.TreeOps._ import purescala.Trees._ -abstract class Solver(val reporter: Reporter) extends Extension(reporter) { +abstract class Solver(val reporter: Reporter) { + // This used to be in Extension + val description : String + val shortDescription : String + // 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/TimeoutSolver.scala b/src/main/scala/leon/solvers/TimeoutSolver.scala index 6b08a36f7..6fa76d0bf 100644 --- a/src/main/scala/leon/solvers/TimeoutSolver.scala +++ b/src/main/scala/leon/solvers/TimeoutSolver.scala @@ -5,7 +5,6 @@ import purescala.Common._ import purescala.Definitions._ import purescala.Trees._ import purescala.TypeTrees._ -import Extensions._ import scala.sys.error diff --git a/src/main/scala/leon/solvers/TrivialSolver.scala b/src/main/scala/leon/solvers/TrivialSolver.scala index 054ae3f93..b75c157d8 100644 --- a/src/main/scala/leon/solvers/TrivialSolver.scala +++ b/src/main/scala/leon/solvers/TrivialSolver.scala @@ -5,7 +5,6 @@ import purescala.Common._ import purescala.Definitions._ import purescala.Trees._ import purescala.TypeTrees._ -import Extensions._ class TrivialSolver(reporter: Reporter) extends Solver(reporter) { val description = "Solver for syntactically trivial formulas" diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index 414e8e1a4..20992d2e3 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -7,7 +7,6 @@ import purescala.Definitions._ import purescala.Trees._ import purescala.TreeOps._ import purescala.TypeTrees._ -import Extensions._ import scala.collection.mutable.{Map => MutableMap} import scala.collection.mutable.{Set => MutableSet} diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala index 3659bb668..20341ff93 100644 --- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala @@ -11,7 +11,6 @@ import purescala.Trees._ import purescala.Extractors._ import purescala.TreeOps._ import purescala.TypeTrees._ -import Extensions._ import scala.collection.mutable.{Map => MutableMap} import scala.collection.mutable.{Set => MutableSet} diff --git a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala index 2e2a7cf6f..74aef6fcd 100644 --- a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala @@ -11,7 +11,6 @@ import purescala.Trees._ import purescala.Extractors._ import purescala.TreeOps._ import purescala.TypeTrees._ -import Extensions._ /** This is a rather direct mapping to Z3, where all functions are left uninterpreted. * It reports the results as follows (based on the negation of the formula): diff --git a/src/main/scala/leon/solvers/z3/Z3ModelReconstruction.scala b/src/main/scala/leon/solvers/z3/Z3ModelReconstruction.scala index 5fc00acd0..2e65ca7e5 100644 --- a/src/main/scala/leon/solvers/z3/Z3ModelReconstruction.scala +++ b/src/main/scala/leon/solvers/z3/Z3ModelReconstruction.scala @@ -7,7 +7,6 @@ import purescala.Definitions._ import purescala.Trees._ import purescala.TreeOps._ import purescala.TypeTrees._ -import Extensions._ trait Z3ModelReconstruction { self: AbstractZ3Solver => diff --git a/src/main/scala/leon/testgen/TestGeneration.scala b/src/main/scala/leon/testgen/TestGeneration.scala index 3b76352b2..0502be540 100644 --- a/src/main/scala/leon/testgen/TestGeneration.scala +++ b/src/main/scala/leon/testgen/TestGeneration.scala @@ -8,7 +8,6 @@ import leon.purescala.Trees._ import leon.purescala.TreeOps._ import leon.purescala.TypeTrees._ import leon.purescala.ScalaPrinter -import leon.Extensions._ import leon.solvers.z3.FairZ3Solver import leon.Reporter @@ -17,7 +16,7 @@ import scala.collection.mutable.{Set => MutableSet} class TestGeneration(reporter: Reporter) extends Analyser(reporter) { def description: String = "Generate random testcases" - override def shortDescription: String = "test" + def shortDescription: String = "test" private val z3Solver = new FairZ3Solver(reporter) diff --git a/src/main/scala/leon/verification/Analyser.scala b/src/main/scala/leon/verification/Analyser.scala index 84a2d8722..708a3a756 100644 --- a/src/main/scala/leon/verification/Analyser.scala +++ b/src/main/scala/leon/verification/Analyser.scala @@ -1,12 +1,10 @@ package leon package verification -import Extensions.Extension - import purescala.Definitions.Program // TODO this class is slowly but surely becoming useless, as we now have a notion of phases. -abstract class Analyser(reporter: Reporter) extends Extension(reporter) { +abstract class Analyser(reporter: Reporter) { // Does whatever the analysis should. Uses the reporter to // signal results and/or errors. def analyse(program: Program) : Unit diff --git a/src/main/scala/leon/verification/Analysis.scala b/src/main/scala/leon/verification/Analysis.scala index 1521ad8e1..77cebb211 100644 --- a/src/main/scala/leon/verification/Analysis.scala +++ b/src/main/scala/leon/verification/Analysis.scala @@ -7,22 +7,20 @@ import purescala.Trees._ import purescala.TreeOps._ import purescala.TypeTrees._ -import Extensions._ - import solvers.{Solver,TrivialSolver} +import solvers.z3.FairZ3Solver import scala.collection.mutable.{Set => MutableSet} class Analysis(val program : Program, val reporter: Reporter) { - Extensions.loadAll(reporter) - val analysisExtensions: Seq[Analyser] = loadedAnalysisExtensions + val trivialSolver = new TrivialSolver(reporter) - val trivialSolver = new TrivialSolver(reporter) // This one you can't disable :D + val fairZ3 = new FairZ3Solver(reporter) - val solverExtensions: Seq[Solver] = trivialSolver +: loadedSolverExtensions + val solvers : Seq[Solver] = trivialSolver :: fairZ3 :: Nil - solverExtensions.foreach(_.setProgram(program)) + solvers.foreach(_.setProgram(program)) val defaultTactic = new DefaultTactic(reporter) defaultTactic.setProgram(program) @@ -40,7 +38,7 @@ class Analysis(val program : Program, val reporter: Reporter) { FunctionTemplate.mkTemplate(funDef) } - val report = if(solverExtensions.size > 1) { + val report = if(solvers.size > 1) { reporter.info("Running verification condition generation...") checkVerificationConditions(generateVerificationConditions) } else { @@ -48,10 +46,11 @@ class Analysis(val program : Program, val reporter: Reporter) { VerificationReport.emptyReport } - analysisExtensions.foreach(ae => { - reporter.info("Running analysis from extension: " + ae.description) - ae.analyse(program) - }) + // This used to be for additional analyses. They should now just be different phases. + // analysisExtensions.foreach(ae => { + // reporter.info("Running analysis from extension: " + ae.description) + // ae.analyse(program) + // }) report } @@ -105,7 +104,7 @@ class Analysis(val program : Program, val reporter: Reporter) { // try all solvers until one returns a meaningful answer var superseeded : Set[String] = Set.empty[String] - solverExtensions.find(se => { + solvers.find(se => { reporter.info("Trying with solver: " + se.shortDescription) if(superseeded(se.shortDescription) || superseeded(se.description)) { reporter.info("Solver was superseeded. Skipping.") diff --git a/src/main/scala/leon/verification/Tactic.scala b/src/main/scala/leon/verification/Tactic.scala index d19752949..3a00f2ab7 100644 --- a/src/main/scala/leon/verification/Tactic.scala +++ b/src/main/scala/leon/verification/Tactic.scala @@ -1,11 +1,12 @@ package leon package verification -import Extensions.Extension - import purescala.Definitions._ -abstract class Tactic(reporter: Reporter) extends Extension(reporter) { +abstract class Tactic(reporter: Reporter) { + val description : String + val shortDescription : String + def setProgram(program: Program) : Unit = {} def generatePostconditions(function: FunDef) : Seq[VerificationCondition] def generatePreconditions(function: FunDef) : Seq[VerificationCondition] -- GitLab