From 9382c4cdc25d00713bb95ec4ed62286c4f439f53 Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Fri, 21 Aug 2015 14:29:58 +0200 Subject: [PATCH] Mainly TerminationReport improvement --- .../scala/leon/synthesis/ExamplesBank.scala | 12 ++--- .../leon/termination/ProcessingPipeline.scala | 2 - .../leon/termination/TerminationPhase.scala | 2 +- .../leon/termination/TerminationReport.scala | 48 +++++++++++-------- src/main/scala/leon/utils/ASCIIHelpers.scala | 3 +- .../verification/VerificationReport.scala | 7 +-- 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/main/scala/leon/synthesis/ExamplesBank.scala b/src/main/scala/leon/synthesis/ExamplesBank.scala index a0ed2936a..47b14d99b 100644 --- a/src/main/scala/leon/synthesis/ExamplesBank.scala +++ b/src/main/scala/leon/synthesis/ExamplesBank.scala @@ -22,9 +22,9 @@ case class ExamplesBank(valids: Seq[Example], invalids: Seq[Example]) { evaluator.eval(functionInvocation(fd, ts.ins)) } - val outInfo = (invalids.collect { + val outInfo = invalids.collect { case InOutExample(ins, outs) => ins -> outs - }).toMap + }.toMap val callGraph = evaluator.fullCallGraph @@ -50,15 +50,15 @@ case class ExamplesBank(valids: Seq[Example], invalids: Seq[Example]) { def union(that: ExamplesBank) = { ExamplesBank( - distinctIns((this.valids union that.valids)), - distinctIns((this.invalids union that.invalids)) + distinctIns(this.valids union that.valids), + distinctIns(this.invalids union that.invalids) ) } private def distinctIns(s: Seq[Example]): Seq[Example] = { - val insOuts = (s.collect { + val insOuts = s.collect { case InOutExample(ins, outs) => ins -> outs - }).toMap + }.toMap s.map(_.ins).distinct.map { case ins => diff --git a/src/main/scala/leon/termination/ProcessingPipeline.scala b/src/main/scala/leon/termination/ProcessingPipeline.scala index 0dbdb9bd0..6e7da22ce 100644 --- a/src/main/scala/leon/termination/ProcessingPipeline.scala +++ b/src/main/scala/leon/termination/ProcessingPipeline.scala @@ -213,5 +213,3 @@ abstract class ProcessingPipeline(context: LeonContext, initProgram: Program) ex } } } - -// vim: set ts=4 sw=4 et: diff --git a/src/main/scala/leon/termination/TerminationPhase.scala b/src/main/scala/leon/termination/TerminationPhase.scala index a9f7ef77b..fbfcde51e 100644 --- a/src/main/scala/leon/termination/TerminationPhase.scala +++ b/src/main/scala/leon/termination/TerminationPhase.scala @@ -30,6 +30,6 @@ object TerminationPhase extends LeonPhase[Program,TerminationReport] { } val endTime = System.currentTimeMillis - new TerminationReport(results, (endTime - startTime).toDouble / 1000.0d) + new TerminationReport(ctx, results, (endTime - startTime).toDouble / 1000.0d) } } diff --git a/src/main/scala/leon/termination/TerminationReport.scala b/src/main/scala/leon/termination/TerminationReport.scala index f9dbb49a7..57c3c03ae 100644 --- a/src/main/scala/leon/termination/TerminationReport.scala +++ b/src/main/scala/leon/termination/TerminationReport.scala @@ -4,28 +4,38 @@ package leon package termination import purescala.Definitions._ +import utils.ASCIIHelpers._ + +case class TerminationReport(ctx: LeonContext, results : Seq[(FunDef,TerminationGuarantee)], time : Double) { -case class TerminationReport(results : Seq[(FunDef,TerminationGuarantee)], time : Double) { def summaryString : String = { - val sb = new StringBuilder - sb.append("─────────────────────\n") - sb.append(" Termination summary \n") - sb.append("─────────────────────\n\n") - for((fd,g) <- results) { - val result = if (g.isGuaranteed) "\u2713" else "\u2717" - val toPrint = g match { - case LoopsGivenInputs(reason, args) => - "Non-terminating for call: " + args.mkString(fd.id+"(", ",", ")") - case CallsNonTerminating(funDefs) => - "Calls non-terminating functions " + funDefs.map(_.id).mkString(",") - case Terminates(reason) => - "Terminates (" + reason + ")" - case _ => g.toString + var t = Table("Termination summary") + + for ((fd, g) <- results) t += Row(Seq( + Cell(fd.id.asString(ctx)), + Cell { + val result = if (g.isGuaranteed) "\u2713" else "\u2717" + val verdict = g match { + case LoopsGivenInputs(reason, args) => + "Non-terminating for call: " + args.mkString(fd.id + "(", ",", ")") + case CallsNonTerminating(funDefs) => + "Calls non-terminating functions " + funDefs.map(_.id).mkString(",") + case Terminates(reason) => + "Terminates (" + reason + ")" + case _ => g.toString + } + s"$result $verdict" } - sb.append(f"- ${fd.id.name}%-30s $result $toPrint%-30s\n") - } - sb.append(f"\n[Analysis time: $time%7.3f]\n") - sb.toString + )) + + t += Separator + + t += Row(Seq(Cell( + f"Analysis time: $time%7.3f", + spanning = 2 + ))) + + t.render } def evaluationString : String = { diff --git a/src/main/scala/leon/utils/ASCIIHelpers.scala b/src/main/scala/leon/utils/ASCIIHelpers.scala index 4cf63fe22..a2750e423 100644 --- a/src/main/scala/leon/utils/ASCIIHelpers.scala +++ b/src/main/scala/leon/utils/ASCIIHelpers.scala @@ -8,7 +8,7 @@ object ASCIIHelpers { def ++(rs: Iterable[TableRow]): Table = copy(rows = rows ++ rs) - def computeColumnSizes = { + private def computeColumnSizes = { // First check constraints var constraints = Map[(Int, Int), Int]() @@ -121,7 +121,6 @@ object ASCIIHelpers { case object Left extends Alignment case object Right extends Alignment - case class Cell(v: Any, spanning: Int = 1, align: Alignment = Left) { require(spanning >= 1) diff --git a/src/main/scala/leon/verification/VerificationReport.scala b/src/main/scala/leon/verification/VerificationReport.scala index 43f6aacb8..18ae32c89 100644 --- a/src/main/scala/leon/verification/VerificationReport.scala +++ b/src/main/scala/leon/verification/VerificationReport.scala @@ -3,12 +3,9 @@ package leon package verification -import VCKinds._ -import VCStatus._ +import purescala.Definitions.Program -import purescala.Definitions.{FunDef, Program} - -case class VerificationReport(val program: Program, val results: Map[VC, Option[VCResult]]) { +case class VerificationReport(program: Program, results: Map[VC, Option[VCResult]]) { val vrs: Seq[(VC, VCResult)] = results.toSeq.sortBy { case (vc, _) => (vc.fd.id.name, vc.kind.toString) }.map { case (vc, or) => (vc, or.getOrElse(VCResult.unknown)) -- GitLab