From 5b5765c1eae3f1fbd9267b0e1783104bc49ad720 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Thu, 7 Apr 2016 11:39:30 +0200
Subject: [PATCH] Pass correct solver to SolverDataGen, synthesis improvements

---
 src/main/scala/leon/datagen/SolverDataGen.scala          | 4 +---
 src/main/scala/leon/purescala/PrettyPrinter.scala        | 2 ++
 src/main/scala/leon/synthesis/ExamplesFinder.scala       | 5 +++--
 src/main/scala/leon/synthesis/SourceInfo.scala           | 2 +-
 src/main/scala/leon/synthesis/rules/DetupleInput.scala   | 9 ++++-----
 .../scala/leon/synthesis/rules/OptimisticGround.scala    | 2 +-
 6 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/main/scala/leon/datagen/SolverDataGen.scala b/src/main/scala/leon/datagen/SolverDataGen.scala
index 3a222bd6b..34d94c1a9 100644
--- a/src/main/scala/leon/datagen/SolverDataGen.scala
+++ b/src/main/scala/leon/datagen/SolverDataGen.scala
@@ -11,8 +11,7 @@ import purescala.Constructors._
 import solvers._
 import utils._
 
-
-class SolverDataGen(ctx: LeonContext, pgm: Program, sff: ((LeonContext, Program) => SolverFactory[Solver])) extends DataGenerator {
+class SolverDataGen(ctx: LeonContext, pgm: Program, sf: SolverFactory[Solver]) extends DataGenerator {
   implicit val ctx0 = ctx
 
   def generate(tpe: TypeTree): FreeableIterator[Expr] = {
@@ -73,7 +72,6 @@ class SolverDataGen(ctx: LeonContext, pgm: Program, sff: ((LeonContext, Program)
         ModuleDef(FreshIdentifier("new"), fds.values.toSeq, false)
       )))
 
-      val sf = sff(ctx, pgm1)
       val modelEnum = new ModelEnumerator(ctx, pgm1, sf)
 
       val enum = modelEnum.enumVarying(ins, satisfying, sizeOf, 5)
diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala
index 38644fc4a..0dbf1aba9 100644
--- a/src/main/scala/leon/purescala/PrettyPrinter.scala
+++ b/src/main/scala/leon/purescala/PrettyPrinter.scala
@@ -634,6 +634,7 @@ class PrettyPrinter(opts: PrinterOptions,
     case Assert(_, _, bd) => Seq(bd)
     case Let(_, _, bd) => Seq(bd)
     case LetDef(_, bd) => Seq(bd)
+    case LetPattern(_, _, bd) => Seq(bd)
     case Require(_, bd) => Seq(bd)
     case IfExpr(_, t, e) => Seq(t, e) // if-else always has braces anyway
     case Ensuring(bd, pred) => Seq(bd, pred)
@@ -669,6 +670,7 @@ class PrettyPrinter(opts: PrinterOptions,
       _: Ensuring | _: Assert | _: Require | _: Definition | _: MatchExpr | _: MatchCase |
       _: Let | _: LetDef | _: IfExpr | _ : CaseClass | _ : Lambda | _ : Choose | _ : Tuple
     )) => false
+    case (_:Pattern, _) => false
     case (ex: StringConcat, Some(_: StringConcat)) => false
     case (b1 @ BinaryMethodCall(_, _, _), Some(b2 @ BinaryMethodCall(_, _, _))) if precedence(b1) > precedence(b2) => false
     case (BinaryMethodCall(_, _, _), Some(_: FunctionInvocation)) => true
diff --git a/src/main/scala/leon/synthesis/ExamplesFinder.scala b/src/main/scala/leon/synthesis/ExamplesFinder.scala
index c7c998989..628a9201a 100644
--- a/src/main/scala/leon/synthesis/ExamplesFinder.scala
+++ b/src/main/scala/leon/synthesis/ExamplesFinder.scala
@@ -116,12 +116,13 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) {
     ExamplesBank(examples.filter(isValidExample), Seq())
   }
 
-  def generateForPC(ids: List[Identifier], pc: Expr, maxValid: Int = 400, maxEnumerated: Int = 1000): ExamplesBank = {
+  def generateForPC(ids: List[Identifier], pc: Expr, ctx: LeonContext, maxValid: Int = 400, maxEnumerated: Int = 1000): ExamplesBank = {
     //println(program.definedClasses)
 
     val evaluator = new CodeGenEvaluator(ctx, program, CodeGenParams.default)
     val datagen   = new GrammarDataGen(evaluator, ValueGrammar)
-    val solverDataGen = new SolverDataGen(ctx, program, (ctx, pgm) => SolverFactory.getFromSettings(ctx, pgm))
+    val solverF   = SolverFactory.getFromSettings(ctx, program)
+    val solverDataGen = new SolverDataGen(ctx, program, solverF)
 
     val generatedExamples = datagen.generateFor(ids, pc, maxValid, maxEnumerated).map(InExample)
 
diff --git a/src/main/scala/leon/synthesis/SourceInfo.scala b/src/main/scala/leon/synthesis/SourceInfo.scala
index cf6063da0..0e9a22fd3 100644
--- a/src/main/scala/leon/synthesis/SourceInfo.scala
+++ b/src/main/scala/leon/synthesis/SourceInfo.scala
@@ -63,7 +63,7 @@ object SourceInfo {
 
       val p = Problem.fromSpec(ch.pred, and(path, term), outerEb, Some(fd))
 
-      val pcEb = eFinder.generateForPC(p.as, path, 20)
+      val pcEb = eFinder.generateForPC(p.as, path, ctx, 20)
       val chooseEb = eFinder.extractFromProblem(p)
       val eb = (outerEb union chooseEb) union pcEb
 
diff --git a/src/main/scala/leon/synthesis/rules/DetupleInput.scala b/src/main/scala/leon/synthesis/rules/DetupleInput.scala
index 28d567e1b..771899a7c 100644
--- a/src/main/scala/leon/synthesis/rules/DetupleInput.scala
+++ b/src/main/scala/leon/synthesis/rules/DetupleInput.scala
@@ -112,11 +112,10 @@ case object DetupleInput extends NormalizingRule("Detuple In") {
       val sub = Problem(newAs, subWs, subPc, subProblem, p.xs, eb).withWs(hints)
 
       val s = { (e: Expr) =>
-        LetPattern(
-          tuplePatternWrap(patts),
-          tupleWrap(as map Variable),
-          simplePostTransform(revMap)(e)
-        )
+        val body = simplePostTransform(revMap)(e)
+        (patts zip as).foldRight(body) { case ((patt, a), bd) =>
+          LetPattern(patt, a.toVariable, bd)
+        }
       }
      
       Some(decomp(List(sub), forwardMap(s), s"Detuple ${as.mkString(", ")}"))
diff --git a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala
index 775b496be..6a688b120 100644
--- a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala
+++ b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala
@@ -45,7 +45,7 @@ case object OptimisticGround extends Rule("Optimistic Ground") {
                     predicates = valuateWithModelIn(phi, ass, invalidModel) +: predicates
 
                   case (Some(false), _) =>
-                    // Model apprears valid, but it might be a fake expression (generic values)
+                    // Model appears valid, but it might be a fake expression (generic values)
                     val outExpr = tupleWrap(p.xs.map(valuateWithModel(satModel)))
 
                     if (!isRealExpr(outExpr)) {
-- 
GitLab