diff --git a/src/main/scala/leon/synthesis/Heuristics.scala b/src/main/scala/leon/synthesis/Heuristics.scala index 7ad623ec0b4a4be74ffc62781fe9aceebfef10e4..6802fe40d6bd102a3cba89b50b349e690b338175 100644 --- a/src/main/scala/leon/synthesis/Heuristics.scala +++ b/src/main/scala/leon/synthesis/Heuristics.scala @@ -15,7 +15,7 @@ object Heuristics { ) } -class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", synth, 9, 0) { +class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", synth, 9) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -72,7 +72,7 @@ class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", syn } -class IntInduction(synth: Synthesizer) extends Rule("Int Induction", synth, 8, 500) { +class IntInduction(synth: Synthesizer) extends Rule("Int Induction", synth, 8) { def applyOn(task: Task): RuleResult = { val p = task.problem diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index c6371a00e686d7d3e10101566be1d268598bbac2..ca8b32d86762c1f4ecaa838b416aa391a44916be 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -2,6 +2,7 @@ package leon package synthesis import purescala.Common._ +import purescala.ScalaPrinter import purescala.Trees._ import purescala.Extractors._ import purescala.TreeOps._ @@ -27,7 +28,7 @@ case class RuleSuccess(solution: Solution) extends RuleResult case class RuleDecomposed(subProblems: List[Problem], onSuccess: List[Solution] => Solution) extends RuleResult -abstract class Rule(val name: String, val synth: Synthesizer, val priority: Priority, val cost: Cost) { +abstract class Rule(val name: String, val synth: Synthesizer, val priority: Priority) { def applyOn(task: Task): RuleResult def subst(what: Tuple2[Identifier, Expr], in: Expr): Expr = replace(Map(Variable(what._1) -> what._2), in) @@ -41,7 +42,7 @@ abstract class Rule(val name: String, val synth: Synthesizer, val priority: Prio override def toString = name } -class OnePoint(synth: Synthesizer) extends Rule("One-point", synth, 30, 5) { +class OnePoint(synth: Synthesizer) extends Rule("One-point", synth, 30) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -80,7 +81,7 @@ class OnePoint(synth: Synthesizer) extends Rule("One-point", synth, 30, 5) { } } -class Ground(synth: Synthesizer) extends Rule("Ground", synth, 50, 0) { +class Ground(synth: Synthesizer) extends Rule("Ground", synth, 50) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -102,7 +103,7 @@ class Ground(synth: Synthesizer) extends Rule("Ground", synth, 50, 0) { } } -class CaseSplit(synth: Synthesizer) extends Rule("Case-Split", synth, 20, 10) { +class CaseSplit(synth: Synthesizer) extends Rule("Case-Split", synth, 20) { def applyOn(task: Task): RuleResult = { val p = task.problem p.phi match { @@ -122,7 +123,7 @@ class CaseSplit(synth: Synthesizer) extends Rule("Case-Split", synth, 20, 10) { } } -class Assert(synth: Synthesizer) extends Rule("Assert", synth, 20, 1) { +class Assert(synth: Synthesizer) extends Rule("Assert", synth, 20) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -154,7 +155,7 @@ class Assert(synth: Synthesizer) extends Rule("Assert", synth, 20, 1) { } } -class UnusedInput(synth: Synthesizer) extends Rule("UnusedInput", synth, 10, 1) { +class UnusedInput(synth: Synthesizer) extends Rule("UnusedInput", synth, 10) { def applyOn(task: Task): RuleResult = { val p = task.problem val unused = p.as.toSet -- variablesOf(p.phi) @@ -169,7 +170,7 @@ class UnusedInput(synth: Synthesizer) extends Rule("UnusedInput", synth, 10, 1) } } -class UnconstrainedOutput(synth: Synthesizer) extends Rule("Unconstr.Output", synth, 10, 5) { +class UnconstrainedOutput(synth: Synthesizer) extends Rule("Unconstr.Output", synth, 10) { def applyOn(task: Task): RuleResult = { val p = task.problem val unconstr = p.xs.toSet -- variablesOf(p.phi) @@ -193,7 +194,7 @@ class UnconstrainedOutput(synth: Synthesizer) extends Rule("Unconstr.Output", sy } object Unification { - class DecompTrivialClash(synth: Synthesizer) extends Rule("Unif Dec./Clash/Triv.", synth, 20, 5) { + class DecompTrivialClash(synth: Synthesizer) extends Rule("Unif Dec./Clash/Triv.", synth, 20) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -221,7 +222,7 @@ object Unification { } } - class OccursCheck(synth: Synthesizer) extends Rule("Unif OccursCheck", synth, 20, 0) { + class OccursCheck(synth: Synthesizer) extends Rule("Unif OccursCheck", synth, 20) { def applyOn(task: Task): RuleResult = { val p = task.problem @@ -248,7 +249,7 @@ object Unification { } -class ADTDual(synth: Synthesizer) extends Rule("ADTDual", synth, 20, 10) { +class ADTDual(synth: Synthesizer) extends Rule("ADTDual", synth, 20) { def applyOn(task: Task): RuleResult = { val p = task.problem diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index b493a50ded11a0130fb364c9a34a5b3777e94475..5020c522013cd5c039c339205d40750225430e8d 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -54,6 +54,15 @@ class Synthesizer(val r: Reporter, // Check if solving this task has the slightest chance of improving the // current solution if (task.minComplexity < bestSolutionSoFar().complexity) { + if (!subProblems.isEmpty) { + val name = Option(task.rule).map(_.name).getOrElse("root") + println("["+name+"] Got: "+task.problem) + println("["+name+"] Decomposed into:") + for(p <- subProblems) { + println("["+name+"] - "+p) + } + } + for (p <- subProblems; r <- rules) yield { workList += new Task(this, task, p, r) }