From 669abe4057d8c04b1e75bd6bd3372437fb32c01c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ali=20Sinan=20K=C3=B6ksal?= <alisinan@gmail.com>
Date: Mon, 25 Apr 2011 15:53:20 +0000
Subject: [PATCH] Some detailed profiling for fair solver

---
 cp-demo/RedBlackTree.scala       |  3 ++-
 src/purescala/FairZ3Solver.scala | 11 +++++++++++
 src/purescala/Stopwatch.scala    | 15 ++++++++++++++-
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/cp-demo/RedBlackTree.scala b/cp-demo/RedBlackTree.scala
index 46d611b73..d787a0c0c 100644
--- a/cp-demo/RedBlackTree.scala
+++ b/cp-demo/RedBlackTree.scala
@@ -46,7 +46,7 @@ object RedBlackTree {
   }
 
   @spec def blackHeight(t : Tree) : Int = t match {
-    case Empty() => 1
+    case Empty() => 0
     case Node(Black(), l, _, _) => blackHeight(l) + 1
     case Node(Red(), l, _, _) => blackHeight(l)
   }
@@ -106,6 +106,7 @@ object RedBlackTree {
     // for (tree <- solutionSet)
     //   println(print(tree) + "\n-----------\n")
     println("Fixed-size solution set size : " + solutionSet.size)
+    Stopwatch.printSummary
   }
 
   def enumerateAllUpTo(bound : Int) : Unit = {
diff --git a/src/purescala/FairZ3Solver.scala b/src/purescala/FairZ3Solver.scala
index 2e61161ab..9adb24518 100644
--- a/src/purescala/FairZ3Solver.scala
+++ b/src/purescala/FairZ3Solver.scala
@@ -254,6 +254,7 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
   }
 
   def decideWithModel(vc: Expr, forValidity: Boolean): (Option[Boolean], Map[Identifier,Expr]) = {
+    val initializationStopwatch = new Stopwatch("decideWithModel init", true).start
     var forceStop : Boolean = false
 
     var foundDefinitiveAnswer : Boolean = false
@@ -307,12 +308,16 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
 
     var iterationsLeft : Int = if(Settings.unrollingLevel > 0) Settings.unrollingLevel else 16121984
 
+    initializationStopwatch.stop
     while(!foundDefinitiveAnswer && !forceStop) {
       iterationsLeft -= 1
 
+      val blocking2Z3Stopwatch = new Stopwatch("Blocking to Z3 conv").start
       val blockingSetAsZ3 : Seq[Z3AST] = blockingSet.map(toZ3Formula(z3, _).get).toSeq
       // println("Blocking set : " + blockingSet)
+      blocking2Z3Stopwatch.stop
 
+      val assertBlockingStopwatch = new Stopwatch("Assert blocking set").start
       if(Settings.useCores) {
         // NOOP
       } else {
@@ -320,6 +325,7 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
         if(!blockingSetAsZ3.isEmpty)
           z3.assertCnstr(z3.mkAnd(blockingSetAsZ3 : _*))
       }
+      assertBlockingStopwatch.stop
 
       reporter.info(" - Running Z3 search...")
       val (answer, model, core) : (Option[Boolean], Z3Model, Seq[Z3AST]) = if(Settings.useCores) {
@@ -379,7 +385,9 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
           if(!Settings.useCores) {
             z3.pop(1)
             
+            val stopwatch = new Stopwatch("Second Z3 search", true).start
             val (result2,m2) = z3.checkAndGetModel()
+            stopwatch.stop
 
             if (result2 == Some(false)) {
               foundAnswer(Some(true))
@@ -399,6 +407,8 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
           if(!foundDefinitiveAnswer) { 
             reporter.info("- We need to keep going.")
 
+            val unrollingStopwatch = new Stopwatch("Unrolling", true).start
+
             val toRelease : Set[Expr] = if(Settings.useCores) {
               core.map(ast => fromZ3Formula(ast) match {
                 case n @ Not(Variable(_)) => n
@@ -470,6 +480,7 @@ class FairZ3Solver(val reporter: Reporter) extends Solver(reporter) with Abstrac
               //z3.assertCnstr(toZ3Formula(z3, And(newClauses)).get)
               blockingSet = blockingSet ++ Set(newBlockers.map(p => if(p._2) Not(Variable(p._1)) else Variable(p._1)) : _*)
             }
+            unrollingStopwatch.stop
           }
         }
       }
diff --git a/src/purescala/Stopwatch.scala b/src/purescala/Stopwatch.scala
index 86823fcbe..ee71110f5 100644
--- a/src/purescala/Stopwatch.scala
+++ b/src/purescala/Stopwatch.scala
@@ -11,7 +11,20 @@ class Stopwatch(description : String, verbose : Boolean = false) {
   def stop : Double = {
     end = System.currentTimeMillis
     val seconds = (end - beginning) / 1000.0
-    if (verbose) println("Stopwatch \"" + description + "\": " + seconds + " s")
+    if (verbose) println("Stopwatch %-25s: %-3.3fs" format (description, seconds))
+    Stopwatch.timeLog += 
+      (description -> (Stopwatch.timeLog.getOrElse(description, Nil) :+ seconds))
     seconds
   }
 }
+
+object Stopwatch {
+  val timeLog = scala.collection.mutable.Map[String, Seq[Double]]()
+
+  def printSummary : Unit = {
+    val toPrint = timeLog.map{case (k, v) => ("%-25s" format k, v.foldLeft(0.0){case (a, b) => a + b})}.mkString("\n")
+
+    println("Total times per stopwatch description")
+    println(toPrint)
+  }
+}
-- 
GitLab