From d4028d9a8b2e912d4c01f3e4369f92ed94a356de Mon Sep 17 00:00:00 2001 From: ravi <ravi.kandhadai@epfl.ch> Date: Wed, 23 Mar 2016 19:22:40 +0100 Subject: [PATCH] Minor refactorings in lazy evaluation for leon-web integration --- .../invariant/engine/InferenceEngine.scala | 2 +- .../laziness/LazinessEliminationPhase.scala | 51 ++++++++++--------- .../leon/laziness/LazyVerificationPhase.scala | 28 ++++++++-- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/main/scala/leon/invariant/engine/InferenceEngine.scala b/src/main/scala/leon/invariant/engine/InferenceEngine.scala index db4eadea6..4d73ffae3 100644 --- a/src/main/scala/leon/invariant/engine/InferenceEngine.scala +++ b/src/main/scala/leon/invariant/engine/InferenceEngine.scala @@ -23,7 +23,7 @@ import Stats._ * This phase performs automatic invariant inference. * TODO: should time be implicitly made positive */ -class InferenceEngine(ctx: InferenceContext) extends Interruptible { +class InferenceEngine(val ctx: InferenceContext) extends Interruptible { val debugBottomupIterations = false val debugAnalysisOrder = false diff --git a/src/main/scala/leon/laziness/LazinessEliminationPhase.scala b/src/main/scala/leon/laziness/LazinessEliminationPhase.scala index 9501f2dc3..2d65f404e 100644 --- a/src/main/scala/leon/laziness/LazinessEliminationPhase.scala +++ b/src/main/scala/leon/laziness/LazinessEliminationPhase.scala @@ -41,7 +41,33 @@ object LazinessEliminationPhase extends SimpleLeonPhase[Program, LazyVerificatio * TODO: add inlining annotations for optimization. */ def apply(ctx: LeonContext, prog: Program): LazyVerificationReport = { + val (progWOInstSpecs, instProg) = genVerifiablePrograms(ctx, prog) + val checkCtx = contextForChecks(ctx) + val stateVeri = + if (!skipStateVerification) + Some(checkSpecifications(progWOInstSpecs, checkCtx)) + else None + + val resourceVeri = + if (!skipResourceVerification) + Some(checkInstrumentationSpecs(instProg, checkCtx, + checkCtx.findOption(LazinessEliminationPhase.optUseOrb).getOrElse(false))) + else None + // dump stats if enabled + if (ctx.findOption(GlobalOptions.optBenchmark).getOrElse(false)) { + val modid = prog.units.find(_.isMainUnit).get.id + val filename = modid + "-stats.txt" + val pw = new PrintWriter(filename) + Stats.dumpStats(pw) + SpecificStats.dumpOutputs(pw) + ctx.reporter.info("Stats dumped to file: " + filename) + pw.close() + } + // return a report + new LazyVerificationReport(stateVeri, resourceVeri) + } + def genVerifiablePrograms(ctx: LeonContext, prog: Program): (Program, Program) = { if (dumpInputProg) println("Input prog: \n" + ScalaPrinter.apply(prog)) @@ -73,35 +99,12 @@ object LazinessEliminationPhase extends SimpleLeonPhase[Program, LazyVerificatio if (dumpProgWOInstSpecs) prettyPrintProgramToFile(progWOInstSpecs, ctx, "-woinst") - val checkCtx = contextForChecks(ctx) - val stateVeri = - if (!skipStateVerification) - Some(checkSpecifications(progWOInstSpecs, checkCtx)) - else None - // instrument the program for resources (note: we avoid checking preconditions again here) val instrumenter = new LazyInstrumenter(InliningPhase.apply(ctx, typeCorrectProg), ctx, closureFactory) val instProg = instrumenter.apply if (dumpInstrumentedProgram) prettyPrintProgramToFile(instProg, ctx, "-withinst", uniqueIds = true) - - val resourceVeri = - if (!skipResourceVerification) - Some(checkInstrumentationSpecs(instProg, checkCtx, - checkCtx.findOption(LazinessEliminationPhase.optUseOrb).getOrElse(false))) - else None - // dump stats if enabled - if (ctx.findOption(GlobalOptions.optBenchmark).getOrElse(false)) { - val modid = prog.units.find(_.isMainUnit).get.id - val filename = modid + "-stats.txt" - val pw = new PrintWriter(filename) - Stats.dumpStats(pw) - SpecificStats.dumpOutputs(pw) - ctx.reporter.info("Stats dumped to file: " + filename) - pw.close() - } - // return a report - new LazyVerificationReport(stateVeri, resourceVeri) + (progWOInstSpecs, instProg) } /** diff --git a/src/main/scala/leon/laziness/LazyVerificationPhase.scala b/src/main/scala/leon/laziness/LazyVerificationPhase.scala index fd063f9d7..a53572667 100644 --- a/src/main/scala/leon/laziness/LazyVerificationPhase.scala +++ b/src/main/scala/leon/laziness/LazyVerificationPhase.scala @@ -94,24 +94,25 @@ object LazyVerificationPhase { if (fd.annotations.contains("axiom")) fd.addFlag(Annotation("library", Seq())) } - val funsToCheck = p.definedFunctions.filter(shouldGenerateVC) val rep = if (useOrb) { - // create an inference context + /*// create an inference context val inferOpts = Main.processOptions(Seq("--disableInfer", "--assumepreInf", "--minbounds", "--solvers=smt-cvc4")) val ctxForInf = LeonContext(checkCtx.reporter, checkCtx.interruptManager, inferOpts.options ++ checkCtx.options) val inferctx = new InferenceContext(p, ctxForInf) val vcSolver = (funDef: FunDef, prog: Program) => new VCSolver(inferctx, prog, funDef) - if (debugInferProgram){ prettyPrintProgramToFile(inferctx.inferProgram, checkCtx, "-inferProg", true) } val results = (new InferenceEngine(inferctx)).analyseProgram(inferctx.inferProgram, funsToCheck.map(InstUtil.userFunctionName), vcSolver, None) - new InferenceReport(results.map { case (fd, ic) => (fd -> List[VC](ic)) }, inferctx.inferProgram)(inferctx) + new InferenceReport(results.map { case (fd, ic) => (fd -> List[VC](ic)) }, inferctx.inferProgram)(inferctx)*/ + val inferctx = getInferenceContext(checkCtx, p) + checkUsingOrb(new InferenceEngine(inferctx), inferctx) } else { + val funsToCheck = p.definedFunctions.filter(shouldGenerateVC) val rep = checkVCs(funsToCheck.map(vcForFun), checkCtx, p) // record some stats collectCumulativeStats(rep) @@ -122,6 +123,25 @@ object LazyVerificationPhase { rep } + def getInferenceContext(checkCtx: LeonContext, p: Program): InferenceContext = { + // create an inference context + val inferOpts = Main.processOptions(Seq("--disableInfer", "--assumepreInf", "--minbounds", "--solvers=smt-cvc4")) + val ctxForInf = LeonContext(checkCtx.reporter, checkCtx.interruptManager, + inferOpts.options ++ checkCtx.options) + new InferenceContext(p, ctxForInf) + } + + def checkUsingOrb(infEngine: InferenceEngine, inferctx: InferenceContext) = { + if (debugInferProgram) { + prettyPrintProgramToFile(inferctx.inferProgram, inferctx.leonContext, "-inferProg", true) + } + val funsToCheck = inferctx.initProgram.definedFunctions.filter(shouldGenerateVC) + val vcSolver = (funDef: FunDef, prog: Program) => new VCSolver(inferctx, prog, funDef) + val results = infEngine.analyseProgram(inferctx.inferProgram, + funsToCheck.map(InstUtil.userFunctionName), vcSolver, None) + new InferenceReport(results.map { case (fd, ic) => (fd -> List[VC](ic)) }, inferctx.inferProgram)(inferctx) + } + def accessesSecondRes(e: Expr, resid: Identifier): Boolean = exists(_ == TupleSelect(resid.toVariable, 2))(e) -- GitLab