From fc3d723fa9e843bb30b5702afc5332fed7308451 Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Mon, 19 Oct 2015 15:56:44 +0200 Subject: [PATCH] Offer command line option to parallelize verification conditions --- src/main/scala/leon/repair/Repairman.scala | 1 - src/main/scala/leon/verification/AnalysisPhase.scala | 11 +++++++++-- .../leon/verification/VerificationCondition.scala | 1 - .../scala/leon/verification/VerificationContext.scala | 4 +++- .../scala/leon/regression/repair/RepairSuite.scala | 2 ++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/scala/leon/repair/Repairman.scala b/src/main/scala/leon/repair/Repairman.scala index e5a1eaafe..aac4a8d4a 100644 --- a/src/main/scala/leon/repair/Repairman.scala +++ b/src/main/scala/leon/repair/Repairman.scala @@ -173,7 +173,6 @@ class Repairman(ctx0: LeonContext, initProgram: Program, fd: FunDef, verifTimeou val report = AnalysisPhase.checkVCs( vctx, vcs, - checkInParallel = true, stopAfter = Some({ (vc, vr) => vr.isInvalid }) ) diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala index 8c6c7d0ce..e5edc1308 100644 --- a/src/main/scala/leon/verification/AnalysisPhase.scala +++ b/src/main/scala/leon/verification/AnalysisPhase.scala @@ -7,6 +7,7 @@ import purescala.Definitions._ import purescala.ExprOps._ import scala.concurrent.duration._ +import java.lang.System import solvers._ @@ -14,6 +15,10 @@ object AnalysisPhase extends SimpleLeonPhase[Program,VerificationReport] { val name = "Analysis" val description = "Leon Verification" + val optParallelVCs = LeonFlagOptionDef("parallel", "Check verification conditions in parallel", default = false) + + override val definedOptions: Set[LeonOptionDef[Any]] = Set(optParallelVCs) + implicit val debugSection = utils.DebugSectionVerification def apply(ctx: LeonContext, program: Program): VerificationReport = { @@ -89,7 +94,6 @@ object AnalysisPhase extends SimpleLeonPhase[Program,VerificationReport] { def checkVCs( vctx: VerificationContext, vcs: Seq[VC], - checkInParallel: Boolean = false, stopAfter: Option[(VC, VCResult) => Boolean] = None ): VerificationReport = { val interruptManager = vctx.context.interruptManager @@ -98,7 +102,7 @@ object AnalysisPhase extends SimpleLeonPhase[Program,VerificationReport] { val initMap: Map[VC, Option[VCResult]] = vcs.map(v => v -> None).toMap - val results = if (checkInParallel) { + val results = if (vctx.checkInParallel) { for (vc <- vcs.par if !stop) yield { val r = checkVC(vctx, vc) if (interruptManager.isInterrupted) interruptManager.recoverInterrupt() @@ -168,6 +172,9 @@ object AnalysisPhase extends SimpleLeonPhase[Program,VerificationReport] { } reporter.synchronized { + if (vctx.checkInParallel) { + reporter.info(s" - Result for '${vc.kind}' VC for ${vc.fd.id} @${vc.getPos}:") + } res.report(vctx) } diff --git a/src/main/scala/leon/verification/VerificationCondition.scala b/src/main/scala/leon/verification/VerificationCondition.scala index 33511b23c..b138559af 100644 --- a/src/main/scala/leon/verification/VerificationCondition.scala +++ b/src/main/scala/leon/verification/VerificationCondition.scala @@ -5,7 +5,6 @@ package leon.verification import leon.purescala.Expressions._ import leon.purescala.Definitions._ import leon.purescala.PrettyPrinter -import leon.purescala.Common._ import leon.utils.Positioned import leon.solvers._ diff --git a/src/main/scala/leon/verification/VerificationContext.scala b/src/main/scala/leon/verification/VerificationContext.scala index 42d3eba62..ba3b5024e 100644 --- a/src/main/scala/leon/verification/VerificationContext.scala +++ b/src/main/scala/leon/verification/VerificationContext.scala @@ -11,4 +11,6 @@ case class VerificationContext ( program: Program, solverFactory: SolverFactory[Solver], reporter: Reporter -) +) { + val checkInParallel: Boolean = context.findOptionOrDefault(AnalysisPhase.optParallelVCs) +} diff --git a/src/test/scala/leon/regression/repair/RepairSuite.scala b/src/test/scala/leon/regression/repair/RepairSuite.scala index 44659752f..2ac93521b 100644 --- a/src/test/scala/leon/regression/repair/RepairSuite.scala +++ b/src/test/scala/leon/regression/repair/RepairSuite.scala @@ -7,6 +7,7 @@ import leon.test._ import leon.utils._ import leon.frontends.scalac.ExtractionPhase import leon.repair._ +import leon.verification.AnalysisPhase class RepairSuite extends LeonRegressionSuite { val pipeline = ExtractionPhase andThen @@ -34,6 +35,7 @@ class RepairSuite extends LeonRegressionSuite { interruptManager = new InterruptManager(reporter), options = Seq( LeonOption(SharedOptions.optFunctions)(Seq(fileToFun(name))), + LeonOption(AnalysisPhase.optParallelVCs)(true), LeonOption(SharedOptions.optTimeout)(180L) ) ) -- GitLab