Skip to content
Snippets Groups Projects
Commit 969ec83b authored by Régis Blanc's avatar Régis Blanc
Browse files

adding new arguments --quickcheck to run quicheck random solver and --parallel...

adding new arguments --quickcheck to run quicheck random solver and --parallel to run all solvers in parallel
parent 663e16f1
No related branches found
No related tags found
No related merge requests found
...@@ -36,7 +36,8 @@ class FunCheckPlugin(val global: Global, val actionAfterExtraction : Option[Prog ...@@ -36,7 +36,8 @@ class FunCheckPlugin(val global: Global, val actionAfterExtraction : Option[Prog
" -P:funcheck:BV Use bit-vectors for integers" + "\n" + " -P:funcheck:BV Use bit-vectors for integers" + "\n" +
" -P:funcheck:prune Use additional SMT queries to rule out some unrollings" + "\n" + " -P:funcheck:prune Use additional SMT queries to rule out some unrollings" + "\n" +
" -P:funcheck:cores Use UNSAT cores in the unrolling/refinement step" + "\n" + " -P:funcheck:cores Use UNSAT cores in the unrolling/refinement step" + "\n" +
" -P:funcheck:quickcheck Use QuickCheck-like random search in parrallel with Z3" + "\n" + " -P:funcheck:quickcheck Use QuickCheck-like random search" + "\n" +
" -P:funcheck:parallel Run all solvers in parallel" + "\n" +
" -P:funcheck:noLuckyTests Do not perform additional tests to potentially find models early" " -P:funcheck:noLuckyTests Do not perform additional tests to potentially find models early"
) )
...@@ -58,6 +59,7 @@ class FunCheckPlugin(val global: Global, val actionAfterExtraction : Option[Prog ...@@ -58,6 +59,7 @@ class FunCheckPlugin(val global: Global, val actionAfterExtraction : Option[Prog
case "prune" => purescala.Settings.pruneBranches = true case "prune" => purescala.Settings.pruneBranches = true
case "cores" => purescala.Settings.useCores = true case "cores" => purescala.Settings.useCores = true
case "quickcheck" => purescala.Settings.useQuickCheck = true case "quickcheck" => purescala.Settings.useQuickCheck = true
case "parallel" => purescala.Settings.useParallel = true
case "noLuckyTests" => purescala.Settings.luckyTest = false case "noLuckyTests" => purescala.Settings.luckyTest = false
case s if s.startsWith("unrolling=") => purescala.Settings.unrollingLevel = try { s.substring("unrolling=".length, s.length).toInt } catch { case _ => 0 } case s if s.startsWith("unrolling=") => purescala.Settings.unrollingLevel = try { s.substring("unrolling=".length, s.length).toInt } catch { case _ => 0 }
case s if s.startsWith("functions=") => purescala.Settings.functionsToAnalyse = Set(splitList(s.substring("functions=".length, s.length)): _*) case s if s.startsWith("functions=") => purescala.Settings.functionsToAnalyse = Set(splitList(s.substring("functions=".length, s.length)): _*)
......
...@@ -14,14 +14,7 @@ class Analysis(val program: Program, val reporter: Reporter = Settings.reporter) ...@@ -14,14 +14,7 @@ class Analysis(val program: Program, val reporter: Reporter = Settings.reporter)
val trivialSolver = new TrivialSolver(reporter) // This one you can't disable :D val trivialSolver = new TrivialSolver(reporter) // This one you can't disable :D
val solverExtensions0: Seq[Solver] = trivialSolver +: loadedSolverExtensions val solverExtensions: Seq[Solver] = trivialSolver +: loadedSolverExtensions
val solverExtensions =
if(Settings.solverTimeout == None) {
solverExtensions0
} else {
val t = Settings.solverTimeout.get
solverExtensions0.map(s => new TimeoutSolver(s, t))
}
solverExtensions.foreach(_.setProgram(program)) solverExtensions.foreach(_.setProgram(program))
......
...@@ -88,20 +88,26 @@ object Extensions { ...@@ -88,20 +88,26 @@ object Extensions {
} else { } else {
(new Z3Solver(extensionsReporter)) (new Z3Solver(extensionsReporter))
}) })
z3s :: Nil
val qcs : Solver = (if(Settings.useQuickCheck) {
new ParallelSolver(extensionsReporter, new RandomSolver(extensionsReporter), z3s)
} else {
z3s
})
qcs :: Nil
} else { } else {
Nil Nil
} }
allLoaded = defaultExtensions ++ loaded allLoaded = defaultExtensions ++ loaded
analysisExtensions = allLoaded.filter(_.isInstanceOf[Analyser]).map(_.asInstanceOf[Analyser]) analysisExtensions = allLoaded.filter(_.isInstanceOf[Analyser]).map(_.asInstanceOf[Analyser])
solverExtensions = allLoaded.filter(_.isInstanceOf[Solver]).map(_.asInstanceOf[Solver])
val solverExtensions0 = allLoaded.filter(_.isInstanceOf[Solver]).map(_.asInstanceOf[Solver])
val solverExtensions1 = if(Settings.useQuickCheck) new RandomSolver(extensionsReporter) +: solverExtensions0 else solverExtensions0
val solverExtensions2 = if(Settings.useParallel) new ParallelSolver(solverExtensions1: _*) +: solverExtensions1 else solverExtensions1
val solverExtensions3 =
if(Settings.solverTimeout == None) {
solverExtensions2
} else {
val t = Settings.solverTimeout.get
solverExtensions2.map(s => new TimeoutSolver(s, t))
}
solverExtensions = solverExtensions3
loaded loaded
} }
......
...@@ -16,7 +16,7 @@ import scala.actors.Actor._ ...@@ -16,7 +16,7 @@ import scala.actors.Actor._
import scala.concurrent.Lock import scala.concurrent.Lock
class ParallelSolver(reporter: Reporter, solvers: Solver*) extends Solver(reporter) { class ParallelSolver(solvers: Solver*) extends Solver(solvers(0).reporter) {
private val nbSolvers = solvers.size private val nbSolvers = solvers.size
require(nbSolvers >= 2) require(nbSolvers >= 2)
......
...@@ -23,6 +23,7 @@ object Settings { ...@@ -23,6 +23,7 @@ object Settings {
var solverTimeout : Option[Int] = None var solverTimeout : Option[Int] = None
var luckyTest : Boolean = true var luckyTest : Boolean = true
var useQuickCheck : Boolean = false var useQuickCheck : Boolean = false
var useParallel : Boolean = false
// When this is None, use real integers // When this is None, use real integers
var bitvectorBitwidth : Option[Int] = None var bitvectorBitwidth : Option[Int] = None
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment