From 813245b29af60137f5bb94dfa2831d2454c8a9b5 Mon Sep 17 00:00:00 2001
From: Alan Mishchenko <alanmi@berkeley.edu>
Date: Fri, 15 Apr 2011 09:29:13 -0700
Subject: Improving timeout in the interpolation package.

---
 src/aig/int/intCheck.c |  6 +++++-
 src/aig/int/intCore.c  | 36 ++++++++++++++++++++++++++----------
 src/aig/int/intInt.h   |  4 ++--
 src/aig/int/intM114.c  |  6 +++++-
 src/base/abci/abc.c    |  5 -----
 5 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/src/aig/int/intCheck.c b/src/aig/int/intCheck.c
index 54bb7ad9..6b36fe30 100644
--- a/src/aig/int/intCheck.c
+++ b/src/aig/int/intCheck.c
@@ -217,7 +217,7 @@ void Inter_CheckAddEqual( Inter_Check_t * p, int iVarA, int iVarB )
   SeeAlso     []
 
 ***********************************************************************/
-int Inter_CheckPerform( Inter_Check_t * p, Cnf_Dat_t * pCnfInt )
+int Inter_CheckPerform( Inter_Check_t * p, Cnf_Dat_t * pCnfInt, int nTimeNewOut )
 {
     Aig_Obj_t * pObj, * pObj2;
     int i, f, VarA, VarB, RetValue, Entry, status;
@@ -225,6 +225,10 @@ int Inter_CheckPerform( Inter_Check_t * p, Cnf_Dat_t * pCnfInt )
     assert( Aig_ManPoNum(p->pCnf->pMan) == p->nFramesK * nRegs );
     assert( Aig_ManPoNum(pCnfInt->pMan) == 1 );
 
+    // set runtime limit
+    if ( nTimeNewOut )
+        sat_solver_set_runtime_limit( p->pSat, nTimeNewOut );
+
     // add clauses to the SAT solver
     Cnf_DataLift( pCnfInt, p->nVars );
     for ( f = 0; f <= p->nFramesK; f++ )
diff --git a/src/aig/int/intCore.c b/src/aig/int/intCore.c
index fdc2241e..ceb0025c 100644
--- a/src/aig/int/intCore.c
+++ b/src/aig/int/intCore.c
@@ -80,7 +80,13 @@ int Inter_ManPerformInterpolation( Aig_Man_t * pAig, Inter_ManParams_t * pPars,
     Inter_Man_t * p;
     Inter_Check_t * pCheck = NULL;
     Aig_Man_t * pAigTemp;
-    int s, i, RetValue, Status, clk, clk2, clkTotal = clock();
+    int s, i, RetValue, Status, clk, clk2, clkTotal = clock(), timeTemp;
+    int nTimeNewOut = 0;
+
+    // set runtime limit
+    if ( pPars->nSecLimit )
+        nTimeNewOut = clock() + pPars->nSecLimit * CLOCKS_PER_SEC;
+
     // sanity checks
     assert( Saig_ManRegNum(pAig) > 0 );
     assert( Saig_ManPiNum(pAig) > 0 );
@@ -171,7 +177,7 @@ p->timeCnf += clock() - clk;
 clk = clock();
             pCnfInter2 = Cnf_Derive( p->pInter, 1 );  
 p->timeCnf += clock() - clk;    
-            RetValue = Inter_CheckPerform( pCheck, pCnfInter2 );
+            RetValue = Inter_CheckPerform( pCheck, pCnfInter2, nTimeNewOut );
 //            assert( RetValue == 0 );
             Cnf_DataFree( pCnfInter2 );
         }
@@ -200,7 +206,7 @@ p->timeCnf += clock() - clk;
             }
             else 
 #endif
-                RetValue = Inter_ManPerformOneStep( p, pPars->fUseBias, pPars->fUseBackward );
+                RetValue = Inter_ManPerformOneStep( p, pPars->fUseBias, pPars->fUseBackward, nTimeNewOut );
 
             if ( pPars->fVerbose )
             {
@@ -228,11 +234,19 @@ p->timeCnf += clock() - clk;
                 Inter_ManClean( p ); 
                 break;
             }
-            else if ( RetValue == -1 ) // timed out
+            else if ( RetValue == -1 ) 
             {
-                if ( pPars->fVerbose )
-                    printf( "Reached limit (%d) on the number of conflicts.\n", p->nConfLimit );
-                assert( p->nConfCur >= p->nConfLimit );
+                if ( pPars->nSecLimit && clock() > nTimeNewOut ) // timed out
+                {
+                    if ( pPars->fVerbose )
+                        printf( "Reached timeout (%d seconds).\n",  pPars->nSecLimit );
+                }
+                else
+                {
+                    assert( p->nConfCur >= p->nConfLimit );
+                    if ( pPars->fVerbose )
+                        printf( "Reached limit (%d) on the number of conflicts.\n", p->nConfLimit );
+                }
                 p->timeTotal = clock() - clkTotal;
                 Inter_ManStop( p );
                 Inter_CheckStop( pCheck );
@@ -275,7 +289,9 @@ clk = clock();
 clk2 = clock();
                         pCnfInter2 = Cnf_Derive( p->pInterNew, 1 );  
 p->timeCnf += clock() - clk2;
-                        Status = Inter_CheckPerform( pCheck, pCnfInter2 );
+timeTemp = clock() - clk2;
+            
+                        Status = Inter_CheckPerform( pCheck, pCnfInter2, nTimeNewOut );
                         Cnf_DataFree( pCnfInter2 );
                     }
                 }
@@ -289,7 +305,7 @@ p->timeCnf += clock() - clk2;
                 else
                     Status = 0;
             }
-p->timeEqu += clock() - clk;
+p->timeEqu += clock() - clk - timeTemp;
             if ( Status ) // contained
             {
                 if ( pPars->fVerbose )
@@ -299,7 +315,7 @@ p->timeEqu += clock() - clk;
                 Inter_CheckStop( pCheck );
                 return 1;
             }
-            if ( pPars->nSecLimit && ((float)pPars->nSecLimit <= (float)(clock()-clkTotal)/(float)(CLOCKS_PER_SEC)) )
+            if ( pPars->nSecLimit && clock() > nTimeNewOut )
             {
                 printf( "Reached timeout (%d seconds).\n",  pPars->nSecLimit );
                 p->timeTotal = clock() - clkTotal;
diff --git a/src/aig/int/intInt.h b/src/aig/int/intInt.h
index d5e8ed00..3eab7883 100644
--- a/src/aig/int/intInt.h
+++ b/src/aig/int/intInt.h
@@ -93,7 +93,7 @@ typedef struct Inter_Check_t_ Inter_Check_t;
 /*=== intCheck.c ============================================================*/
 extern Inter_Check_t * Inter_CheckStart( Aig_Man_t * pTrans, int nFramesK );
 extern void            Inter_CheckStop( Inter_Check_t * p );
-extern int             Inter_CheckPerform( Inter_Check_t * p, Cnf_Dat_t * pCnf );
+extern int             Inter_CheckPerform( Inter_Check_t * p, Cnf_Dat_t * pCnf, int nTimeNewOut );
 
 /*=== intContain.c ============================================================*/
 extern int             Inter_ManCheckContainment( Aig_Man_t * pNew, Aig_Man_t * pOld );
@@ -117,7 +117,7 @@ extern void            Inter_ManClean( Inter_Man_t * p );
 extern void            Inter_ManStop( Inter_Man_t * p );
 
 /*=== intM114.c ============================================================*/
-extern int             Inter_ManPerformOneStep( Inter_Man_t * p, int fUseBias, int fUseBackward );
+extern int             Inter_ManPerformOneStep( Inter_Man_t * p, int fUseBias, int fUseBackward, int nTimeNewOut );
 
 /*=== intM114p.c ============================================================*/
 #ifdef ABC_USE_LIBRARIES
diff --git a/src/aig/int/intM114.c b/src/aig/int/intM114.c
index c1718eae..139c9bbd 100644
--- a/src/aig/int/intM114.c
+++ b/src/aig/int/intM114.c
@@ -200,7 +200,7 @@ sat_solver * Inter_ManDeriveSatSolver(
   SeeAlso     []
 
 ***********************************************************************/
-int Inter_ManPerformOneStep( Inter_Man_t * p, int fUseBias, int fUseBackward )
+int Inter_ManPerformOneStep( Inter_Man_t * p, int fUseBias, int fUseBackward, int nTimeNewOut )
 {
     sat_solver * pSat;
     void * pSatCnf = NULL;
@@ -219,6 +219,10 @@ int Inter_ManPerformOneStep( Inter_Man_t * p, int fUseBias, int fUseBackward )
         return 1;
     }
 
+    // set runtime limit
+    if ( nTimeNewOut )
+        sat_solver_set_runtime_limit( pSat, nTimeNewOut );
+
     // collect global variables
     pGlobalVars = ABC_CALLOC( int, sat_solver_nvars(pSat) );
     Vec_IntForEachEntry( p->vVarsAB, Var, i )
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c
index e8ac4d76..f4fb5ccc 100644
--- a/src/base/abci/abc.c
+++ b/src/base/abci/abc.c
@@ -8535,11 +8535,6 @@ int Abc_CommandTest( Abc_Frame_t * pAbc, int argc, char ** argv )
     }
 */
 
-{
-//    extern void Ssm_ManExperiment( char * pFileIn, char * pFileOut );
-//    Ssm_ManExperiment( "m\\big2.ssim", "m\\big2_.ssim" );
-}
-
     return 0;
 usage:
     Abc_Print( -2, "usage: test [-CKDN] [-vwh] <file_name>\n" );
-- 
cgit v1.2.3