diff --git a/src/main/scala/leon/invariant/datastructure/DisjointSet.scala b/src/main/scala/leon/invariant/datastructure/DisjointSets.scala similarity index 94% rename from src/main/scala/leon/invariant/datastructure/DisjointSet.scala rename to src/main/scala/leon/invariant/datastructure/DisjointSets.scala index 4cab7291bfa58dd3d79993233251d7dd589e0019..003bb31d1233ce7ab3ad1fe0dbe775008ae7f806 100644 --- a/src/main/scala/leon/invariant/datastructure/DisjointSet.scala +++ b/src/main/scala/leon/invariant/datastructure/DisjointSets.scala @@ -1,8 +1,6 @@ package leon package invariant.datastructure -import scala.collection.mutable.{ Map => MutableMap } -import scala.annotation.migration import scala.collection.mutable.{Map => MutableMap} class DisjointSets[T] { diff --git a/src/main/scala/leon/invariant/datastructure/Graph.scala b/src/main/scala/leon/invariant/datastructure/Graph.scala index 484f04668c08a6b02f8acfd2db12b343e4b4c303..7262b4b4ef4932a89f76406ed49e4d5e00ee9be1 100644 --- a/src/main/scala/leon/invariant/datastructure/Graph.scala +++ b/src/main/scala/leon/invariant/datastructure/Graph.scala @@ -66,7 +66,7 @@ class DirectedGraph[T] { } }) } - if (!queue.isEmpty) { + if (queue.nonEmpty) { val (head :: tail) = queue queue = tail BFSReachRecur(head) diff --git a/src/main/scala/leon/invariant/datastructure/Maps.scala b/src/main/scala/leon/invariant/datastructure/Maps.scala index 777a79375d874588f3be108d702aa6dc8118df79..ca2dcb98e99f247651dfd1b8632c570630fce7f0 100644 --- a/src/main/scala/leon/invariant/datastructure/Maps.scala +++ b/src/main/scala/leon/invariant/datastructure/Maps.scala @@ -1,13 +1,6 @@ package leon -package invariant.util +package invariant.datastructure -import purescala.Common._ -import purescala.Definitions._ -import purescala.Expressions._ -import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ -import scala.collection.mutable.{ Set => MutableSet, Map => MutableMap } import scala.annotation.tailrec class MultiMap[A, B] extends scala.collection.mutable.HashMap[A, scala.collection.mutable.Set[B]] with scala.collection.mutable.MultiMap[A, B] { diff --git a/src/main/scala/leon/invariant/engine/CompositionalTemplateSolver.scala b/src/main/scala/leon/invariant/engine/CompositionalTimeBoundSolver.scala similarity index 92% rename from src/main/scala/leon/invariant/engine/CompositionalTemplateSolver.scala rename to src/main/scala/leon/invariant/engine/CompositionalTimeBoundSolver.scala index 647616fce1bab0eb01182ad50d75c060ce4ff737..7a9605c922e21373abb6df06fe9d585a104da2ba 100644 --- a/src/main/scala/leon/invariant/engine/CompositionalTemplateSolver.scala +++ b/src/main/scala/leon/invariant/engine/CompositionalTimeBoundSolver.scala @@ -1,16 +1,13 @@ package leon package invariant.engine -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Extractors._ import purescala.Types._ -import invariant.templateSolvers._ import transformations._ import invariant.structure.FunctionUtils._ -import transformations.InstUtil._ import leon.invariant.structure.Formula import leon.invariant.structure.Call import leon.invariant.util._ @@ -20,7 +17,6 @@ import leon.solvers.Model import Util._ import PredicateUtil._ import ProgramUtil._ -import SolverUtil._ class CompositionalTimeBoundSolver(ctx: InferenceContext, prog: Program, rootFd: FunDef) extends FunctionTemplateSolver { @@ -183,23 +179,21 @@ class CompositionalTimeBoundSolver(ctx: InferenceContext, prog: Program, rootFd: var timeTmpl: Option[Expr] = None var recTmpl: Option[Expr] = None var othersTmpls: Seq[Expr] = Seq[Expr]() - tmplConjuncts.foreach(conj => { - conj match { - case Operator(Seq(lhs, _), _) if (tupleSelectToInst.contains(lhs)) => - tupleSelectToInst(lhs) match { - case n if n == TPR.name => - tprTmpl = Some(conj) - case n if n == Time.name => - timeTmpl = Some(conj) - case n if n == Rec.name => - recTmpl = Some(conj) - case _ => - othersTmpls = othersTmpls :+ conj - } - case _ => - othersTmpls = othersTmpls :+ conj - } - }) + tmplConjuncts.foreach { + case conj@Operator(Seq(lhs, _), _) if (tupleSelectToInst.contains(lhs)) => + tupleSelectToInst(lhs) match { + case n if n == TPR.name => + tprTmpl = Some(conj) + case n if n == Time.name => + timeTmpl = Some(conj) + case n if n == Rec.name => + recTmpl = Some(conj) + case _ => + othersTmpls = othersTmpls :+ conj + } + case conj => + othersTmpls = othersTmpls :+ conj + } (tprTmpl, recTmpl, timeTmpl, othersTmpls) } } diff --git a/src/main/scala/leon/invariant/engine/ConstraintTracker.scala b/src/main/scala/leon/invariant/engine/ConstraintTracker.scala index 3058a267eceef7c5ec1aa537c4766bee15a93204..95927a66ad3bda803a329b61e284f854a94bfcb4 100644 --- a/src/main/scala/leon/invariant/engine/ConstraintTracker.scala +++ b/src/main/scala/leon/invariant/engine/ConstraintTracker.scala @@ -1,19 +1,8 @@ package leon package invariant.engine -import z3.scala._ -import purescala._ -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ -import evaluators._ -import java.io._ - -import invariant.factories._ -import invariant.util._ import invariant.structure._ class ConstraintTracker(ctx : InferenceContext, program: Program, rootFun : FunDef/*, temFactory: TemplateFactory*/) { diff --git a/src/main/scala/leon/invariant/engine/InferInvariantsPhase.scala b/src/main/scala/leon/invariant/engine/InferInvariantsPhase.scala index e79926e62158a095b755b48db43c8f3e46c41590..3ef178a03095a74dc8233dfd1ec3739abbdb3cef 100644 --- a/src/main/scala/leon/invariant/engine/InferInvariantsPhase.scala +++ b/src/main/scala/leon/invariant/engine/InferInvariantsPhase.scala @@ -1,21 +1,7 @@ package leon package invariant.engine -import purescala.Common._ import purescala.Definitions._ -import purescala.ExprOps._ -import purescala.Expressions._ -import purescala.Extractors._ -import purescala.Types._ -import verification.VerificationReport -import invariant.templateSolvers._ -import invariant.factories._ -import invariant.util._ -import invariant.structure.FunctionUtils._ -import invariant.structure._ -import transformations._ -import leon.purescala.ScalaPrinter -import leon.purescala.PrettyPrinter /** * @author ravi diff --git a/src/main/scala/leon/invariant/engine/InferenceContext.scala b/src/main/scala/leon/invariant/engine/InferenceContext.scala index b735cb8de7101f3bf109c6318cc7a05c571ba4b7..a6cdc317d1fcd17aba9abaa5199975e664ada9bf 100644 --- a/src/main/scala/leon/invariant/engine/InferenceContext.scala +++ b/src/main/scala/leon/invariant/engine/InferenceContext.scala @@ -12,7 +12,6 @@ import invariant.util._ import verification._ import verification.VCKinds import InferInvariantsPhase._ -import Util._ import ProgramUtil._ /** @@ -71,13 +70,13 @@ class InferenceContext(val initProgram: Program, val leonContext: LeonContext) { instrumentedProg.definedFunctions.foreach((fd) => { if (!foundStrongest && fd.hasPostcondition) { val cond = fd.postcondition.get - postTraversal((e) => e match { + postTraversal { case Equals(_, _) => { rel = Equals.apply _ foundStrongest = true } case _ => ; - })(cond) + }(cond) } }) rel diff --git a/src/main/scala/leon/invariant/engine/InferenceEngine.scala b/src/main/scala/leon/invariant/engine/InferenceEngine.scala index 85491acf1924560e5fe020a38176b513da989690..6ca6ef6327d00465bbbe5141bd69b6ce1e6338a6 100644 --- a/src/main/scala/leon/invariant/engine/InferenceEngine.scala +++ b/src/main/scala/leon/invariant/engine/InferenceEngine.scala @@ -1,31 +1,18 @@ package leon package invariant.engine -import z3.scala._ -import purescala.Common._ import purescala.Definitions._ -import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ -import solvers._ import java.io._ -import verification.VerificationReport import verification.VC import scala.util.control.Breaks._ -import invariant.templateSolvers._ import invariant.factories._ import invariant.util._ -import invariant.util.Util._ -import invariant.structure._ import invariant.structure.FunctionUtils._ -import leon.invariant.factories.TemplateFactory import transformations._ import leon.utils._ import Util._ -import PredicateUtil._ import ProgramUtil._ -import SolverUtil._ /** * @author ravi @@ -85,13 +72,13 @@ class InferenceEngine(ctx: InferenceContext) extends Interruptible { } else { var remFuncs = functionsToAnalyze var b = 200 - var maxCegisBound = 200 + val maxCegisBound = 200 breakable { while (b <= maxCegisBound) { Stats.updateCumStats(1, "CegisBoundsTried") val succeededFuncs = analyseProgram(program, remFuncs, progressCallback) remFuncs = remFuncs.filterNot(succeededFuncs.contains _) - if (remFuncs.isEmpty) break; + if (remFuncs.isEmpty) break b += 5 //increase bounds in steps of 5 } //println("Inferrence did not succeeded for functions: " + remFuncs.map(_.id)) @@ -200,7 +187,7 @@ class InferenceEngine(ctx: InferenceContext) extends Interruptible { first = false ic } - progressCallback.map(cb => cb(inferCond)) + progressCallback.foreach(cb => cb(inferCond)) } val funsWithTemplates = inferredFuns.filter { fd => val origFd = functionByName(fd.id.name, startProg).get diff --git a/src/main/scala/leon/invariant/engine/InferenceReport.scala b/src/main/scala/leon/invariant/engine/InferenceReport.scala index d5f0196278d04489f657940caf74e30009fd02b9..4b0fb349f591780da0856e4ccbbe7e49f30c8d83 100644 --- a/src/main/scala/leon/invariant/engine/InferenceReport.scala +++ b/src/main/scala/leon/invariant/engine/InferenceReport.scala @@ -9,8 +9,6 @@ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Definitions._ import purescala.Common._ -import invariant.templateSolvers._ -import invariant.factories._ import invariant.util._ import invariant.structure._ import leon.transformations.InstUtil @@ -18,7 +16,6 @@ import leon.purescala.PrettyPrinter import Util._ import PredicateUtil._ import ProgramUtil._ -import SolverUtil._ import FunctionUtils._ import purescala._ @@ -64,7 +61,7 @@ class InferenceReport(fvcs: Map[FunDef, List[VC]], program: Program)(implicit ct "║ └─────────┘" + (" " * (size - 12)) + "║" private def infoLine(str: String, size: Int): String = { - "║ " + str + (" " * (size - str.size - 2)) + " ║" + "║ " + str + (" " * (size - str.length - 2)) + " ║" } private def fit(str: String, maxLength: Int): String = { @@ -77,11 +74,11 @@ class InferenceReport(fvcs: Map[FunDef, List[VC]], program: Program)(implicit ct private def funName(fd: FunDef) = InstUtil.userFunctionName(fd) - override def summaryString: String = if (conditions.size > 0) { - val maxTempSize = (conditions.map(_.status.size).max + 3) + override def summaryString: String = if (conditions.nonEmpty) { + val maxTempSize = (conditions.map(_.status.length).max + 3) val outputStrs = conditions.map(vc => { val timeStr = vc.time.map(t => "%-3.3f".format(t)).getOrElse("") - "%-15s %s %-4s".format(fit(funName(vc.fd), 15), vc.status + (" " * (maxTempSize - vc.status.size)), timeStr) + "%-15s %s %-4s".format(fit(funName(vc.fd), 15), vc.status + (" " * (maxTempSize - vc.status.length)), timeStr) }) val summaryStr = { val totalTime = conditions.foldLeft(0.0)((a, ic) => a + ic.time.getOrElse(0.0)) @@ -89,7 +86,7 @@ class InferenceReport(fvcs: Map[FunDef, List[VC]], program: Program)(implicit ct "total: %-4d inferred: %-4d unknown: %-4d time: %-3.3f".format( conditions.size, inferredConds, conditions.size - inferredConds, totalTime) } - val entrySize = (outputStrs :+ summaryStr).map(_.size).max + 2 + val entrySize = (outputStrs :+ summaryStr).map(_.length).max + 2 infoHeader(entrySize) + outputStrs.map(str => infoLine(str, entrySize)).mkString("\n", "\n", "\n") + @@ -129,7 +126,7 @@ object InferenceReportUtil { def fullNameWoInst(fd: FunDef) = { val splits = DefOps.fullName(fd)(ctx.inferProgram).split("-") - if (!splits.isEmpty) splits(0) + if (splits.nonEmpty) splits(0) else "" } @@ -148,8 +145,8 @@ object InferenceReportUtil { } def mapExpr(ine: Expr): Expr = { - val replaced = simplePostTransform((e: Expr) => e match { - case FunctionInvocation(TypedFunDef(fd, targs), args) => + val replaced = simplePostTransform { + case e@FunctionInvocation(TypedFunDef(fd, targs), args) => if (initToOutput.contains(fd)) { FunctionInvocation(TypedFunDef(initToOutput(fd), targs), args) } else { @@ -159,8 +156,8 @@ object InferenceReportUtil { case _ => e } } - case _ => e - })(ine) + case e => e + }(ine) replaced } // copy bodies and specs diff --git a/src/main/scala/leon/invariant/engine/SpecInstatiator.scala b/src/main/scala/leon/invariant/engine/SpecInstantiator.scala similarity index 100% rename from src/main/scala/leon/invariant/engine/SpecInstatiator.scala rename to src/main/scala/leon/invariant/engine/SpecInstantiator.scala diff --git a/src/main/scala/leon/invariant/engine/TemplateEnumerator.scala b/src/main/scala/leon/invariant/engine/TemplateEnumerator.scala index c568910684e89d78862a516583eb0baf31174888..1e717dbc1a23723680ecdffeb27b3f78553d1747 100644 --- a/src/main/scala/leon/invariant/engine/TemplateEnumerator.scala +++ b/src/main/scala/leon/invariant/engine/TemplateEnumerator.scala @@ -1,26 +1,15 @@ package leon package invariant.engine -import z3.scala._ -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import scala.collection.mutable.{ Set => MutableSet } -import java.io._ -import scala.collection.mutable.{ Set => MutableSet } -import scala.collection.mutable.{ Set => MutableSet } -import invariant.templateSolvers._ import invariant.factories._ import invariant.util._ -import invariant.structure._ -import Util._ -import PredicateUtil._ import ProgramUtil._ +import scala.collection.mutable.{Set => MutableSet} /** * An enumeration based template generator. * Enumerates all numerical terms in some order (this enumeration is incomplete for termination). @@ -126,7 +115,7 @@ class FunctionTemplateEnumerator(rootFun: FunDef, prog: Program, op: (Expr, Expr if (fun != rootFun && !callGraph.transitivelyCalls(fun, rootFun)) { //check if every argument has at least one satisfying assignment? - if (fun.params.filter((vardecl) => !ttCurrent.contains(vardecl.getType)).isEmpty) { + if (!fun.params.exists((vardecl) => !ttCurrent.contains(vardecl.getType))) { //here compute all the combinations val newcalls = generateFunctionCalls(fun) @@ -153,7 +142,7 @@ class FunctionTemplateEnumerator(rootFun: FunDef, prog: Program, op: (Expr, Expr //return all the integer valued terms of newTerms //++ newTerms.getOrElse(Int32Type, Seq[Expr]()) (for now not handling int 32 terms) val numericTerms = (newTerms.getOrElse(RealType, Seq[Expr]()) ++ newTerms.getOrElse(IntegerType, Seq[Expr]())).toSeq - if (!numericTerms.isEmpty) { + if (numericTerms.nonEmpty) { //create a linear combination of intTerms val newTemp = numericTerms.foldLeft(null: Expr)((acc, t: Expr) => { val summand = Times(t, TemplateIdFactory.freshTemplateVar(): Expr) diff --git a/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala b/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala index 4bb5bbc3d76a341151ff9478b139f2ad8157485d..a53456e73f72d323aca3597623ab9998c106bf94 100644 --- a/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala +++ b/src/main/scala/leon/invariant/engine/UnfoldingTemplateSolver.scala @@ -1,31 +1,24 @@ package leon package invariant.engine -import z3.scala._ import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ import purescala.DefOps._ -import solvers._ -import solvers.z3.FairZ3Solver -import java.io._ import purescala.ScalaPrinter + +import solvers._ import verification._ -import scala.reflect.runtime.universe -import invariant.templateSolvers._ import invariant.factories._ import invariant.util._ import invariant.structure._ import transformations._ import FunctionUtils._ -import leon.invariant.templateSolvers.ExtendedUFSolver import Util._ import PredicateUtil._ import ProgramUtil._ -import SolverUtil._ /** * @author ravi @@ -119,7 +112,7 @@ class UnfoldingTemplateSolver(ctx: InferenceContext, program: Program, rootFd: F case (Some(model), callsInPath) => toRefineCalls = callsInPath //Validate the model here - instantiateAndValidateModel(model, constTracker.getFuncs.toSeq) + instantiateAndValidateModel(model, constTracker.getFuncs) Some(InferResult(true, Some(model), constTracker.getFuncs.toList)) case (None, callsInPath) => @@ -129,7 +122,7 @@ class UnfoldingTemplateSolver(ctx: InferenceContext, program: Program, rootFd: F } } } - } while (!infRes.isDefined) + } while (infRes.isEmpty) infRes } diff --git a/src/main/scala/leon/invariant/factories/AxiomFactory.scala b/src/main/scala/leon/invariant/factories/AxiomFactory.scala index 6fdf7fa633def45017de8df5fbab4250ce70928e..907db46ab1cf1fbd4efcc19f58ae5867142575f6 100644 --- a/src/main/scala/leon/invariant/factories/AxiomFactory.scala +++ b/src/main/scala/leon/invariant/factories/AxiomFactory.scala @@ -1,24 +1,13 @@ package leon package invariant.factories -import z3.scala._ -import purescala.Common._ -import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import java.io._ -import leon.invariant._ -import scala.util.control.Breaks._ -import scala.concurrent._ -import scala.concurrent.duration._ import invariant.engine._ import invariant.util._ import invariant.structure._ import FunctionUtils._ -import Util._ import PredicateUtil._ class AxiomFactory(ctx : InferenceContext) { @@ -85,7 +74,6 @@ class AxiomFactory(ctx : InferenceContext) { //this is applicable only to binary operations def undistributeCalls(call1: Call, call2: Call): (Expr,Expr) = { - val fd = call1.fi.tfd.fd val tfd = call1.fi.tfd val Seq(a1,b1) = call1.fi.args @@ -93,9 +81,7 @@ class AxiomFactory(ctx : InferenceContext) { val r1 = call1.retexpr val r2 = call2.retexpr - val dret1 = TVarFactory.createTemp("dt", IntegerType).toVariable val dret2 = TVarFactory.createTemp("dt", IntegerType).toVariable - val dcall1 = Call(dret1, FunctionInvocation(tfd,Seq(a2,Plus(b1,b2)))) val dcall2 = Call(dret2, FunctionInvocation(tfd,Seq(Plus(a1,a2),b2))) (LessEquals(b1,b2), And(LessEquals(Plus(r1,r2),dret2), dcall2.toExpr)) } diff --git a/src/main/scala/leon/invariant/factories/TemplateFactory.scala b/src/main/scala/leon/invariant/factories/TemplateFactory.scala index ab1f51359151de13ef8cd506f4f1c9da9472c208..b44fcfa684d66168cad5de3e0cca7d8df5d11f50 100644 --- a/src/main/scala/leon/invariant/factories/TemplateFactory.scala +++ b/src/main/scala/leon/invariant/factories/TemplateFactory.scala @@ -1,23 +1,16 @@ package leon package invariant.factories -import z3.scala._ import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import java.io._ -import scala.collection.mutable.{ Map => MutableMap } -import invariant._ import scala.collection.mutable.{Map => MutableMap} -import invariant.engine._ import invariant.util._ import invariant.structure._ import FunctionUtils._ -import Util._ import PredicateUtil._ import ProgramUtil._ @@ -28,7 +21,7 @@ object TemplateIdFactory { def getTemplateIds : Set[Identifier] = ids def freshIdentifier(name : String = "", idType: TypeTree = RealType) : Identifier = { - val idname = if(name.isEmpty()) "a?" + val idname = if(name.isEmpty) "a?" else name + "?" val freshid = FreshIdentifier(idname, idType, true) ids += freshid @@ -72,7 +65,7 @@ class TemplateFactory(tempGen : Option[TemplateGenerator], prog: Program, report //a mapping from function definition to the template private var templateMap = { //initialize the template map with predefined user maps - var muMap = MutableMap[FunDef, Expr]() + val muMap = MutableMap[FunDef, Expr]() functionsWOFields(prog.definedFunctions).foreach { fd => val tmpl = fd.template if (tmpl.isDefined) { @@ -114,7 +107,7 @@ class TemplateFactory(tempGen : Option[TemplateGenerator], prog: Program, report //initialize the template for the function if (!templateMap.contains(fd)) { - if(!tempGen.isDefined) templateMap += (fd -> getDefaultTemplate(fd)) + if(tempGen.isEmpty) templateMap += (fd -> getDefaultTemplate(fd)) else { templateMap += (fd -> tempGen.get.getNextTemplate(fd)) refinementSet += fd diff --git a/src/main/scala/leon/invariant/factories/TemplateInstantiator.scala b/src/main/scala/leon/invariant/factories/TemplateInstantiator.scala index ccaabc57aabecb9fa22fd94a5972c1a554196729..dbcdc4c5e1a2de62fb5a1c1e81ebe17b4449a584 100644 --- a/src/main/scala/leon/invariant/factories/TemplateInstantiator.scala +++ b/src/main/scala/leon/invariant/factories/TemplateInstantiator.scala @@ -1,23 +1,15 @@ package leon package invariant.factories -import z3.scala._ -import purescala._ -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Extractors._ -import purescala.Types._ -import java.io._ -import invariant.engine._ import invariant.util._ import invariant.structure._ import leon.solvers.Model import leon.invariant.util.RealValuedExprEvaluator -import Util._ import PredicateUtil._ -import ProgramUtil._ object TemplateInstantiator { /** @@ -51,17 +43,17 @@ object TemplateInstantiator { */ def instantiate(expr: Expr, tempVarMap: Map[Expr, Expr], prettyInv: Boolean = false): Expr = { //do a simple post transform and replace the template vars by their values - val inv = simplePostTransform((tempExpr: Expr) => tempExpr match { - case e @ Operator(Seq(lhs, rhs), op) if ((e.isInstanceOf[Equals] || e.isInstanceOf[LessThan] + val inv = simplePostTransform { + case tempExpr@(e@Operator(Seq(lhs, rhs), op)) if ((e.isInstanceOf[Equals] || e.isInstanceOf[LessThan] || e.isInstanceOf[LessEquals] || e.isInstanceOf[GreaterThan] || e.isInstanceOf[GreaterEquals]) && - !getTemplateVars(tempExpr).isEmpty) => { + getTemplateVars(tempExpr).nonEmpty) => { val linearTemp = LinearConstraintUtil.exprToTemplate(tempExpr) instantiateTemplate(linearTemp, tempVarMap, prettyInv) } - case _ => tempExpr - })(expr) + case tempExpr => tempExpr + }(expr) inv } diff --git a/src/main/scala/leon/invariant/factories/TemplateSolverFactory.scala b/src/main/scala/leon/invariant/factories/TemplateSolverFactory.scala index 469317998a98f979a9a90770fd9c902544eee584..96c8d212a59cfc39c8cc428dc521f8e4a278a004 100644 --- a/src/main/scala/leon/invariant/factories/TemplateSolverFactory.scala +++ b/src/main/scala/leon/invariant/factories/TemplateSolverFactory.scala @@ -1,12 +1,8 @@ package leon package invariant.factories -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ import invariant._ import invariant.engine._ import invariant.util._ diff --git a/src/main/scala/leon/invariant/structure/Constraint.scala b/src/main/scala/leon/invariant/structure/Constraint.scala index 9d2490fe5f8b61b6847636007c61d6ba3c0dba34..39fd20bca11971ba0feadf26e20331970f9a9ca7 100644 --- a/src/main/scala/leon/invariant/structure/Constraint.scala +++ b/src/main/scala/leon/invariant/structure/Constraint.scala @@ -1,23 +1,10 @@ package leon package invariant.structure -import z3.scala._ -import purescala._ -import purescala.Common._ -import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import solvers.{ Solver, TimeoutSolver } -import solvers.z3.FairZ3Solver -import scala.collection.mutable.{ Set => MutableSet } -import scala.collection.mutable.{ Map => MutableMap } -import evaluators._ -import java.io._ -import solvers.z3.UninterpretedZ3Solver import invariant.util._ -import Util._ import PredicateUtil._ trait Constraint { @@ -42,9 +29,7 @@ class LinearTemplate(oper: Seq[Expr] => Expr, } val coeffTemplate = { //assert if the coefficients are templated expressions - assert(coeffTemp.values.foldLeft(true)((acc, e) => { - acc && isTemplateExpr(e) - })) + assert(coeffTemp.values.forall(e => isTemplateExpr(e))) coeffTemp } @@ -110,7 +95,7 @@ class LinearTemplate(oper: Seq[Expr] => Expr, rhsExprs :+= InfiniteIntegerLiteral(-v) case Some(c) => lhsExprs :+= c - case _ => Nil + case _ => } val lhsExprOpt = ((None: Option[Expr]) /: lhsExprs) { case (acc, minterm) => @@ -175,9 +160,7 @@ class LinearConstraint(opr: Seq[Expr] => Expr, cMap: Map[Expr, Expr], constant: val coeffMap = { //assert if the coefficients are only constant expressions - assert(cMap.values.foldLeft(true)((acc, e) => { - acc && variablesOf(e).isEmpty - })) + assert(cMap.values.forall(e => variablesOf(e).isEmpty)) //TODO: here we should try to simplify the constant expressions cMap } diff --git a/src/main/scala/leon/invariant/structure/Formula.scala b/src/main/scala/leon/invariant/structure/Formula.scala index daed61ff679cba61666a6c227005c103a31d8d01..c17711e102877861010359256ff902ad7d51d70b 100644 --- a/src/main/scala/leon/invariant/structure/Formula.scala +++ b/src/main/scala/leon/invariant/structure/Formula.scala @@ -22,8 +22,7 @@ import PredicateUtil._ /** * Data associated with a call */ -class CallData(val guard : Variable, val parents: List[FunDef]) { -} +class CallData(val guard : Variable, val parents: List[FunDef]) /** * Representation of an expression as a set of implications. @@ -81,13 +80,13 @@ class Formula(val fd: FunDef, initexpr: Expr, ctx: InferenceContext) { }) } - val f1 = simplePostTransform((e: Expr) => e match { - case Or(args) => { - val newargs = args.map(arg => arg match { - case v: Variable if (disjuncts.contains(v)) => arg - case v: Variable if (conjuncts.contains(v)) => throw new IllegalStateException("or gaurd inside conjunct: "+e+" or-guard: "+v) - case _ => { - val atoms = arg match { + val f1 = simplePostTransform { + case e@Or(args) => { + val newargs = args.map { + case arg@(v: Variable) if (disjuncts.contains(v)) => arg + case v: Variable if (conjuncts.contains(v)) => throw new IllegalStateException("or gaurd inside conjunct: " + e + " or-guard: " + v) + case arg => { + val atoms = arg match { case And(atms) => atms case _ => Seq(arg) } @@ -98,14 +97,14 @@ class Formula(val fd: FunDef, initexpr: Expr, ctx: InferenceContext) { disjuncts += (g -> ctrs) g } - }) + } //create a temporary for Or val gor = TVarFactory.createTemp("b", BooleanType).toVariable val newor = createOr(newargs) conjuncts += (gor -> newor) gor } - case And(args) => { + case e@And(args) => { val newargs = args.map(arg => if (getTemplateVars(e).isEmpty) { arg } else { @@ -118,8 +117,8 @@ class Formula(val fd: FunDef, initexpr: Expr, ctx: InferenceContext) { }) createAnd(newargs) } - case _ => e - })(ExpressionTransformer.simplify(simplifyArithmetic( + case e => e + }(ExpressionTransformer.simplify(simplifyArithmetic( //TODO: this is a hack as of now. Fix this. //Note: it is necessary to convert real literals to integers since the linear constraint cannot handle real literals if(ctx.usereals) ExpressionTransformer.FractionalLiteralToInt(ine) @@ -151,7 +150,7 @@ class Formula(val fd: FunDef, initexpr: Expr, ctx: InferenceContext) { val e @ Or(guards) = conjuncts(gd) //pick one guard that is true val guard = guards.collectFirst { case g @ Variable(id) if (model(id) == tru) => g } - if (!guard.isDefined) + if (guard.isEmpty) throw new IllegalStateException("No satisfiable guard found: " + e) guard.get +: traverseAnds(guard.get, model) } @@ -236,16 +235,16 @@ class Formula(val fd: FunDef, initexpr: Expr, ctx: InferenceContext) { //replace all conjunct guards in disjuncts by their mapping val disjs : Map[Expr,Expr] = disjuncts.map((entry) => { val (g,ctrs) = entry - val newctrs = ctrs.map(_ match { + val newctrs = ctrs.map { case BoolConstraint(g@Variable(_)) if conjuncts.contains(g) => conjuncts(g) case ctr@_ => ctr.toExpr - }) + } (g, createAnd(newctrs)) }) - val rootexprs = roots.map(_ match { - case g@Variable(_) if conjuncts.contains(g) => conjuncts(g) - case e@_ => e - }) + val rootexprs = roots.map { + case g@Variable(_) if conjuncts.contains(g) => conjuncts(g) + case e@_ => e + } //replace every guard in the 'disjs' by its disjunct. DO this as long as every guard is replaced in every disjunct var unpackedDisjs = disjs var replacedGuard = true diff --git a/src/main/scala/leon/invariant/structure/LinearConstraintUtil.scala b/src/main/scala/leon/invariant/structure/LinearConstraintUtil.scala index 7910df7230e82f7ac8b695bc8089fcd64c005e3a..5ed3316a44bb6d0baaec32dd1962fbe7f78af0f5 100644 --- a/src/main/scala/leon/invariant/structure/LinearConstraintUtil.scala +++ b/src/main/scala/leon/invariant/structure/LinearConstraintUtil.scala @@ -3,23 +3,15 @@ package invariant.structure import purescala._ import purescala.Common._ -import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Extractors._ -import purescala.Types._ -import scala.collection.mutable.{ Set => MutableSet } import scala.collection.mutable.{ Map => MutableMap } -import java.io._ import invariant.util._ import BigInt._ -import Constructors._ -import Util._ import PredicateUtil._ -class NotImplementedException(message: String) extends RuntimeException(message) { - -} +class NotImplementedException(message: String) extends RuntimeException(message) //a collections of utility methods that manipulate the templates object LinearConstraintUtil { @@ -31,14 +23,14 @@ object LinearConstraintUtil { //some utility methods def getFIs(ctr: LinearConstraint): Set[FunctionInvocation] = { - val fis = ctr.coeffMap.keys.collect((e) => e match { + val fis = ctr.coeffMap.keys.collect { case fi: FunctionInvocation => fi - }) + } fis.toSet } def evaluate(lt: LinearTemplate): Option[Boolean] = lt match { - case lc: LinearConstraint if (lc.coeffMap.size == 0) => + case lc: LinearConstraint if lc.coeffMap.isEmpty => ExpressionTransformer.simplify(lt.toExpr) match { case BooleanLiteral(v) => Some(v) case _ => None @@ -74,7 +66,7 @@ object LinearConstraintUtil { } } else coeffMap += (term -> simplifyArithmetic(coeff)) - if (!variablesOf(coeff).isEmpty) { + if (variablesOf(coeff).nonEmpty) { isTemplate = true } } @@ -86,7 +78,7 @@ object LinearConstraintUtil { } else constant = Some(simplifyArithmetic(coeff)) - if (!variablesOf(coeff).isEmpty) { + if (variablesOf(coeff).nonEmpty) { isTemplate = true } } @@ -341,7 +333,6 @@ object LinearConstraintUtil { //now consider each constraint look for (a) equality involving the elimVar or (b) check if all bounds are lower //or (c) if all bounds are upper. var elimExpr : Option[Expr] = None - var bestExpr = false var elimCtr : Option[LinearConstraint] = None var allUpperBounds : Boolean = true var allLowerBounds : Boolean = true @@ -354,7 +345,7 @@ object LinearConstraintUtil { foundEquality = true //here, sometimes we replace an existing expression with a better one if available - if (!elimExpr.isDefined || shouldReplace(elimExpr.get, lc, elimVar)) { + if (elimExpr.isEmpty || shouldReplace(elimExpr.get, lc, elimVar)) { //if the coeffcient of elimVar is +ve the the sign of the coeff of every other term should be changed val InfiniteIntegerLiteral(elimCoeff) = lc.coeffMap(elimVar.toVariable) //make sure the value of the coefficient is 1 or -1 diff --git a/src/main/scala/leon/invariant/templateSolvers/CegisSolver.scala b/src/main/scala/leon/invariant/templateSolvers/CegisSolver.scala index 98f162fea4b2974702c4672274ed6d8f86075690..15ae673019e9c50eb3ff257fc88114c935230342 100644 --- a/src/main/scala/leon/invariant/templateSolvers/CegisSolver.scala +++ b/src/main/scala/leon/invariant/templateSolvers/CegisSolver.scala @@ -1,23 +1,17 @@ package leon package invariant.templateSolvers -import z3.scala._ + import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ -import java.io._ -import scala.util.control.Breaks._ import solvers._ -import solvers.z3._ import invariant.engine._ import invariant.factories._ import invariant.util._ import invariant.structure._ import invariant.structure.FunctionUtils._ import leon.invariant.util.RealValuedExprEvaluator._ -import Util._ import PredicateUtil._ import SolverUtil._ @@ -95,7 +89,7 @@ class CegisCore(ctx: InferenceContext, val tempVarSum = if (minimizeSum) { //compute the sum of the tempIds val rootTempIds = getTemplateVars(cegisSolver.rootFun.getTemplate) - if (rootTempIds.size >= 1) { + if (rootTempIds.nonEmpty) { rootTempIds.tail.foldLeft(rootTempIds.head.asInstanceOf[Expr])((acc, tvar) => Plus(acc, tvar)) } else zero } else zero @@ -126,7 +120,7 @@ class CegisCore(ctx: InferenceContext, //sanity checks val spuriousTempIds = variablesOf(instFormula).intersect(TemplateIdFactory.getTemplateIds) - if (!spuriousTempIds.isEmpty) + if (spuriousTempIds.nonEmpty) throw new IllegalStateException("Found a template variable in instFormula: " + spuriousTempIds) if (hasReals(instFormula)) throw new IllegalStateException("Reals in instFormula: " + instFormula) @@ -144,21 +138,21 @@ class CegisCore(ctx: InferenceContext, //simplify the tempctrs, evaluate every atom that does not involve a template variable //this should get rid of all functions val satctrs = - simplePreTransform((e) => e match { + simplePreTransform { //is 'e' free of template variables ? - case _ if (variablesOf(e).filter(TemplateIdFactory.IsTemplateIdentifier _).isEmpty) => { + case e if !variablesOf(e).exists(TemplateIdFactory.IsTemplateIdentifier _) => { //evaluate the term val value = solver1.evalExpr(e) if (value.isDefined) value.get else throw new IllegalStateException("Cannot evaluate expression: " + e) } - case _ => e - })(Not(formula)) + case e => e + }(Not(formula)) solver1.free() //sanity checks val spuriousProgIds = variablesOf(satctrs).filterNot(TemplateIdFactory.IsTemplateIdentifier _) - if (!spuriousProgIds.isEmpty) + if (spuriousProgIds.nonEmpty) throw new IllegalStateException("Found a progam variable in tempctrs: " + spuriousProgIds) val tempctrs = if (!solveAsInt) ExpressionTransformer.IntLiteralToReal(satctrs) else satctrs @@ -201,7 +195,7 @@ class CegisCore(ctx: InferenceContext, println("2: " + (if (res1.isDefined) "solved" else "timed out") + "... in " + (t4 - t3) / 1000.0 + "s") if (res1.isDefined) { - if (res1.get == false) { + if (!res1.get) { //there exists no solution for templates (Some(false), newctr, Model.empty) diff --git a/src/main/scala/leon/invariant/templateSolvers/ExtendedUFSolver.scala b/src/main/scala/leon/invariant/templateSolvers/ExtendedUFSolver.scala index 805f09a941139d817309a3a10df0b07cd57a21aa..9a9c1b0b4290b07408adb33c0e174813de831a29 100644 --- a/src/main/scala/leon/invariant/templateSolvers/ExtendedUFSolver.scala +++ b/src/main/scala/leon/invariant/templateSolvers/ExtendedUFSolver.scala @@ -4,16 +4,9 @@ package leon package invariant.templateSolvers import z3.scala._ -import leon.solvers._ -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ -import purescala.Extractors._ -import purescala.ExprOps._ -import purescala.Types._ -import leon.LeonContext import leon.solvers.z3.UninterpretedZ3Solver -import leon.solvers.smtlib.SMTLIBZ3Solver /** * A uninterpreted solver extended with additional functionalities. diff --git a/src/main/scala/leon/invariant/templateSolvers/FarkasLemmaSolver.scala b/src/main/scala/leon/invariant/templateSolvers/FarkasLemmaSolver.scala index 19dee9ab4be261cd2378d2146864fb9566912ca3..a4e20f61a7424ee59724b8cf4374cecbcaf84f9f 100644 --- a/src/main/scala/leon/invariant/templateSolvers/FarkasLemmaSolver.scala +++ b/src/main/scala/leon/invariant/templateSolvers/FarkasLemmaSolver.scala @@ -1,26 +1,19 @@ package leon package invariant.templateSolvers -import z3.scala._ -import purescala._ import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import java.io._ import solvers.SimpleSolverAPI -import scala.collection.mutable.{ Map => MutableMap } import invariant.engine._ -import invariant.factories._ import invariant.util._ import Util._ -import ProgramUtil._ import SolverUtil._ import PredicateUtil._ -import TimerUtil._ import invariant.structure._ +import invariant.datastructure._ import leon.solvers.TimeoutSolver import leon.solvers.SolverFactory import leon.solvers.TimeoutSolverFactory @@ -83,8 +76,8 @@ class FarkasLemmaSolver(ctx: InferenceContext, program: Program) { println("#" * 20) //Optimization 1: Check if ants are unsat (already handled) - val pathVC = createAnd(antsSimple.map(_.toExpr).toSeq ++ conseqsSimple.map(_.toExpr).toSeq) - val notPathVC = And(createAnd(antsSimple.map(_.toExpr).toSeq), Not(createAnd(conseqsSimple.map(_.toExpr).toSeq))) + val pathVC = createAnd(antsSimple.map(_.toExpr) ++ conseqsSimple.map(_.toExpr)) + val notPathVC = And(createAnd(antsSimple.map(_.toExpr)), Not(createAnd(conseqsSimple.map(_.toExpr)))) val (satVC, _) = uisolver.solveSAT(pathVC) val (satNVC, _) = uisolver.solveSAT(notPathVC) @@ -135,7 +128,7 @@ class FarkasLemmaSolver(ctx: InferenceContext, program: Program) { strictCtrLambdas :+= l GreaterEquals(l, zero) } - }).toSeq :+ GreaterEquals(lambda0, zero)) + }) :+ GreaterEquals(lambda0, zero)) //add the constraints on constant terms val sumConst = ants.foldLeft(UMinus(lambda0): Expr)((acc, ant) => ant.constTemplate match { @@ -206,7 +199,7 @@ class FarkasLemmaSolver(ctx: InferenceContext, program: Program) { // factor out common nonlinear terms and create an equiv-satisfiable constraint def reduceCommonNLTerms(ctrs: Expr) = { - var nlUsage = new CounterMap[Expr]() + val nlUsage = new CounterMap[Expr]() postTraversal{ case t: Times => nlUsage.inc(t) case e => ; @@ -223,7 +216,7 @@ class FarkasLemmaSolver(ctx: InferenceContext, program: Program) { // try eliminate nonlinearity to whatever extent possible var elimMap = Map[Identifier, (Identifier, Identifier)]() // maps the fresh identifiers to the product of the identifiers they represent. def reduceNonlinearity(farkasctrs: Expr): Expr = { - var varCounts = new CounterMap[Identifier]() + val varCounts = new CounterMap[Identifier]() // collect # of uses of each variable postTraversal { case Variable(id) => varCounts.inc(id) diff --git a/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolver.scala b/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolver.scala index 41d672fe5a94861197430a69c9516985e46f2511..90cffa3f181d11deb499a06ec538a515ed164ac1 100644 --- a/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolver.scala +++ b/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolver.scala @@ -9,7 +9,6 @@ import purescala.ExprOps._ import purescala.Extractors._ import purescala.Types._ import evaluators._ -import scala.collection.mutable.{ Map => MutableMap } import java.io._ import solvers._ import solvers.combinators._ @@ -369,7 +368,7 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, val cegisSolver = new CegisCore(ctx, program, timeout.toInt, this) val (res, ctr, model) = cegisSolver.solve(tempIds, expr, precond, solveAsInt = false, initModel) - if (!res.isDefined) + if (res.isEmpty) reporter.info("cegis timed-out on the disjunct...") (res, ctr, model) } @@ -508,7 +507,7 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, val InfiniteIntegerLiteral(v) = model(id) v } - def eval: (Expr => Boolean) = e => e match { + def eval: (Expr => Boolean) = { case And(args) => args.forall(eval) // case Iff(Variable(id1), Variable(id2)) => model(id1) == model(id2) case Equals(Variable(id1), Variable(id2)) => model(id1) == model(id2) //note: ADTs can also be compared for equality @@ -516,7 +515,7 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, case GreaterEquals(Variable(id1), Variable(id2)) => modelVal(id1) >= modelVal(id2) case GreaterThan(Variable(id1), Variable(id2)) => modelVal(id1) > modelVal(id2) case LessThan(Variable(id1), Variable(id2)) => modelVal(id1) < modelVal(id2) - case _ => throw new IllegalStateException("Predicate not handled: " + e) + case e => throw new IllegalStateException("Predicate not handled: " + e) } eval } @@ -526,14 +525,14 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, //println("Identifier: "+id) model(id).asInstanceOf[FractionalLiteral] } - (e: Expr) => e match { + { case Equals(Variable(id1), Variable(id2)) => model(id1) == model(id2) //note: ADTs can also be compared for equality - case Operator(Seq(Variable(id1), Variable(id2)), op) if (e.isInstanceOf[LessThan] + case e@Operator(Seq(Variable(id1), Variable(id2)), op) if (e.isInstanceOf[LessThan] || e.isInstanceOf[LessEquals] || e.isInstanceOf[GreaterThan] || e.isInstanceOf[GreaterEquals]) => { evaluateRealPredicate(op(Seq(modelVal(id1), modelVal(id2)))) } - case _ => throw new IllegalStateException("Predicate not handled: " + e) + case e => throw new IllegalStateException("Predicate not handled: " + e) } } @@ -587,11 +586,11 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, var calls = Set[Call]() var cons = Set[Expr]() - satCtrs.foreach(ctr => ctr match { + satCtrs.foreach { case t: Call => calls += t case t: ADTConstraint if (t.cons.isDefined) => cons += t.cons.get case _ => ; - }) + } val callExprs = calls.map(_.toExpr) var t1 = System.currentTimeMillis() @@ -617,11 +616,11 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, //exclude guards, separate calls and cons from the rest var lnctrs = Set[LinearConstraint]() var temps = Set[LinearTemplate]() - (satCtrs ++ callCtrs ++ axiomCtrs ++ theoryCtrs).foreach(ctr => ctr match { + (satCtrs ++ callCtrs ++ axiomCtrs ++ theoryCtrs).foreach { case t: LinearConstraint => lnctrs += t case t: LinearTemplate => temps += t case _ => ; - }) + } if (this.debugChooseDisjunct) { lnctrs.map(_.toExpr).foreach((ctr) => { @@ -693,7 +692,7 @@ class NLTemplateSolver(ctx: InferenceContext, program: Program, var elimRems = Set[Identifier]() elimLnctrs.foreach((lc) => { val evars = variablesOf(lc.toExpr).intersect(elimVars) - if (!evars.isEmpty) { + if (evars.nonEmpty) { elimCtrs :+= lc elimCtrCount += 1 elimRems ++= evars diff --git a/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolverWithMult.scala b/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolverWithMult.scala index a2a6524c6d6f52ffa232129b4adb2ff0f794ee42..d67955ff9efd38dd9c5c70b0684b04b5cda1661b 100644 --- a/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolverWithMult.scala +++ b/src/main/scala/leon/invariant/templateSolvers/NLTemplateSolverWithMult.scala @@ -1,15 +1,9 @@ package leon package invariant.templateSolvers -import z3.scala._ -import purescala.Common._ + import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ import purescala.Extractors._ -import purescala.Types._ -import java.io._ -import leon.invariant._ -import scala.util.control.Breaks._ import solvers._ import invariant.engine._ @@ -18,7 +12,6 @@ import invariant.util._ import invariant.structure._ import Util._ import PredicateUtil._ -import SolverUtil._ class NLTemplateSolverWithMult(ctx : InferenceContext, program: Program, rootFun: FunDef, ctrTracker: ConstraintTracker, minimizer: Option[(Expr, Model) => Model]) @@ -42,10 +35,10 @@ class NLTemplateSolverWithMult(ctx : InferenceContext, program: Program, rootFun //in the sequel we instantiate axioms for multiplication val inst1 = unaryMultAxioms(formula, calls, predEval(model)) val inst2 = binaryMultAxioms(formula,calls, predEval(model)) - val multCtrs = (inst1 ++ inst2).flatMap(_ match { + val multCtrs = (inst1 ++ inst2).flatMap { case And(args) => args.map(ConstraintUtil.createConstriant _) case e => Seq(ConstraintUtil.createConstriant(e)) - }) + } Stats.updateCounterStats(multCtrs.size, "MultAxiomBlowup", "disjuncts") ctx.reporter.info("Number of multiplication induced predicates: "+multCtrs.size) diff --git a/src/main/scala/leon/invariant/templateSolvers/TemplateSolver.scala b/src/main/scala/leon/invariant/templateSolvers/TemplateSolver.scala index dceed68279e089122875d19c86664425df49aa22..a85a7d4f5b9f55af812da50d577ec36d350b7ce5 100644 --- a/src/main/scala/leon/invariant/templateSolvers/TemplateSolver.scala +++ b/src/main/scala/leon/invariant/templateSolvers/TemplateSolver.scala @@ -1,18 +1,11 @@ package leon package invariant.templateSolvers -import z3.scala._ import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ import java.io._ -import leon.invariant._ -import scala.util.control.Breaks._ -import scala.concurrent._ -import scala.concurrent.duration._ import invariant.engine._ import invariant.factories._ import invariant.util._ diff --git a/src/main/scala/leon/invariant/templateSolvers/UFADTEliminator.scala b/src/main/scala/leon/invariant/templateSolvers/UFADTEliminator.scala index f41ec7e8963a45978fb4a9ac3fe091de48140d10..6b2aa300b2792f7f86b5f01565ee783731f8d863 100644 --- a/src/main/scala/leon/invariant/templateSolvers/UFADTEliminator.scala +++ b/src/main/scala/leon/invariant/templateSolvers/UFADTEliminator.scala @@ -1,20 +1,14 @@ package leon package invariant.templateSolvers -import z3.scala._ -import purescala.Common._ + import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ import purescala.Extractors._ import purescala.Types._ -import java.io._ import invariant.datastructure.UndirectedGraph -import scala.util.control.Breaks._ import invariant.util._ import leon.purescala.TypeOps import PredicateUtil._ -import SolverUtil._ -import Util._ class UFADTEliminator(ctx: LeonContext, program: Program) { @@ -113,7 +107,7 @@ class UFADTEliminator(ctx: LeonContext, program: Program) { lhs :+ rhs } //remove self equalities. - val preds = eqs.filter(_ match { + val preds = eqs.filter { case Operator(Seq(Variable(lid), Variable(rid)), _) => { if (lid == rid) false else { @@ -121,8 +115,8 @@ class UFADTEliminator(ctx: LeonContext, program: Program) { else false } } - case e @ _ => throw new IllegalStateException("Not an equality or Iff: " + e) - }) + case e@_ => throw new IllegalStateException("Not an equality or Iff: " + e) + } preds } @@ -134,21 +128,21 @@ class UFADTEliminator(ctx: LeonContext, program: Program) { axiomatizeADTCons(call1, call2) } - if (makeEfficient && ants.exists(_ match { + if (makeEfficient && ants.exists { case Equals(l, r) if (l.getType != RealType && l.getType != BooleanType && l.getType != IntegerType) => true case _ => false - })) { + }) { Seq() } else { var unsatIntEq: Option[Expr] = None var unsatOtherEq: Option[Expr] = None ants.foreach(eq => - if (!unsatOtherEq.isDefined) { + if (unsatOtherEq.isEmpty) { eq match { case Equals(lhs @ Variable(_), rhs @ Variable(_)) if !predEval(Equals(lhs, rhs)) => { if (lhs.getType != Int32Type && lhs.getType != RealType && lhs.getType != IntegerType) unsatOtherEq = Some(eq) - else if (!unsatIntEq.isDefined) + else if (unsatIntEq.isEmpty) unsatIntEq = Some(eq) } case _ => ; diff --git a/src/main/scala/leon/invariant/util/ExpressionTransformer.scala b/src/main/scala/leon/invariant/util/ExpressionTransformer.scala index 6750bd59c144fa656b2d820516d6691e3e169862..9bf2889ed103f0e14083a031e5b80c700e5c89d0 100644 --- a/src/main/scala/leon/invariant/util/ExpressionTransformer.scala +++ b/src/main/scala/leon/invariant/util/ExpressionTransformer.scala @@ -8,10 +8,7 @@ import purescala.ExprOps._ import purescala.Extractors._ import purescala.Types._ import java.io._ -import java.io._ import purescala.ScalaPrinter -import invariant.structure.Call -import invariant.structure.FunctionUtils._ import leon.invariant.factories.TemplateIdFactory import PredicateUtil._ import Util._ @@ -185,7 +182,7 @@ object ExpressionTransformer { } } val (nexp, ncjs) = transform(inexpr, false) - val res = if (!ncjs.isEmpty) { + val res = if (ncjs.nonEmpty) { createAnd(nexp +: ncjs.toSeq) } else nexp res @@ -283,31 +280,30 @@ object ExpressionTransformer { def flattenArgs(args: Seq[Expr], insideFunction: Boolean): (Seq[Expr], Set[Expr]) = { var newConjuncts = Set[Expr]() - val newargs = args.map((arg) => - arg match { - case v: Variable => v - case r: ResultVariable => r - case _ => { - val (nexpr, ncjs) = flattenFunc(arg, insideFunction) - - newConjuncts ++= ncjs - - nexpr match { - case v: Variable => v - case r: ResultVariable => r - case _ => { - val freshArgVar = Variable(TVarFactory.createTemp("arg", arg.getType)) - newConjuncts += Equals(freshArgVar, nexpr) - freshArgVar - } + val newargs = args.map { + case v: Variable => v + case r: ResultVariable => r + case arg => { + val (nexpr, ncjs) = flattenFunc(arg, insideFunction) + + newConjuncts ++= ncjs + + nexpr match { + case v: Variable => v + case r: ResultVariable => r + case _ => { + val freshArgVar = Variable(TVarFactory.createTemp("arg", arg.getType)) + newConjuncts += Equals(freshArgVar, nexpr) + freshArgVar } } - }) + } + } (newargs, newConjuncts) } val (nexp, ncjs) = flattenFunc(inExpr, false) - if (!ncjs.isEmpty) { + if (ncjs.nonEmpty) { createAnd(nexp +: ncjs.toSeq) } else nexp } @@ -387,7 +383,7 @@ object ExpressionTransformer { */ def pullAndOrs(expr: Expr): Expr = { - simplePostTransform((e: Expr) => e match { + simplePostTransform { case Or(args) => { val newArgs = args.foldLeft(Seq[Expr]())((acc, arg) => arg match { case Or(inArgs) => acc ++ inArgs @@ -402,8 +398,8 @@ object ExpressionTransformer { }) createAnd(newArgs) } - case _ => e - })(expr) + case e => e + }(expr) } def classSelToCons(e: Expr): Expr = { @@ -466,15 +462,15 @@ object ExpressionTransformer { */ def unFlatten(ine: Expr, freevars: Set[Identifier]): Expr = { var tempMap = Map[Expr, Expr]() - val newinst = simplePostTransform((e: Expr) => e match { - case Equals(v @ Variable(id), rhs @ _) if !freevars.contains(id) => + val newinst = simplePostTransform { + case e@Equals(v@Variable(id), rhs@_) if !freevars.contains(id) => if (tempMap.contains(v)) e else { tempMap += (v -> rhs) tru } - case _ => e - })(ine) + case e => e + }(ine) val closure = (e: Expr) => replace(tempMap, e) fix(closure)(newinst) } @@ -510,11 +506,11 @@ object ExpressionTransformer { def isSubExpr(key: Expr, expr: Expr): Boolean = { var found = false - simplePostTransform((e: Expr) => e match { - case _ if (e == key) => + simplePostTransform { + case e if (e == key) => found = true; e - case _ => e - })(expr) + case e => e + }(expr) found } @@ -524,7 +520,7 @@ object ExpressionTransformer { def simplify(expr: Expr): Expr = { //Note: some simplification are already performed by the class constructors (see Tree.scala) - simplePostTransform((e: Expr) => e match { + simplePostTransform { case Equals(lhs, rhs) if (lhs == rhs) => tru case LessEquals(lhs, rhs) if (lhs == rhs) => tru case GreaterEquals(lhs, rhs) if (lhs == rhs) => tru @@ -536,8 +532,8 @@ object ExpressionTransformer { case LessThan(InfiniteIntegerLiteral(v1), InfiniteIntegerLiteral(v2)) => BooleanLiteral(v1 < v2) case GreaterEquals(InfiniteIntegerLiteral(v1), InfiniteIntegerLiteral(v2)) => BooleanLiteral(v1 >= v2) case GreaterThan(InfiniteIntegerLiteral(v1), InfiniteIntegerLiteral(v2)) => BooleanLiteral(v1 > v2) - case _ => e - })(expr) + case e => e + }(expr) } /** @@ -545,7 +541,7 @@ object ExpressionTransformer { * Note: (a) Not(Equals()) and Not(Variable) is allowed */ def isDisjunct(e: Expr): Boolean = e match { - case And(args) => args.foldLeft(true)((acc, arg) => acc && isDisjunct(arg)) + case And(args) => args.forall(arg => isDisjunct(arg)) case Not(Equals(_, _)) | Not(Variable(_)) => true case Or(_) | Implies(_, _) | Not(_) | Equals(_, _) => false case _ => true @@ -556,7 +552,7 @@ object ExpressionTransformer { * Note: (a) Not(Equals()) and Not(Variable) is allowed */ def isConjunct(e: Expr): Boolean = e match { - case Or(args) => args.foldLeft(true)((acc, arg) => acc && isConjunct(arg)) + case Or(args) => args.forall(arg => isConjunct(arg)) case Not(Equals(_, _)) | Not(Variable(_)) => true case And(_) | Implies(_, _) | Not(_) | Equals(_, _) => false case _ => true @@ -568,17 +564,17 @@ object ExpressionTransformer { case And(args) => { //have we seen an or ? if (seen == 2) false - else args.foldLeft(true)((acc, arg) => acc && uniOP(arg, 1)) + else args.forall(arg => uniOP(arg, 1)) } case Or(args) => { //have we seen an And ? if (seen == 1) false - else args.foldLeft(true)((acc, arg) => acc && uniOP(arg, 2)) + else args.forall(arg => uniOP(arg, 2)) } case t: Terminal => true /*case u @ UnaryOperator(e1, op) => uniOP(e1, seen) case b @ BinaryOperator(e1, e2, op) => uniOP(e1, seen) && uniOP(e2, seen)*/ - case n @ Operator(args, op) => args.foldLeft(true)((acc, arg) => acc && uniOP(arg, seen)) + case n @ Operator(args, op) => args.forall(arg => uniOP(arg, seen)) } def printRec(e: Expr, indent: Int): Unit = { @@ -588,7 +584,7 @@ object ExpressionTransformer { e match { case And(args) => { var start = true - args.map((arg) => { + args.foreach((arg) => { wr.print(" " * (indent + 1)) if (!start) wr.print("^") printRec(arg, indent + 1) @@ -597,7 +593,7 @@ object ExpressionTransformer { } case Or(args) => { var start = true - args.map((arg) => { + args.foreach((arg) => { wr.print(" " * (indent + 1)) if (!start) wr.print("v") printRec(arg, indent + 1) @@ -627,8 +623,8 @@ object ExpressionTransformer { } def distribute(e: Expr): Expr = { - simplePreTransform(_ match { - case e @ FunctionInvocation(TypedFunDef(fd, _), Seq(e1, e2)) if isMultFunctions(fd) => + simplePreTransform { + case e@FunctionInvocation(TypedFunDef(fd, _), Seq(e1, e2)) if isMultFunctions(fd) => val newe = (e1, e2) match { case (Plus(sum1, sum2), _) => // distribute e2 over e1 @@ -655,7 +651,7 @@ object ExpressionTransformer { } newe case other => other - })(e) + }(e) } distribute(e) } diff --git a/src/main/scala/leon/invariant/util/LetTupleSimplifications.scala b/src/main/scala/leon/invariant/util/LetTupleSimplification.scala similarity index 92% rename from src/main/scala/leon/invariant/util/LetTupleSimplifications.scala rename to src/main/scala/leon/invariant/util/LetTupleSimplification.scala index bd99992014bd94ab29c099b7a03eb7e452e154c0..83b7b0cba056c0c7f377caa2c4f76134bab81e24 100644 --- a/src/main/scala/leon/invariant/util/LetTupleSimplifications.scala +++ b/src/main/scala/leon/invariant/util/LetTupleSimplification.scala @@ -7,14 +7,8 @@ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Extractors._ import purescala.Types._ -import java.io._ -import java.io._ -import purescala.ScalaPrinter import leon.utils._ import PredicateUtil._ - -import invariant.structure.Call -import invariant.structure.FunctionUtils._ import leon.transformations.InstUtil._ /** @@ -31,13 +25,13 @@ object LetTupleSimplification { val bone = BigInt(1) def letSanityChecks(ine: Expr) = { - simplePostTransform(_ match { - case letExpr @ Let(binderId, letValue, body) - if (binderId.getType != letValue.getType) => - throw new IllegalStateException("Binder and value type mismatch: "+ - s"(${binderId.getType},${letValue.getType})") + simplePostTransform { + case letExpr@Let(binderId, letValue, body) + if (binderId.getType != letValue.getType) => + throw new IllegalStateException("Binder and value type mismatch: " + + s"(${binderId.getType},${letValue.getType})") case e => e - })(ine) + }(ine) } /** @@ -130,11 +124,11 @@ object LetTupleSimplification { (arg1, arg2) match { case (_: TupleSelect, _) => error = true case (_, _: TupleSelect) => error = true - case _ => { ; } + case _ => } } - case _ => { ; } + case _ => } } @@ -172,8 +166,8 @@ object LetTupleSimplification { // in the sequel, we are using the fact that 'depth' is positive and // 'ine' contains only 'depth' variables - val simpe = simplePostTransform((e: Expr) => e match { - case FunctionInvocation(tfd, args) if (tfd.fd == maxFun) => { + val simpe = simplePostTransform { + case e@FunctionInvocation(tfd, args) if (tfd.fd == maxFun) => { if (debugMaxSimplify) { println("Simplifying: " + e) } @@ -183,20 +177,20 @@ object LetTupleSimplification { import invariant.structure.LinearConstraintUtil._ val lt = exprToTemplate(LessEquals(Minus(arg1, arg2), InfiniteIntegerLiteral(0))) //now, check if all the variables in 'lt' have only positive coefficients - val allPositive = lt.coeffTemplate.forall(entry => entry match { + val allPositive = lt.coeffTemplate.forall { case (k, IntLiteral(v)) if (v >= 0) => true case _ => false - }) && (lt.constTemplate match { + } && (lt.constTemplate match { case None => true case Some(IntLiteral(v)) if (v >= 0) => true case _ => false }) if (allPositive) arg1 else { - val allNegative = lt.coeffTemplate.forall(entry => entry match { + val allNegative = lt.coeffTemplate.forall { case (k, IntLiteral(v)) if (v <= 0) => true case _ => false - }) && (lt.constTemplate match { + } && (lt.constTemplate match { case None => true case Some(IntLiteral(v)) if (v <= 0) => true case _ => false @@ -222,14 +216,14 @@ object LetTupleSimplification { // case FunctionInvocation(tfd, args) if(tfd.fd.id.name == "max") => { // throw new IllegalStateException("Found just max in expression " + e + "\n") // } - case _ => e - })(ine) + case e => e + }(ine) simpe } def inlineMax(ine: Expr): Expr = { //inline 'max' operations here - simplePostTransform((e: Expr) => e match { + simplePostTransform { case FunctionInvocation(tfd, args) if (tfd.fd == maxFun) => val Seq(arg1, arg2) = args val bindWithLet = (value: Expr, body: (Expr with Terminal) => Expr) => { @@ -245,8 +239,8 @@ object LetTupleSimplification { } bindWithLet(arg1, a1 => bindWithLet(arg2, a2 => IfExpr(GreaterEquals(a1, a2), a1, a2))) - case _ => e - })(ine) + case e => e + }(ine) } def removeLetsFromLetValues(ine: Expr): Expr = { @@ -317,10 +311,10 @@ object LetTupleSimplification { Tuple(args :+ e2) })) } - replaceLetBody(transLet, (e: Expr) => e match { + replaceLetBody(transLet, { case Tuple(args) => op(args) - case _ => op(Seq(e)) //here, there was only one argument + case e => op(Seq(e)) //here, there was only one argument }) } transe @@ -378,7 +372,7 @@ object LetTupleSimplification { res } - val transforms = removeLetsFromLetValues _ andThen fixpoint(postMap(simplerLet)) _ andThen simplifyArithmetic + val transforms = removeLetsFromLetValues _ andThen fixpoint(postMap(simplerLet)) andThen simplifyArithmetic transforms(ine) } @@ -398,7 +392,7 @@ object LetTupleSimplification { val allLeaves = getLeaves(e, true) // Here the expression is not of the form we are currently simplifying - if (allLeaves.size == 0) e + if (allLeaves.isEmpty) e else { // fold constants here val allConstantsOpped = allLeaves.foldLeft(identity)((acc, e) => e match { @@ -406,17 +400,17 @@ object LetTupleSimplification { case _ => acc }) - val allNonConstants = allLeaves.filter((e) => e match { + val allNonConstants = allLeaves.filter { case _: InfiniteIntegerLiteral => false case _ => true - }) + } // Reconstruct the expressin tree with the non-constants and the result of constant evaluation above if (allConstantsOpped != identity) { allNonConstants.foldLeft(InfiniteIntegerLiteral(allConstantsOpped): Expr)((acc: Expr, currExpr) => makeTree(acc, currExpr)) } else { - if (allNonConstants.size == 0) InfiniteIntegerLiteral(identity) + if (allNonConstants.isEmpty) InfiniteIntegerLiteral(identity) else { allNonConstants.tail.foldLeft(allNonConstants.head)((acc: Expr, currExpr) => makeTree(acc, currExpr)) } @@ -455,10 +449,11 @@ object LetTupleSimplification { ((a: BigInt, b: BigInt) => if (a > b) a else b), getAllMaximands, 0, - ((e1, e2) => { + (e1, e2) => { val typedMaxFun = TypedFunDef(maxFun, Seq()) FunctionInvocation(typedMaxFun, Seq(e1, e2)) - })) + } + ) maxSimplifiedExpr })(e) diff --git a/src/main/scala/leon/invariant/util/Minimizer.scala b/src/main/scala/leon/invariant/util/Minimizer.scala index e39378f267c0970d85797d19eef468c3a35f1db4..3794f55463490ae048574f3613f720ba092d0ff2 100644 --- a/src/main/scala/leon/invariant/util/Minimizer.scala +++ b/src/main/scala/leon/invariant/util/Minimizer.scala @@ -1,22 +1,15 @@ package leon package invariant.util -import z3.scala._ -import purescala.Common._ + import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Extractors._ -import purescala.Types._ import solvers._ -import solvers.z3._ import solvers.smtlib.SMTLIBZ3Solver -import leon.invariant._ -import scala.util.control.Breaks._ import invariant.engine.InferenceContext import invariant.factories._ -import leon.invariant.templateSolvers.ExtendedUFSolver import leon.invariant.util.RealValuedExprEvaluator._ -import invariant.util.TimerUtil._ class Minimizer(ctx: InferenceContext, program: Program) { diff --git a/src/main/scala/leon/invariant/util/RealToIntExpr.scala b/src/main/scala/leon/invariant/util/RealToInt.scala similarity index 96% rename from src/main/scala/leon/invariant/util/RealToIntExpr.scala rename to src/main/scala/leon/invariant/util/RealToInt.scala index 54650b2c4111b32e127070cdc23889708a81b6fd..6c1860160f2bebc5bf0cb574b9c9934985246f45 100644 --- a/src/main/scala/leon/invariant/util/RealToIntExpr.scala +++ b/src/main/scala/leon/invariant/util/RealToInt.scala @@ -2,12 +2,9 @@ package leon package invariant.util import purescala.Common._ -import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import leon.invariant._ import invariant.factories._ import solvers._ diff --git a/src/main/scala/leon/invariant/util/RealExprEvaluator.scala b/src/main/scala/leon/invariant/util/RealValuedExprEvaluator.scala similarity index 100% rename from src/main/scala/leon/invariant/util/RealExprEvaluator.scala rename to src/main/scala/leon/invariant/util/RealValuedExprEvaluator.scala diff --git a/src/main/scala/leon/invariant/util/SolverUtil.scala b/src/main/scala/leon/invariant/util/SolverUtil.scala index e67385c435ea94b24ef63ed8fe8bdbf41f602570..466ec1d2def3831b42c1f0b4bc6eaad3351ef716 100644 --- a/src/main/scala/leon/invariant/util/SolverUtil.scala +++ b/src/main/scala/leon/invariant/util/SolverUtil.scala @@ -1,21 +1,13 @@ package leon package invariant.util -import utils._ import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ -import purescala.Extractors._ import purescala.Types._ -import scala.collection.mutable.{ Set => MutableSet, Map => MutableMap } -import leon.invariant._ import solvers.z3._ import solvers._ -import invariant.engine._ -import invariant.factories._ -import invariant.structure._ -import FunctionUtils._ import leon.invariant.templateSolvers.ExtendedUFSolver import java.io._ import Util._ @@ -55,7 +47,7 @@ object SolverUtil { case id @ _ if (id.name.toString == "c?") => id.toVariable -> InfiniteIntegerLiteral(2) }.toMap //println("found ids: " + idmap.keys) - if (!idmap.keys.isEmpty) { + if (idmap.keys.nonEmpty) { val newpathcond = replace(idmap, expr) //check if this is solvable val solver = SimpleSolverAPI(SolverFactory(() => new ExtendedUFSolver(ctx, prog))) @@ -76,8 +68,8 @@ object SolverUtil { var controlVars = Map[Variable, Expr]() var newEqs = Map[Expr, Expr]() val solver = new ExtendedUFSolver(ctx, prog) - val newe = simplePostTransform((e: Expr) => e match { - case And(_) | Or(_) => { + val newe = simplePostTransform { + case e@(And(_) | Or(_)) => { val v = TVarFactory.createTemp("a", BooleanType).toVariable newEqs += (v -> e) val newe = Equals(v, e) @@ -88,8 +80,8 @@ object SolverUtil { solver.assertCnstr(Or(newe, cvar)) v } - case _ => e - })(ine) + case e => e + }(ine) //create new variable and add it in disjunction val cvar = FreshIdentifier("ctrl", BooleanType, true).toVariable controlVars += (cvar -> newe) diff --git a/src/main/scala/leon/invariant/util/Stats.scala b/src/main/scala/leon/invariant/util/Stats.scala index 76a1f12ee4eede0ba631969ebb7bf3076bb3bf08..72239ac32227122c5f65c1ea73ac231d04014a11 100644 --- a/src/main/scala/leon/invariant/util/Stats.scala +++ b/src/main/scala/leon/invariant/util/Stats.scala @@ -1,19 +1,11 @@ package leon package invariant.util -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ -import purescala.Extractors._ -import purescala.Types._ -import scala.collection.mutable.{ Map => MutableMap } -import java.io._ -import leon.invariant._ import java.io._ import scala.collection.mutable.{Map => MutableMap} - /** * A generic statistics object that provides: * (a) Temporal variables that change over time. We track the total sum and max of the values the variable takes over time diff --git a/src/main/scala/leon/invariant/util/TemporaryVarFactory.scala b/src/main/scala/leon/invariant/util/TVarFactory.scala similarity index 81% rename from src/main/scala/leon/invariant/util/TemporaryVarFactory.scala rename to src/main/scala/leon/invariant/util/TVarFactory.scala index c85c7837b1c4dbf35e2a90b87d93bccca929a6c9..6743e802b27ef44b1b966555d6965130373b5f8b 100644 --- a/src/main/scala/leon/invariant/util/TemporaryVarFactory.scala +++ b/src/main/scala/leon/invariant/util/TVarFactory.scala @@ -2,11 +2,8 @@ package leon package invariant.util import purescala.Common._ -import purescala.Definitions._ -import purescala.Expressions._ -import purescala.ExprOps._ import purescala.Types._ -import scala.collection.mutable.{ Set => MutableSet, Map => MutableMap } +import scala.collection.mutable.{ Set => MutableSet} object TVarFactory { diff --git a/src/main/scala/leon/invariant/util/TimerUtil.scala b/src/main/scala/leon/invariant/util/TimerUtil.scala index 1284951709d4c374c56f1115b8b946f1a796855d..77e9b520116234e1d4bb6fee6ddf7563deed1640 100644 --- a/src/main/scala/leon/invariant/util/TimerUtil.scala +++ b/src/main/scala/leon/invariant/util/TimerUtil.scala @@ -2,9 +2,6 @@ package leon package invariant.util import utils._ -import solvers._ -import invariant.engine._ -import purescala.Expressions._ object TimerUtil { /** @@ -12,13 +9,13 @@ object TimerUtil { */ def scheduleTask(callBack: () => Unit, timeOut: Long): Option[java.util.Timer] = { if (timeOut > 0) { - val timer = new java.util.Timer(); + val timer = new java.util.Timer() timer.schedule(new java.util.TimerTask() { def run() { callBack() timer.cancel() //the timer will be cancelled after it runs } - }, timeOut); + }, timeOut) Some(timer) } else None } @@ -30,7 +27,6 @@ class InterruptOnSignal(it: Interruptible) { private var keepRunning = true override def run(): Unit = { - val startTime: Long = System.currentTimeMillis while (!signal && keepRunning) { Thread.sleep(100) // a relatively infrequent poll } diff --git a/src/main/scala/leon/invariant/util/TreeUtil.scala b/src/main/scala/leon/invariant/util/TreeUtil.scala index 6e3e45f22a49bc3ef70d0d18e3d0371fedac2654..4494787081ace61dfe1e1c086a702da6b2be15c4 100644 --- a/src/main/scala/leon/invariant/util/TreeUtil.scala +++ b/src/main/scala/leon/invariant/util/TreeUtil.scala @@ -33,8 +33,8 @@ object ProgramUtil { */ def copyProgram(prog: Program, mapdefs: (Seq[Definition] => Seq[Definition])): Program = { prog.copy(units = prog.units.collect { - case unit if (!unit.defs.isEmpty) => unit.copy(defs = unit.defs.collect { - case module : ModuleDef if (!module.defs.isEmpty) => + case unit if unit.defs.nonEmpty => unit.copy(defs = unit.defs.collect { + case module : ModuleDef if module.defs.nonEmpty => module.copy(defs = mapdefs(module.defs)) case other => other }) @@ -71,11 +71,11 @@ object ProgramUtil { } def mapFunctionsInExpr(funmap: Map[FunDef, FunDef])(ine: Expr): Expr = { - simplePostTransform((e: Expr) => e match { + simplePostTransform { case FunctionInvocation(tfd, args) if funmap.contains(tfd.fd) => FunctionInvocation(TypedFunDef(funmap(tfd.fd), tfd.tps), args) - case _ => e - })(ine) + case e => e + }(ine) } /** @@ -161,7 +161,7 @@ object ProgramUtil { } def translateExprToProgram(ine: Expr, currProg: Program, newProg: Program): Expr = { - simplePostTransform((e: Expr) => e match { + simplePostTransform { case FunctionInvocation(TypedFunDef(fd, tps), args) => functionByName(fullName(fd)(currProg), newProg) match { case Some(nfd) => @@ -169,8 +169,8 @@ object ProgramUtil { case _ => throw new IllegalStateException(s"Cannot find translation for ${fd.id.name}") } - case _ => e - })(ine) + case e => e + }(ine) } def getFunctionReturnVariable(fd: FunDef) = { @@ -205,18 +205,18 @@ object PredicateUtil { */ def isTemplateExpr(expr: Expr): Boolean = { var foundVar = false - simplePostTransform((e: Expr) => e match { - case Variable(id) => { + simplePostTransform { + case e@Variable(id) => { if (!TemplateIdFactory.IsTemplateIdentifier(id)) foundVar = true e } - case ResultVariable(_) => { + case e@ResultVariable(_) => { foundVar = true e } - case _ => e - })(expr) + case e => e + }(expr) !foundVar } @@ -234,13 +234,13 @@ object PredicateUtil { */ def hasReals(expr: Expr): Boolean = { var foundReal = false - simplePostTransform((e: Expr) => e match { - case _ => { + simplePostTransform { + case e => { if (e.getType == RealType) - foundReal = true; + foundReal = true e } - })(expr) + }(expr) foundReal } @@ -252,13 +252,13 @@ object PredicateUtil { */ def hasInts(expr: Expr): Boolean = { var foundInt = false - simplePostTransform((e: Expr) => e match { + simplePostTransform { case e: Terminal if (e.getType == Int32Type || e.getType == IntegerType) => { - foundInt = true; + foundInt = true e } - case _ => e - })(expr) + case e => e + }(expr) foundInt } @@ -268,29 +268,29 @@ object PredicateUtil { def atomNum(e: Expr): Int = { var count: Int = 0 - simplePostTransform((e: Expr) => e match { - case And(args) => { + simplePostTransform { + case e@And(args) => { count += args.size e } - case Or(args) => { + case e@Or(args) => { count += args.size e } - case _ => e - })(e) + case e => e + }(e) count } def numUIFADT(e: Expr): Int = { var count: Int = 0 - simplePostTransform((e: Expr) => e match { - case FunctionInvocation(_, _) | CaseClass(_, _) | Tuple(_) => { + simplePostTransform { + case e@(FunctionInvocation(_, _) | CaseClass(_, _) | Tuple(_)) => { count += 1 e } - case _ => e - })(e) + case e => e + }(e) count } @@ -327,12 +327,12 @@ object PredicateUtil { //replaces occurrences of mult by Times def multToTimes(ine: Expr): Expr = { - simplePostTransform((e: Expr) => e match { + simplePostTransform { case FunctionInvocation(TypedFunDef(fd, _), args) if isMultFunctions(fd) => { Times(args(0), args(1)) } - case _ => e - })(ine) + case e => e + }(ine) } def createAnd(exprs: Seq[Expr]): Expr = { diff --git a/src/main/scala/leon/invariant/util/Util.scala b/src/main/scala/leon/invariant/util/Util.scala index f8358dec14f22f420a2b19b90dcf9dd9d308d80d..a792f1586479d5989773cdeee7e322eaa66983a6 100644 --- a/src/main/scala/leon/invariant/util/Util.scala +++ b/src/main/scala/leon/invariant/util/Util.scala @@ -1,19 +1,16 @@ package leon package invariant.util -import purescala.Common._ -import purescala.Definitions._ import purescala.Expressions._ -import purescala.ExprOps._ import purescala.Types._ -import leon.purescala.PrettyPrintable -import leon.purescala.PrinterContext +import purescala.PrettyPrintable +import purescala.PrinterContext import purescala.PrinterHelpers._ object FileCountGUID { var fileCount = 0 def getID: Int = { - var oldcnt = fileCount + val oldcnt = fileCount fileCount += 1 oldcnt } @@ -32,7 +29,7 @@ case class ResultVariable(tpe: TypeTree) extends Expr with Terminal with PrettyP val getType = tpe override def toString: String = "#res" - def printWith(implicit pctx: PrinterContext) { + def printWith(implicit pctx: PrinterContext) = { p"#res" } } diff --git a/src/main/scala/leon/repair/Repairman.scala b/src/main/scala/leon/repair/Repairman.scala index 3dd72ad613023fe5e9a30a7375aa34926de2c586..4959ae799c8f34b25dbdf1cac812ef8d954b4717 100644 --- a/src/main/scala/leon/repair/Repairman.scala +++ b/src/main/scala/leon/repair/Repairman.scala @@ -3,13 +3,11 @@ package leon package repair -import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ import purescala.ExprOps._ import purescala.Types._ import purescala.DefOps._ -import purescala.Quantification._ import purescala.Constructors._ import purescala.Extractors.unwrapTuple