| /**CFile**************************************************************** |
| |
| FileName [xsatSolverAPI.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [xSAT - A SAT solver written in C. |
| Read the license file for more info.] |
| |
| Synopsis [Solver external API functions implementation.] |
| |
| Author [Bruno Schmitt <boschmitt@inf.ufrgs.br>] |
| |
| Affiliation [UC Berkeley / UFRGS] |
| |
| Date [Ver. 1.0. Started - November 10, 2016.] |
| |
| Revision [] |
| |
| ***********************************************************************/ |
| //////////////////////////////////////////////////////////////////////// |
| /// INCLUDES /// |
| //////////////////////////////////////////////////////////////////////// |
| #include <stdio.h> |
| #include <assert.h> |
| #include <string.h> |
| #include <math.h> |
| |
| #include "xsatSolver.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| xSAT_SolverOptions_t DefaultConfig = |
| { |
| 1, //.fVerbose = 1, |
| |
| 0, //.nConfLimit = 0, |
| 0, //.nInsLimit = 0, |
| 0, //.nRuntimeLimit = 0, |
| |
| 0.8, //.K = 0.8, |
| 1.4, //.R = 1.4, |
| 10000, //.nFirstBlockRestart = 10000, |
| 50, //.nSizeLBDQueue = 50, |
| 5000, //.nSizeTrailQueue = 5000, |
| |
| 2000, //.nConfFirstReduce = 2000, |
| 300, //.nIncReduce = 300, |
| 1000, //.nSpecialIncReduce = 1000, |
| |
| 30 //.nLBDFrozenClause = 30 |
| }; |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| xSAT_Solver_t* xSAT_SolverCreate() |
| { |
| xSAT_Solver_t * s = (xSAT_Solver_t *) ABC_CALLOC( char, sizeof( xSAT_Solver_t ) ); |
| s->Config = DefaultConfig; |
| |
| s->pMemory = xSAT_MemAlloc(0); |
| s->vClauses = Vec_IntAlloc(0); |
| s->vLearnts = Vec_IntAlloc(0); |
| s->vWatches = xSAT_VecWatchListAlloc( 0 ); |
| s->vBinWatches = xSAT_VecWatchListAlloc( 0 ); |
| |
| s->vTrailLim = Vec_IntAlloc(0); |
| s->vTrail = Vec_IntAlloc( 0 ); |
| |
| s->vActivity = Vec_IntAlloc( 0 ); |
| s->hOrder = xSAT_HeapAlloc( s->vActivity ); |
| |
| s->vPolarity = Vec_StrAlloc( 0 ); |
| s->vTags = Vec_StrAlloc( 0 ); |
| s->vAssigns = Vec_StrAlloc( 0 ); |
| s->vLevels = Vec_IntAlloc( 0 ); |
| s->vReasons = Vec_IntAlloc( 0 ); |
| s->vStamp = Vec_IntAlloc( 0 ); |
| |
| s->vTagged = Vec_IntAlloc(0); |
| s->vStack = Vec_IntAlloc(0); |
| |
| s->vSeen = Vec_StrAlloc( 0 ); |
| s->vLearntClause = Vec_IntAlloc(0); |
| s->vLastDLevel = Vec_IntAlloc(0); |
| |
| |
| s->bqTrail = xSAT_BQueueNew( s->Config.nSizeTrailQueue ); |
| s->bqLBD = xSAT_BQueueNew( s->Config.nSizeLBDQueue ); |
| |
| s->nVarActInc = (1 << 5); |
| s->nClaActInc = (1 << 11); |
| |
| s->nConfBeforeReduce = s->Config.nConfFirstReduce; |
| s->nRC1 = 1; |
| s->nRC2 = s->Config.nConfFirstReduce; |
| return s; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void xSAT_SolverDestroy( xSAT_Solver_t * s ) |
| { |
| xSAT_MemFree( s->pMemory ); |
| Vec_IntFree( s->vClauses ); |
| Vec_IntFree( s->vLearnts ); |
| xSAT_VecWatchListFree( s->vWatches ); |
| xSAT_VecWatchListFree( s->vBinWatches ); |
| |
| xSAT_HeapFree(s->hOrder); |
| Vec_IntFree( s->vTrailLim ); |
| Vec_IntFree( s->vTrail ); |
| Vec_IntFree( s->vTagged ); |
| Vec_IntFree( s->vStack ); |
| |
| Vec_StrFree( s->vSeen ); |
| Vec_IntFree( s->vLearntClause ); |
| Vec_IntFree( s->vLastDLevel ); |
| |
| Vec_IntFree( s->vActivity ); |
| Vec_StrFree( s->vPolarity ); |
| Vec_StrFree( s->vTags ); |
| Vec_StrFree( s->vAssigns ); |
| Vec_IntFree( s->vLevels ); |
| Vec_IntFree( s->vReasons ); |
| Vec_IntFree( s->vStamp ); |
| |
| xSAT_BQueueFree(s->bqLBD); |
| xSAT_BQueueFree(s->bqTrail); |
| |
| ABC_FREE(s); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int xSAT_SolverSimplify( xSAT_Solver_t * s ) |
| { |
| int i, j; |
| unsigned CRef; |
| assert( xSAT_SolverDecisionLevel(s) == 0 ); |
| |
| if ( xSAT_SolverPropagate(s) != CRefUndef ) |
| return false; |
| |
| if ( s->nAssignSimplify == Vec_IntSize( s->vTrail ) || s->nPropSimplify > 0 ) |
| return true; |
| |
| j = 0; |
| Vec_IntForEachEntry( s->vClauses, CRef, i ) |
| { |
| xSAT_Clause_t * pCla = xSAT_SolverReadClause( s, CRef ); |
| if ( xSAT_SolverIsClauseSatisfied( s, pCla ) ) |
| { |
| pCla->fMark = 1; |
| s->Stats.nClauseLits -= pCla->nSize; |
| |
| if ( pCla->nSize == 2 ) |
| { |
| xSAT_WatchListRemove( xSAT_VecWatchListEntry( s->vBinWatches, xSAT_NegLit(pCla->pData[0].Lit) ), CRef ); |
| xSAT_WatchListRemove( xSAT_VecWatchListEntry( s->vBinWatches, xSAT_NegLit(pCla->pData[1].Lit) ), CRef ); |
| } |
| else |
| { |
| xSAT_WatchListRemove( xSAT_VecWatchListEntry( s->vWatches, xSAT_NegLit(pCla->pData[0].Lit) ), CRef ); |
| xSAT_WatchListRemove( xSAT_VecWatchListEntry( s->vWatches, xSAT_NegLit(pCla->pData[1].Lit) ), CRef ); |
| } |
| } |
| else |
| Vec_IntWriteEntry( s->vClauses, j++, CRef ); |
| } |
| Vec_IntShrink( s->vClauses, j ); |
| xSAT_SolverRebuildOrderHeap( s ); |
| |
| s->nAssignSimplify = Vec_IntSize( s->vTrail ); |
| s->nPropSimplify = s->Stats.nClauseLits + s->Stats.nLearntLits; |
| |
| return true; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void xSAT_SolverAddVariable( xSAT_Solver_t* s, int Sign ) |
| { |
| int Var = Vec_IntSize( s->vActivity ); |
| |
| xSAT_VecWatchListPush( s->vWatches ); |
| xSAT_VecWatchListPush( s->vWatches ); |
| xSAT_VecWatchListPush( s->vBinWatches ); |
| xSAT_VecWatchListPush( s->vBinWatches ); |
| |
| Vec_IntPush( s->vActivity, 0 ); |
| Vec_IntPush( s->vLevels, 0 ); |
| Vec_StrPush( s->vAssigns, VarX ); |
| Vec_StrPush( s->vPolarity, 1 ); |
| Vec_StrPush( s->vTags, 0 ); |
| Vec_IntPush( s->vReasons, ( int ) CRefUndef ); |
| Vec_IntPush( s->vStamp, 0 ); |
| Vec_StrPush( s->vSeen, 0 ); |
| |
| xSAT_HeapInsert( s->hOrder, Var ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int xSAT_SolverAddClause( xSAT_Solver_t * s, Vec_Int_t * vLits ) |
| { |
| int i, j; |
| int Lit, PrevLit; |
| int MaxVar; |
| |
| Vec_IntSort( vLits, 0 ); |
| MaxVar = xSAT_Lit2Var( Vec_IntEntryLast( vLits ) ); |
| while ( MaxVar >= Vec_IntSize( s->vActivity ) ) |
| xSAT_SolverAddVariable( s, 1 ); |
| |
| j = 0; |
| PrevLit = LitUndef; |
| Vec_IntForEachEntry( vLits, Lit, i ) |
| { |
| if ( Lit == xSAT_NegLit( PrevLit ) || Vec_StrEntry( s->vAssigns, xSAT_Lit2Var( Lit ) ) == xSAT_LitSign( Lit ) ) |
| return true; |
| else if ( Lit != PrevLit && Vec_StrEntry( s->vAssigns, xSAT_Lit2Var( Lit ) ) == VarX ) |
| { |
| PrevLit = Lit; |
| Vec_IntWriteEntry( vLits, j++, Lit ); |
| } |
| } |
| Vec_IntShrink( vLits, j ); |
| |
| if ( Vec_IntSize( vLits ) == 0 ) |
| return false; |
| if ( Vec_IntSize( vLits ) == 1 ) |
| { |
| xSAT_SolverEnqueue( s, Vec_IntEntry( vLits, 0 ), CRefUndef ); |
| return ( xSAT_SolverPropagate( s ) == CRefUndef ); |
| } |
| |
| xSAT_SolverClaNew( s, vLits, 0 ); |
| return true; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int xSAT_SolverSolve( xSAT_Solver_t* s ) |
| { |
| char status = LBoolUndef; |
| |
| assert(s); |
| if ( s->Config.fVerbose ) |
| { |
| printf( "==========================================[ BLACK MAGIC ]================================================\n" ); |
| printf( "| | | |\n" ); |
| printf( "| - Restarts: | - Reduce Clause DB: | - Minimize Asserting: |\n" ); |
| printf( "| * LBD Queue : %6d | * First : %6d | * size < %3d |\n", s->Config.nSizeLBDQueue, s->Config.nConfFirstReduce, 0 ); |
| printf( "| * Trail Queue : %6d | * Inc : %6d | * lbd < %3d |\n", s->Config.nSizeTrailQueue, s->Config.nIncReduce, 0 ); |
| printf( "| * K : %6.2f | * Special : %6d | |\n", s->Config.K, s->Config.nSpecialIncReduce ); |
| printf( "| * R : %6.2f | * Protected : (lbd)< %2d | |\n", s->Config.R, s->Config.nLBDFrozenClause ); |
| printf( "| | | |\n" ); |
| printf( "=========================================================================================================\n" ); |
| } |
| |
| while ( status == LBoolUndef ) |
| status = xSAT_SolverSearch( s ); |
| |
| if ( s->Config.fVerbose ) |
| printf( "=========================================================================================================\n" ); |
| |
| xSAT_SolverCancelUntil( s, 0 ); |
| return status; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void xSAT_SolverPrintStats( xSAT_Solver_t * s ) |
| { |
| printf( "starts : %10d\n", s->Stats.nStarts ); |
| printf( "conflicts : %10ld\n", s->Stats.nConflicts ); |
| printf( "decisions : %10ld\n", s->Stats.nDecisions ); |
| printf( "propagations : %10ld\n", s->Stats.nPropagations ); |
| } |
| |
| ABC_NAMESPACE_IMPL_END |