From ca2a7b6b6ef0565e61d15e0c6a9372cfc0c91ffd Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Fri, 8 Jan 2016 16:19:12 +0100 Subject: [PATCH] Label -> NonTerminal. Remove view bounds from Grammars --- .../scala/leon/grammars/DepthBoundedGrammar.scala | 4 ++-- src/main/scala/leon/grammars/EmbeddedGrammar.scala | 2 +- src/main/scala/leon/grammars/Empty.scala | 4 ++-- src/main/scala/leon/grammars/ExpressionGrammar.scala | 2 +- src/main/scala/leon/grammars/Grammars.scala | 2 +- .../leon/grammars/{Label.scala => NonTerminal.scala} | 2 +- src/main/scala/leon/grammars/Or.scala | 2 +- src/main/scala/leon/grammars/SimilarTo.scala | 12 ++++++------ .../scala/leon/grammars/SizeBoundedGrammar.scala | 4 ++-- src/main/scala/leon/solvers/z3/FairZ3Solver.scala | 2 ++ .../scala/leon/synthesis/rules/BottomUpTegis.scala | 2 +- src/main/scala/leon/synthesis/rules/CEGISLike.scala | 2 +- src/main/scala/leon/synthesis/rules/CEGLESS.scala | 6 +++--- src/main/scala/leon/synthesis/rules/TEGISLike.scala | 2 +- src/main/scala/leon/synthesis/rules/TEGLESS.scala | 6 +++--- 15 files changed, 28 insertions(+), 26 deletions(-) rename src/main/scala/leon/grammars/{Label.scala => NonTerminal.scala} (71%) diff --git a/src/main/scala/leon/grammars/DepthBoundedGrammar.scala b/src/main/scala/leon/grammars/DepthBoundedGrammar.scala index 7ec864e03..fc999be64 100644 --- a/src/main/scala/leon/grammars/DepthBoundedGrammar.scala +++ b/src/main/scala/leon/grammars/DepthBoundedGrammar.scala @@ -3,8 +3,8 @@ package leon package grammars -case class DepthBoundedGrammar[T](g: ExpressionGrammar[Label[T]], bound: Int) extends ExpressionGrammar[Label[T]] { - def computeProductions(l: Label[T])(implicit ctx: LeonContext): Seq[Gen] = g.computeProductions(l).flatMap { +case class DepthBoundedGrammar[T](g: ExpressionGrammar[NonTerminal[T]], bound: Int) extends ExpressionGrammar[NonTerminal[T]] { + def computeProductions(l: NonTerminal[T])(implicit ctx: LeonContext): Seq[Gen] = g.computeProductions(l).flatMap { case gen => if (l.depth == Some(bound) && gen.subTrees.nonEmpty) { Nil diff --git a/src/main/scala/leon/grammars/EmbeddedGrammar.scala b/src/main/scala/leon/grammars/EmbeddedGrammar.scala index bcee19b01..8dcbc6ec1 100644 --- a/src/main/scala/leon/grammars/EmbeddedGrammar.scala +++ b/src/main/scala/leon/grammars/EmbeddedGrammar.scala @@ -12,7 +12,7 @@ import purescala.Constructors._ * * We rely on a bijection between Li and Lo labels */ -case class EmbeddedGrammar[Ti <% Typed, To <% Typed](innerGrammar: ExpressionGrammar[Ti], iToo: Ti => To, oToi: To => Ti) extends ExpressionGrammar[To] { +case class EmbeddedGrammar[Ti <: Typed, To <: Typed](innerGrammar: ExpressionGrammar[Ti], iToo: Ti => To, oToi: To => Ti) extends ExpressionGrammar[To] { def computeProductions(t: To)(implicit ctx: LeonContext): Seq[Gen] = { innerGrammar.computeProductions(oToi(t)).map { innerGen => nonTerminal(innerGen.subTrees.map(iToo), innerGen.builder) diff --git a/src/main/scala/leon/grammars/Empty.scala b/src/main/scala/leon/grammars/Empty.scala index 56b332309..70ebddc98 100644 --- a/src/main/scala/leon/grammars/Empty.scala +++ b/src/main/scala/leon/grammars/Empty.scala @@ -3,8 +3,8 @@ package leon package grammars -import purescala.Types._ +import purescala.Types.Typed -case class Empty[T <% Typed]() extends ExpressionGrammar[T] { +case class Empty[T <: Typed]() extends ExpressionGrammar[T] { def computeProductions(t: T)(implicit ctx: LeonContext): Seq[Gen] = Nil } diff --git a/src/main/scala/leon/grammars/ExpressionGrammar.scala b/src/main/scala/leon/grammars/ExpressionGrammar.scala index 465904f5d..01a3524d1 100644 --- a/src/main/scala/leon/grammars/ExpressionGrammar.scala +++ b/src/main/scala/leon/grammars/ExpressionGrammar.scala @@ -11,7 +11,7 @@ import purescala.Common._ import scala.collection.mutable.{HashMap => MutableMap} -abstract class ExpressionGrammar[T <% Typed] { +abstract class ExpressionGrammar[T <: Typed] { type Gen = Generator[T, Expr] private[this] val cache = new MutableMap[T, Seq[Gen]]() diff --git a/src/main/scala/leon/grammars/Grammars.scala b/src/main/scala/leon/grammars/Grammars.scala index 2194aa539..23b1dd5a1 100644 --- a/src/main/scala/leon/grammars/Grammars.scala +++ b/src/main/scala/leon/grammars/Grammars.scala @@ -24,7 +24,7 @@ object Grammars { default(sctx.program, p.as.map(_.toVariable), sctx.functionContext, sctx.settings.functionsToIgnore, p.ws, p.pc) } - def typeDepthBound[T <% Typed](g: ExpressionGrammar[T], b: Int) = { + def typeDepthBound[T <: Typed](g: ExpressionGrammar[T], b: Int) = { g.filter(g => g.subTrees.forall(t => typeDepth(t.getType) <= b)) } } diff --git a/src/main/scala/leon/grammars/Label.scala b/src/main/scala/leon/grammars/NonTerminal.scala similarity index 71% rename from src/main/scala/leon/grammars/Label.scala rename to src/main/scala/leon/grammars/NonTerminal.scala index aaaaccf30..7492ffac5 100644 --- a/src/main/scala/leon/grammars/Label.scala +++ b/src/main/scala/leon/grammars/NonTerminal.scala @@ -5,7 +5,7 @@ package grammars import purescala.Types._ -case class Label[T](t: TypeTree, l: T, depth: Option[Int] = None) extends Typed { +case class NonTerminal[T](t: TypeTree, l: T, depth: Option[Int] = None) extends Typed { val getType = t override def asString(implicit ctx: LeonContext) = t.asString+"#"+l+depth.map(d => "@"+d).getOrElse("") diff --git a/src/main/scala/leon/grammars/Or.scala b/src/main/scala/leon/grammars/Or.scala index ae0bc9697..e691a2459 100644 --- a/src/main/scala/leon/grammars/Or.scala +++ b/src/main/scala/leon/grammars/Or.scala @@ -5,7 +5,7 @@ package grammars import purescala.Types._ -case class Union[T <% Typed](gs: Seq[ExpressionGrammar[T]]) extends ExpressionGrammar[T] { +case class Union[T <: Typed](gs: Seq[ExpressionGrammar[T]]) extends ExpressionGrammar[T] { val subGrammars: Seq[ExpressionGrammar[T]] = gs.flatMap { case u: Union[T] => u.subGrammars case g => Seq(g) diff --git a/src/main/scala/leon/grammars/SimilarTo.scala b/src/main/scala/leon/grammars/SimilarTo.scala index c134546d2..77e912792 100644 --- a/src/main/scala/leon/grammars/SimilarTo.scala +++ b/src/main/scala/leon/grammars/SimilarTo.scala @@ -13,7 +13,7 @@ import purescala.Expressions._ import synthesis._ -case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisContext, p: Problem) extends ExpressionGrammar[Label[String]] { +case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisContext, p: Problem) extends ExpressionGrammar[NonTerminal[String]] { val excludeFCalls = sctx.settings.functionsToIgnore @@ -23,11 +23,11 @@ case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisConte OneOf(terminals.toSeq :+ e) || FunctionCalls(sctx.program, sctx.functionContext, p.as.map(_.getType), excludeFCalls) || SafeRecursiveCalls(sctx.program, p.ws, p.pc), - { (t: TypeTree) => Label(t, "B", None)}, - { (l: Label[String]) => l.getType } + { (t: TypeTree) => NonTerminal(t, "B", None)}, + { (l: NonTerminal[String]) => l.getType } ), 1) - type L = Label[String] + type L = NonTerminal[String] val getNext: () => Int = { var counter = -1 @@ -41,7 +41,7 @@ case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisConte def computeProductions(t: L)(implicit ctx: LeonContext): Seq[Gen] = { t match { - case Label(_, "B", _) => normalGrammar.computeProductions(t) + case NonTerminal(_, "B", _) => normalGrammar.computeProductions(t) case _ => val allSimilar = similarCache.getOrElse { @@ -59,7 +59,7 @@ case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisConte def getLabel(t: TypeTree) = { val tpe = bestRealType(t) val c = getNext() - Label(tpe, "G"+c) + NonTerminal(tpe, "G"+c) } def isCommutative(e: Expr) = e match { diff --git a/src/main/scala/leon/grammars/SizeBoundedGrammar.scala b/src/main/scala/leon/grammars/SizeBoundedGrammar.scala index 8756b136a..1b25e30f6 100644 --- a/src/main/scala/leon/grammars/SizeBoundedGrammar.scala +++ b/src/main/scala/leon/grammars/SizeBoundedGrammar.scala @@ -6,13 +6,13 @@ package grammars import purescala.Types._ import leon.utils.SeqUtils.sumTo -case class SizedLabel[T <% Typed](underlying: T, size: Int) extends Typed { +case class SizedLabel[T <: Typed](underlying: T, size: Int) extends Typed { val getType = underlying.getType override def asString(implicit ctx: LeonContext) = underlying.asString+"|"+size+"|" } -case class SizeBoundedGrammar[T <% Typed](g: ExpressionGrammar[T]) extends ExpressionGrammar[SizedLabel[T]] { +case class SizeBoundedGrammar[T <: Typed](g: ExpressionGrammar[T]) extends ExpressionGrammar[SizedLabel[T]] { def computeProductions(sl: SizedLabel[T])(implicit ctx: LeonContext): Seq[Gen] = { if (sl.size <= 0) { Nil diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala index 3d39ae7e7..c975fd2d3 100644 --- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala @@ -137,6 +137,8 @@ class FairZ3Solver(val context: LeonContext, val program: Program) private val freeVars = new IncrementalSet[Identifier]() private val constraints = new IncrementalSeq[Expr]() + val tr = implicitly[Z3AST => Printable] + val unrollingBank = new UnrollingBank(context, templateGenerator) private val incrementals: List[IncrementalState] = List( diff --git a/src/main/scala/leon/synthesis/rules/BottomUpTegis.scala b/src/main/scala/leon/synthesis/rules/BottomUpTegis.scala index 990be35e1..97b810ac3 100644 --- a/src/main/scala/leon/synthesis/rules/BottomUpTegis.scala +++ b/src/main/scala/leon/synthesis/rules/BottomUpTegis.scala @@ -26,7 +26,7 @@ case object BottomUpTEGIS extends BottomUpTEGISLike[TypeTree]("BU TEGIS") { def getRootLabel(tpe: TypeTree): TypeTree = tpe } -abstract class BottomUpTEGISLike[T <% Typed](name: String) extends Rule(name) { +abstract class BottomUpTEGISLike[T <: Typed](name: String) extends Rule(name) { def getGrammar(sctx: SynthesisContext, p: Problem): ExpressionGrammar[T] def getRootLabel(tpe: TypeTree): T diff --git a/src/main/scala/leon/synthesis/rules/CEGISLike.scala b/src/main/scala/leon/synthesis/rules/CEGISLike.scala index 4824d3e53..d577f7f9f 100644 --- a/src/main/scala/leon/synthesis/rules/CEGISLike.scala +++ b/src/main/scala/leon/synthesis/rules/CEGISLike.scala @@ -22,7 +22,7 @@ import evaluators._ import datagen._ import codegen.CodeGenParams -abstract class CEGISLike[T <% Typed](name: String) extends Rule(name) { +abstract class CEGISLike[T <: Typed](name: String) extends Rule(name) { case class CegisParams( grammar: ExpressionGrammar[T], diff --git a/src/main/scala/leon/synthesis/rules/CEGLESS.scala b/src/main/scala/leon/synthesis/rules/CEGLESS.scala index 6b0bbdd15..e2e8c9fab 100644 --- a/src/main/scala/leon/synthesis/rules/CEGLESS.scala +++ b/src/main/scala/leon/synthesis/rules/CEGLESS.scala @@ -11,7 +11,7 @@ import utils._ import grammars._ import Witnesses._ -case object CEGLESS extends CEGISLike[Label[String]]("CEGLESS") { +case object CEGLESS extends CEGISLike[NonTerminal[String]]("CEGLESS") { def getParams(sctx: SynthesisContext, p: Problem) = { val TopLevelAnds(clauses) = p.ws @@ -30,11 +30,11 @@ case object CEGLESS extends CEGISLike[Label[String]]("CEGLESS") { } } - val guidedGrammar = guides.map(SimilarTo(_, inputs.toSet, sctx, p)).foldLeft[ExpressionGrammar[Label[String]]](Empty())(_ || _) + val guidedGrammar = guides.map(SimilarTo(_, inputs.toSet, sctx, p)).foldLeft[ExpressionGrammar[NonTerminal[String]]](Empty())(_ || _) CegisParams( grammar = guidedGrammar, - rootLabel = { (tpe: TypeTree) => Label(tpe, "G0") }, + rootLabel = { (tpe: TypeTree) => NonTerminal(tpe, "G0") }, maxUnfoldings = (0 +: guides.map(depth(_) + 1)).max ) } diff --git a/src/main/scala/leon/synthesis/rules/TEGISLike.scala b/src/main/scala/leon/synthesis/rules/TEGISLike.scala index 2e9da57ce..164e396be 100644 --- a/src/main/scala/leon/synthesis/rules/TEGISLike.scala +++ b/src/main/scala/leon/synthesis/rules/TEGISLike.scala @@ -17,7 +17,7 @@ import scala.collection.mutable.{HashMap => MutableMap} import bonsai.enumerators._ -abstract class TEGISLike[T <% Typed](name: String) extends Rule(name) { +abstract class TEGISLike[T <: Typed](name: String) extends Rule(name) { case class TegisParams( grammar: ExpressionGrammar[T], rootLabel: TypeTree => T, diff --git a/src/main/scala/leon/synthesis/rules/TEGLESS.scala b/src/main/scala/leon/synthesis/rules/TEGLESS.scala index d8de10cbb..f56b26b26 100644 --- a/src/main/scala/leon/synthesis/rules/TEGLESS.scala +++ b/src/main/scala/leon/synthesis/rules/TEGLESS.scala @@ -10,7 +10,7 @@ import utils._ import Witnesses._ import grammars._ -case object TEGLESS extends TEGISLike[Label[String]]("TEGLESS") { +case object TEGLESS extends TEGISLike[NonTerminal[String]]("TEGLESS") { def getParams(sctx: SynthesisContext, p: Problem) = { val TopLevelAnds(clauses) = p.ws @@ -28,11 +28,11 @@ case object TEGLESS extends TEGISLike[Label[String]]("TEGLESS") { } } - val guidedGrammar = guides.map(SimilarTo(_, inputs.toSet, sctx, p)).foldLeft[ExpressionGrammar[Label[String]]](Empty())(_ || _) + val guidedGrammar = guides.map(SimilarTo(_, inputs.toSet, sctx, p)).foldLeft[ExpressionGrammar[NonTerminal[String]]](Empty())(_ || _) TegisParams( grammar = guidedGrammar, - rootLabel = { (tpe: TypeTree) => Label(tpe, "G0") } + rootLabel = { (tpe: TypeTree) => NonTerminal(tpe, "G0") } ) } } -- GitLab