From 468b9dc400b30c09f9179d3e3aeaae2dff6501fb Mon Sep 17 00:00:00 2001
From: "Emmanouil (Manos) Koukoutos" <emmanouil.koukoutos@epfl.ch>
Date: Fri, 6 Feb 2015 19:32:16 +0100
Subject: [PATCH] Fix bug that misses tests

---
 .../leon/repair/RepairTrackingEvaluator.scala | 25 +++++++++++++++----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/main/scala/leon/repair/RepairTrackingEvaluator.scala b/src/main/scala/leon/repair/RepairTrackingEvaluator.scala
index 8ac452b9f..c0156a9e2 100644
--- a/src/main/scala/leon/repair/RepairTrackingEvaluator.scala
+++ b/src/main/scala/leon/repair/RepairTrackingEvaluator.scala
@@ -8,6 +8,7 @@ import leon.purescala.TypeTrees._
 import leon.purescala.Definitions._
 import leon.LeonContext
 import leon.evaluators.RecursiveEvaluator
+import leon.synthesis._
 
 class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends RecursiveEvaluator(ctx, prog, 50000) {
   type RC = CollectingRecContext
@@ -21,13 +22,25 @@ class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends Recursive
   // This is a call graph to track dependencies of function invocations.
   // If fi1 calls fi2 but fails fi2's precondition, we consider it 
   // fi1's fault and we don't register the dependency.
-  private val callGraph : MMap[FI, Set[FI]] = MMap().withDefaultValue(Set())
+  private val callGraph : MMap[FI, Set[FI]] = MMap()//.withDefaultValue(Set())
+  private def registerNode(fi : FI) = if (!callGraph.contains(fi)) callGraph update (fi, Set())
   private def registerCall(fi : FI, lastFI : Option[FI]) = {
     lastFI foreach { lfi => 
       callGraph update (lfi, callGraph(lfi) + fi) 
     }
   }
-  def fullCallGraph = leon.utils.GraphOps.transitiveClosure(callGraph.toMap)
+  def fullCallGraph = {
+    /*println("About to print")
+      for{ 
+        (test, tests) <-callGraph
+        
+      } {
+        println(test._2 mkString ", ")
+        println(new ExamplesTable("", tests.toSeq.map{ x => InExample(x._2)}).toString)
+      }*/
+
+    leon.utils.GraphOps.transitiveClosure(callGraph.toMap)
+  }
   
   // Tracks if every function invocation succeeded or failed
   private val fiStatus_ : MMap[FI, Boolean] = MMap().withDefaultValue(false)
@@ -48,9 +61,6 @@ class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends Recursive
       gctx.stepsLeft -= 1
       
       val evArgs = args.map(a => e(a))
-
-      // We consider this function invocation successful, unless the opposite is proven.
-      registerSuccessful(tfd.fd, evArgs)
       
       // build a mapping for the function...
       val frameBlamingCaller = rctx.withVars((tfd.params.map(_.id) zip evArgs).toMap)
@@ -58,8 +68,11 @@ class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends Recursive
       if(tfd.hasPrecondition) {
         e(tfd.precondition.get)(frameBlamingCaller, gctx) match {
           case BooleanLiteral(true) => 
+            // We consider this function invocation successful, unless the opposite is proven.
+            registerSuccessful(tfd.fd, evArgs)
             // Only register a call dependency if the call we depend on does not fail precondition
             registerCall((tfd.fd, evArgs), rctx.lastFI)
+            registerNode((tfd.fd, evArgs))
           case BooleanLiteral(false) =>
             // Caller's fault!
             rctx.lastFI foreach registerFailed
@@ -70,6 +83,8 @@ class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends Recursive
             throw RuntimeError(typeErrorMsg(other, BooleanType))
         }
       } else {
+        registerSuccessful(tfd.fd, evArgs)
+        registerNode((tfd.fd, evArgs))
         registerCall((tfd.fd, evArgs), rctx.lastFI)
       }
 
-- 
GitLab