From cb0feb3cfd65f669016b1adbd67ef38939d2efdc Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Tue, 21 Jul 2015 02:21:58 +0200
Subject: [PATCH] API for telling which solver solved (for portfolio)

---
 src/main/scala/leon/solvers/Solver.scala                  | 1 +
 .../scala/leon/solvers/combinators/PortfolioSolver.scala  | 8 +++++++-
 src/main/scala/leon/verification/AnalysisPhase.scala      | 4 ++--
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/main/scala/leon/solvers/Solver.scala b/src/main/scala/leon/solvers/Solver.scala
index daf7b8499..69eef7449 100644
--- a/src/main/scala/leon/solvers/Solver.scala
+++ b/src/main/scala/leon/solvers/Solver.scala
@@ -21,6 +21,7 @@ trait Solver {
 
   def check: Option[Boolean]
   def getModel: Map[Identifier, Expr]
+  def getResultSolver: Option[Solver] = Some(this)
 
   def free()
 
diff --git a/src/main/scala/leon/solvers/combinators/PortfolioSolver.scala b/src/main/scala/leon/solvers/combinators/PortfolioSolver.scala
index 5bb6d9471..1f990a0c5 100644
--- a/src/main/scala/leon/solvers/combinators/PortfolioSolver.scala
+++ b/src/main/scala/leon/solvers/combinators/PortfolioSolver.scala
@@ -23,6 +23,9 @@ class PortfolioSolver[S <: Solver with Interruptible](val context: LeonContext,
 
   protected var modelMap = Map[Identifier, Expr]()
   protected var solversInsts: Seq[S] = solvers.map(_.getNewSolver())
+  protected var resultSolver: Option[Solver] = None
+
+  override def getResultSolver = resultSolver
 
   def assertCnstr(expression: Expr): Unit = {
     solversInsts.foreach(_.assertCnstr(expression))
@@ -54,7 +57,10 @@ class PortfolioSolver[S <: Solver with Interruptible](val context: LeonContext,
     val res = Await.result(result, 10.days) match {
       case Some((s, r, m)) =>
         modelMap = m
-        context.reporter.debug("Solved with "+s.name)
+        resultSolver = s.getResultSolver
+        resultSolver.foreach { solv =>
+          context.reporter.debug("Solved with "+solv)
+        }
         solversInsts.foreach(_.interrupt())
         r
       case None =>
diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala
index 3fbc3671e..e8b3b39f3 100644
--- a/src/main/scala/leon/verification/AnalysisPhase.scala
+++ b/src/main/scala/leon/verification/AnalysisPhase.scala
@@ -161,10 +161,10 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] {
           VCResult(status, Some(s), Some(dt))
 
         case Some(false) =>
-          VCResult(VCStatus.Valid, Some(s), Some(dt))
+          VCResult(VCStatus.Valid, s.getResultSolver, Some(dt))
 
         case Some(true) =>
-          VCResult(VCStatus.Invalid(s.getModel), Some(s), Some(dt))
+          VCResult(VCStatus.Invalid(s.getModel), s.getResultSolver, Some(dt))
       }
 
       reporter.synchronized {
-- 
GitLab