blob: d1e71371f764ec68fc5f88bfd4f863dbc2fc9876 [file] [log] [blame]
/**CFile****************************************************************
FileName [msatInt.c]
PackageName [A C version of SAT solver MINISAT, originally developed
in C++ by Niklas Een and Niklas Sorensson, Chalmers University of
Technology, Sweden: http://www.cs.chalmers.se/~een/Satzoo.]
Synopsis [Internal definitions of the solver.]
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - January 1, 2004.]
Revision [$Id: msatInt.c,v 1.0 2004/01/01 1:00:00 alanmi Exp $]
***********************************************************************/
#ifndef ABC__sat__msat__msatInt_h
#define ABC__sat__msat__msatInt_h
////////////////////////////////////////////////////////////////////////
/// INCLUDES ///
////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include "misc/util/abc_global.h"
#include "msat.h"
ABC_NAMESPACE_HEADER_START
////////////////////////////////////////////////////////////////////////
/// PARAMETERS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// STRUCTURE DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
// By default, custom memory management is used
// which guarantees constant time allocation/deallocation
// for SAT clauses and other frequently modified objects.
// For debugging, it is possible use system memory management
// directly. In which case, uncomment the macro below.
//#define USE_SYSTEM_MEMORY_MANAGEMENT
// internal data structures
typedef struct Msat_Clause_t_ Msat_Clause_t;
typedef struct Msat_Queue_t_ Msat_Queue_t;
typedef struct Msat_Order_t_ Msat_Order_t;
// memory managers (duplicated from Extra for stand-aloneness)
typedef struct Msat_MmFixed_t_ Msat_MmFixed_t;
typedef struct Msat_MmFlex_t_ Msat_MmFlex_t;
typedef struct Msat_MmStep_t_ Msat_MmStep_t;
// variables and literals
typedef int Msat_Lit_t;
typedef int Msat_Var_t;
// the type of return value
#define MSAT_VAR_UNASSIGNED (-1)
#define MSAT_LIT_UNASSIGNED (-2)
#define MSAT_ORDER_UNKNOWN (-3)
// printing the search tree
#define L_IND "%-*d"
#define L_ind Msat_SolverReadDecisionLevel(p)*3+3,Msat_SolverReadDecisionLevel(p)
#define L_LIT "%s%d"
#define L_lit(Lit) MSAT_LITSIGN(Lit)?"-":"", MSAT_LIT2VAR(Lit)+1
typedef struct Msat_SolverStats_t_ Msat_SolverStats_t;
struct Msat_SolverStats_t_
{
ABC_INT64_T nStarts; // the number of restarts
ABC_INT64_T nDecisions; // the number of decisions
ABC_INT64_T nPropagations; // the number of implications
ABC_INT64_T nInspects; // the number of times clauses are vising while watching them
ABC_INT64_T nConflicts; // the number of conflicts
ABC_INT64_T nSuccesses; // the number of sat assignments found
};
typedef struct Msat_SearchParams_t_ Msat_SearchParams_t;
struct Msat_SearchParams_t_
{
double dVarDecay;
double dClaDecay;
};
// sat solver data structure visible through all the internal files
struct Msat_Solver_t_
{
int nClauses; // the total number of clauses
int nClausesStart; // the number of clauses before adding
Msat_ClauseVec_t * vClauses; // problem clauses
Msat_ClauseVec_t * vLearned; // learned clauses
double dClaInc; // Amount to bump next clause with.
double dClaDecay; // INVERSE decay factor for clause activity: stores 1/decay.
double * pdActivity; // A heuristic measurement of the activity of a variable.
float * pFactors; // the multiplicative factors of variable activity
double dVarInc; // Amount to bump next variable with.
double dVarDecay; // INVERSE decay factor for variable activity: stores 1/decay. Use negative value for static variable order.
Msat_Order_t * pOrder; // Keeps track of the decision variable order.
Msat_ClauseVec_t ** pvWatched; // 'pvWatched[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true).
Msat_Queue_t * pQueue; // Propagation queue.
int nVars; // the current number of variables
int nVarsAlloc; // the maximum allowed number of variables
int * pAssigns; // The current assignments (literals or MSAT_VAR_UNKOWN)
int * pModel; // The satisfying assignment
Msat_IntVec_t * vTrail; // List of assignments made.
Msat_IntVec_t * vTrailLim; // Separator indices for different decision levels in 'trail'.
Msat_Clause_t ** pReasons; // 'reason[var]' is the clause that implied the variables current value, or 'NULL' if none.
int * pLevel; // 'level[var]' is the decision level at which assignment was made.
int nLevelRoot; // Level of first proper decision.
double dRandSeed; // For the internal random number generator (makes solver deterministic over different platforms).
int fVerbose; // the verbosity flag
double dProgress; // Set by 'search()'.
// the variable cone and variable connectivity
Msat_IntVec_t * vConeVars;
Msat_IntVec_t * vVarsUsed;
Msat_ClauseVec_t * vAdjacents;
// internal data used during conflict analysis
int * pSeen; // time when a lit was seen for the last time
int nSeenId; // the id of current seeing
Msat_IntVec_t * vReason; // the temporary array of literals
Msat_IntVec_t * vTemp; // the temporary array of literals
int * pFreq; // the number of times each var participated in conflicts
// the memory manager
Msat_MmStep_t * pMem;
// statistics
Msat_SolverStats_t Stats;
int nTwoLits;
int nTwoLitsL;
int nClausesInit;
int nClausesAlloc;
int nClausesAllocL;
int nBackTracks;
};
struct Msat_ClauseVec_t_
{
Msat_Clause_t ** pArray;
int nSize;
int nCap;
};
struct Msat_IntVec_t_
{
int * pArray;
int nSize;
int nCap;
};
////////////////////////////////////////////////////////////////////////
/// GLOBAL VARIABLES ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
/*=== satActivity.c ===========================================================*/
extern void Msat_SolverVarDecayActivity( Msat_Solver_t * p );
extern void Msat_SolverVarRescaleActivity( Msat_Solver_t * p );
extern void Msat_SolverClaDecayActivity( Msat_Solver_t * p );
extern void Msat_SolverClaRescaleActivity( Msat_Solver_t * p );
/*=== satSolverApi.c ===========================================================*/
extern Msat_Clause_t * Msat_SolverReadClause( Msat_Solver_t * p, int Num );
/*=== satSolver.c ===========================================================*/
extern int Msat_SolverReadDecisionLevel( Msat_Solver_t * p );
extern int * Msat_SolverReadDecisionLevelArray( Msat_Solver_t * p );
extern Msat_Clause_t ** Msat_SolverReadReasonArray( Msat_Solver_t * p );
extern Msat_Type_t Msat_SolverReadVarValue( Msat_Solver_t * p, Msat_Var_t Var );
extern Msat_ClauseVec_t * Msat_SolverReadLearned( Msat_Solver_t * p );
extern Msat_ClauseVec_t ** Msat_SolverReadWatchedArray( Msat_Solver_t * p );
extern int * Msat_SolverReadSeenArray( Msat_Solver_t * p );
extern int Msat_SolverIncrementSeenId( Msat_Solver_t * p );
extern Msat_MmStep_t * Msat_SolverReadMem( Msat_Solver_t * p );
extern void Msat_SolverClausesIncrement( Msat_Solver_t * p );
extern void Msat_SolverClausesDecrement( Msat_Solver_t * p );
extern void Msat_SolverClausesIncrementL( Msat_Solver_t * p );
extern void Msat_SolverClausesDecrementL( Msat_Solver_t * p );
extern void Msat_SolverVarBumpActivity( Msat_Solver_t * p, Msat_Lit_t Lit );
extern void Msat_SolverClaBumpActivity( Msat_Solver_t * p, Msat_Clause_t * pC );
extern int Msat_SolverEnqueue( Msat_Solver_t * p, Msat_Lit_t Lit, Msat_Clause_t * pC );
extern double Msat_SolverProgressEstimate( Msat_Solver_t * p );
/*=== satSolverSearch.c ===========================================================*/
extern int Msat_SolverAssume( Msat_Solver_t * p, Msat_Lit_t Lit );
extern Msat_Clause_t * Msat_SolverPropagate( Msat_Solver_t * p );
extern void Msat_SolverCancelUntil( Msat_Solver_t * p, int Level );
extern Msat_Type_t Msat_SolverSearch( Msat_Solver_t * p, int nConfLimit, int nLearnedLimit, int nBackTrackLimit, Msat_SearchParams_t * pPars );
/*=== satQueue.c ===========================================================*/
extern Msat_Queue_t * Msat_QueueAlloc( int nVars );
extern void Msat_QueueFree( Msat_Queue_t * p );
extern int Msat_QueueReadSize( Msat_Queue_t * p );
extern void Msat_QueueInsert( Msat_Queue_t * p, int Lit );
extern int Msat_QueueExtract( Msat_Queue_t * p );
extern void Msat_QueueClear( Msat_Queue_t * p );
/*=== satOrder.c ===========================================================*/
extern Msat_Order_t * Msat_OrderAlloc( Msat_Solver_t * pSat );
extern void Msat_OrderSetBounds( Msat_Order_t * p, int nVarsMax );
extern void Msat_OrderClean( Msat_Order_t * p, Msat_IntVec_t * vCone );
extern int Msat_OrderCheck( Msat_Order_t * p );
extern void Msat_OrderFree( Msat_Order_t * p );
extern int Msat_OrderVarSelect( Msat_Order_t * p );
extern void Msat_OrderVarAssigned( Msat_Order_t * p, int Var );
extern void Msat_OrderVarUnassigned( Msat_Order_t * p, int Var );
extern void Msat_OrderUpdate( Msat_Order_t * p, int Var );
/*=== satClause.c ===========================================================*/
extern int Msat_ClauseCreate( Msat_Solver_t * p, Msat_IntVec_t * vLits, int fLearnt, Msat_Clause_t ** pClause_out );
extern Msat_Clause_t * Msat_ClauseCreateFake( Msat_Solver_t * p, Msat_IntVec_t * vLits );
extern Msat_Clause_t * Msat_ClauseCreateFakeLit( Msat_Solver_t * p, Msat_Lit_t Lit );
extern int Msat_ClauseReadLearned( Msat_Clause_t * pC );
extern int Msat_ClauseReadSize( Msat_Clause_t * pC );
extern int * Msat_ClauseReadLits( Msat_Clause_t * pC );
extern int Msat_ClauseReadMark( Msat_Clause_t * pC );
extern void Msat_ClauseSetMark( Msat_Clause_t * pC, int fMark );
extern int Msat_ClauseReadNum( Msat_Clause_t * pC );
extern void Msat_ClauseSetNum( Msat_Clause_t * pC, int Num );
extern int Msat_ClauseReadTypeA( Msat_Clause_t * pC );
extern void Msat_ClauseSetTypeA( Msat_Clause_t * pC, int fTypeA );
extern int Msat_ClauseIsLocked( Msat_Solver_t * p, Msat_Clause_t * pC );
extern float Msat_ClauseReadActivity( Msat_Clause_t * pC );
extern void Msat_ClauseWriteActivity( Msat_Clause_t * pC, float Num );
extern void Msat_ClauseFree( Msat_Solver_t * p, Msat_Clause_t * pC, int fRemoveWatched );
extern int Msat_ClausePropagate( Msat_Clause_t * pC, Msat_Lit_t Lit, int * pAssigns, Msat_Lit_t * pLit_out );
extern int Msat_ClauseSimplify( Msat_Clause_t * pC, int * pAssigns );
extern void Msat_ClauseCalcReason( Msat_Solver_t * p, Msat_Clause_t * pC, Msat_Lit_t Lit, Msat_IntVec_t * vLits_out );
extern void Msat_ClauseRemoveWatch( Msat_ClauseVec_t * vClauses, Msat_Clause_t * pC );
extern void Msat_ClausePrint( Msat_Clause_t * pC );
extern void Msat_ClausePrintSymbols( Msat_Clause_t * pC );
extern void Msat_ClauseWriteDimacs( FILE * pFile, Msat_Clause_t * pC, int fIncrement );
extern unsigned Msat_ClauseComputeTruth( Msat_Solver_t * p, Msat_Clause_t * pC );
/*=== satSort.c ===========================================================*/
extern void Msat_SolverSortDB( Msat_Solver_t * p );
/*=== satClauseVec.c ===========================================================*/
extern Msat_ClauseVec_t * Msat_ClauseVecAlloc( int nCap );
extern void Msat_ClauseVecFree( Msat_ClauseVec_t * p );
extern Msat_Clause_t ** Msat_ClauseVecReadArray( Msat_ClauseVec_t * p );
extern int Msat_ClauseVecReadSize( Msat_ClauseVec_t * p );
extern void Msat_ClauseVecGrow( Msat_ClauseVec_t * p, int nCapMin );
extern void Msat_ClauseVecShrink( Msat_ClauseVec_t * p, int nSizeNew );
extern void Msat_ClauseVecClear( Msat_ClauseVec_t * p );
extern void Msat_ClauseVecPush( Msat_ClauseVec_t * p, Msat_Clause_t * Entry );
extern Msat_Clause_t * Msat_ClauseVecPop( Msat_ClauseVec_t * p );
extern void Msat_ClauseVecWriteEntry( Msat_ClauseVec_t * p, int i, Msat_Clause_t * Entry );
extern Msat_Clause_t * Msat_ClauseVecReadEntry( Msat_ClauseVec_t * p, int i );
/*=== satMem.c ===========================================================*/
// fixed-size-block memory manager
extern Msat_MmFixed_t * Msat_MmFixedStart( int nEntrySize );
extern void Msat_MmFixedStop( Msat_MmFixed_t * p, int fVerbose );
extern char * Msat_MmFixedEntryFetch( Msat_MmFixed_t * p );
extern void Msat_MmFixedEntryRecycle( Msat_MmFixed_t * p, char * pEntry );
extern void Msat_MmFixedRestart( Msat_MmFixed_t * p );
extern int Msat_MmFixedReadMemUsage( Msat_MmFixed_t * p );
// flexible-size-block memory manager
extern Msat_MmFlex_t * Msat_MmFlexStart();
extern void Msat_MmFlexStop( Msat_MmFlex_t * p, int fVerbose );
extern char * Msat_MmFlexEntryFetch( Msat_MmFlex_t * p, int nBytes );
extern int Msat_MmFlexReadMemUsage( Msat_MmFlex_t * p );
// hierarchical memory manager
extern Msat_MmStep_t * Msat_MmStepStart( int nSteps );
extern void Msat_MmStepStop( Msat_MmStep_t * p, int fVerbose );
extern char * Msat_MmStepEntryFetch( Msat_MmStep_t * p, int nBytes );
extern void Msat_MmStepEntryRecycle( Msat_MmStep_t * p, char * pEntry, int nBytes );
extern int Msat_MmStepReadMemUsage( Msat_MmStep_t * p );
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_HEADER_END
#endif