summaryrefslogtreecommitdiffstats
path: root/src/sat/bsat/satSolver2.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/sat/bsat/satSolver2.h')
-rw-r--r--src/sat/bsat/satSolver2.h186
1 files changed, 110 insertions, 76 deletions
diff --git a/src/sat/bsat/satSolver2.h b/src/sat/bsat/satSolver2.h
index c64a4213..1cdc8bd9 100644
--- a/src/sat/bsat/satSolver2.h
+++ b/src/sat/bsat/satSolver2.h
@@ -41,39 +41,41 @@ struct sat_solver2_t;
typedef struct sat_solver2_t sat_solver2;
extern sat_solver2* sat_solver2_new(void);
-extern void sat_solver2_delete(sat_solver2* s);
+extern void sat_solver2_delete(sat_solver2* s);
-extern int sat_solver2_addclause(sat_solver2* s, lit* begin, lit* end);
-extern int sat_solver2_simplify(sat_solver2* s);
-extern int sat_solver2_solve(sat_solver2* s, lit* begin, lit* end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal);
+extern int sat_solver2_addclause(sat_solver2* s, lit* begin, lit* end);
+extern int sat_solver2_simplify(sat_solver2* s);
+extern int sat_solver2_solve(sat_solver2* s, lit* begin, lit* end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal);
-extern void sat_solver2_setnvars(sat_solver2* s,int n);
+extern void sat_solver2_setnvars(sat_solver2* s,int n);
-extern void Sat_Solver2WriteDimacs( sat_solver2 * p, char * pFileName, lit* assumptionsBegin, lit* assumptionsEnd, int incrementVars );
-extern void Sat_Solver2PrintStats( FILE * pFile, sat_solver2 * p );
-extern int * Sat_Solver2GetModel( sat_solver2 * p, int * pVars, int nVars );
-extern void Sat_Solver2DoubleClauses( sat_solver2 * p, int iVar );
+extern void Sat_Solver2WriteDimacs( sat_solver2 * p, char * pFileName, lit* assumptionsBegin, lit* assumptionsEnd, int incrementVars );
+extern void Sat_Solver2PrintStats( FILE * pFile, sat_solver2 * p );
+extern int * Sat_Solver2GetModel( sat_solver2 * p, int * pVars, int nVars );
+extern void Sat_Solver2DoubleClauses( sat_solver2 * p, int iVar );
// trace recording
-extern void sat_solver2TraceStart( sat_solver2 * pSat, char * pName );
-extern void sat_solver2TraceStop( sat_solver2 * pSat );
-extern void sat_solver2TraceWrite( sat_solver2 * pSat, int * pBeg, int * pEnd, int fRoot );
+extern void sat_solver2TraceStart( sat_solver2 * pSat, char * pName );
+extern void sat_solver2TraceStop( sat_solver2 * pSat );
+extern void sat_solver2TraceWrite( sat_solver2 * pSat, int * pBeg, int * pEnd, int fRoot );
// clause storage
-extern void sat_solver2_store_alloc( sat_solver2 * s );
-extern void sat_solver2_store_write( sat_solver2 * s, char * pFileName );
-extern void sat_solver2_store_free( sat_solver2 * s );
-extern void sat_solver2_store_mark_roots( sat_solver2 * s );
-extern void sat_solver2_store_mark_clauses_a( sat_solver2 * s );
-extern void * sat_solver2_store_release( sat_solver2 * s );
+extern void sat_solver2_store_alloc( sat_solver2 * s );
+extern void sat_solver2_store_write( sat_solver2 * s, char * pFileName );
+extern void sat_solver2_store_free( sat_solver2 * s );
+extern void sat_solver2_store_mark_roots( sat_solver2 * s );
+extern void sat_solver2_store_mark_clauses_a( sat_solver2 * s );
+extern void * sat_solver2_store_release( sat_solver2 * s );
// global variables
-extern int var_is_global (sat_solver2* s, int v);
-extern void var_set_global(sat_solver2* s, int v, int glo);
+extern int var_is_global (sat_solver2* s, int v);
+extern void var_set_global(sat_solver2* s, int v, int glo);
// clause grouping (these two only work after creating a clause before the solver is called)
-extern int clause_is_partA (sat_solver2* s, int cid);
-extern void clause_set_partA(sat_solver2* s, int cid, int partA);
-
+extern int clause_is_partA (sat_solver2* s, int handle);
+extern void clause_set_partA(sat_solver2* s, int handle, int partA);
+// other clause functions
+extern int clause_id(sat_solver2* s, int h);
+
//=================================================================================================
// Solver representation:
@@ -83,75 +85,105 @@ typedef struct varinfo_t varinfo;
struct sat_solver2_t
{
- int size; // nof variables
- int cap; // size of varmaps
- int qhead; // Head index of queue.
- int qtail; // Tail index of queue.
-
- int root_level; // Level of first proper decision.
- int simpdb_assigns;// Number of top-level assignments at last 'simplifyDB()'.
- int simpdb_props; // Number of propagations before next 'simplifyDB()'.
- double random_seed;
- double progress_estimate;
- int verbosity; // Verbosity level. 0=silent, 1=some progress report, 2=everything
- int fNotUseRandom; // do not allow random decisions with a fixed probability
-// int fSkipSimplify; // set to one to skip simplification of the clause database
- int fProofLogging; // enable proof-logging
+ int size; // nof variables
+ int cap; // size of varmaps
+ int qhead; // Head index of queue.
+ int qtail; // Tail index of queue.
+
+ int root_level; // Level of first proper decision.
+ int simpdb_assigns; // Number of top-level assignments at last 'simplifyDB()'.
+ int simpdb_props; // Number of propagations before next 'simplifyDB()'.
+ double random_seed;
+ double progress_estimate;
+ int verbosity; // Verbosity level. 0=silent, 1=some progress report, 2=everything
+ int fNotUseRandom; // do not allow random decisions with a fixed probability
+// int fSkipSimplify; // set to one to skip simplification of the clause database
+ int fProofLogging; // enable proof-logging
// clauses
- veci clauses; // clause memory
- veci* wlists; // watcher lists (for each literal)
- int iFirstLearnt; // the first learnt clause
+ veci clauses; // clause memory
+ veci* wlists; // watcher lists (for each literal)
+ int iLearntFirst; // the first learnt clause
+ int iLearntLast; // in proof-logging mode, the ID of the final conflict clause (conf_final)
// activities
#ifdef USE_FLOAT_ACTIVITY
- double var_inc; // Amount to bump next variable with.
- double var_decay; // INVERSE decay factor for variable activity: stores 1/decay.
- float cla_inc; // Amount to bump next clause with.
- float cla_decay; // INVERSE decay factor for clause activity: stores 1/decay.
- double* activity; // A heuristic measurement of the activity of a variable.
+ double var_inc; // Amount to bump next variable with.
+ double var_decay; // INVERSE decay factor for variable activity: stores 1/decay.
+ float cla_inc; // Amount to bump next clause with.
+ float cla_decay; // INVERSE decay factor for clause activity: stores 1/decay.
+ double* activity; // A heuristic measurement of the activity of a variable.
#else
- int var_inc; // Amount to bump next variable with.
- int cla_inc; // Amount to bump next clause with.
- unsigned* activity; // A heuristic measurement of the activity of a variable.
+ int var_inc; // Amount to bump next variable with.
+ int cla_inc; // Amount to bump next clause with.
+ unsigned* activity; // A heuristic measurement of the activity of a variable.
#endif
- veci claActs; // clause activities
- veci claProofs; // clause proofs
+ veci claActs; // clause activities
+ veci claProofs; // clause proofs
// internal state
- varinfo * vi; // variable information
- lit* trail; // sequence of assignment and implications
- int* orderpos; // Index in variable order.
- cla* reasons; // reason clauses
- cla* units; // unit clauses
-
- veci tagged; // (contains: var)
- veci stack; // (contains: var)
- veci order; // Variable order. (heap) (contains: var)
- veci trail_lim; // Separator indices for different decision levels in 'trail'. (contains: int)
- veci temp_clause; // temporary storage for a CNF clause
- veci model; // If problem is solved, this vector contains the model (contains: lbool).
- veci conf_final; // If problem is unsatisfiable (possibly under assumptions),
- // this vector represent the final conflict clause expressed in the assumptions.
- veci mark_levels; // temporary storage for labeled levels
- veci min_lit_order; // ordering of removable literals
- veci min_step_order;// ordering of resolution steps
+ varinfo * vi; // variable information
+ lit* trail; // sequence of assignment and implications
+ int* orderpos; // Index in variable order.
+ cla* reasons; // reason clauses
+ cla* units; // unit clauses
+
+ veci tagged; // (contains: var)
+ veci stack; // (contains: var)
+ veci order; // Variable order. (heap) (contains: var)
+ veci trail_lim; // Separator indices for different decision levels in 'trail'. (contains: int)
+ veci temp_clause; // temporary storage for a CNF clause
+ veci model; // If problem is solved, this vector contains the model (contains: lbool).
+ veci conf_final; // If problem is unsatisfiable (possibly under assumptions),
+ // this vector represent the final conflict clause expressed in the assumptions.
+ veci mark_levels; // temporary storage for labeled levels
+ veci min_lit_order; // ordering of removable literals
+ veci min_step_order; // ordering of resolution steps
+ veci glob_vars; // global variables
// proof logging
- veci proof_clas; // sequence of proof clauses
- veci proof_vars; // sequence of proof variables
- int iStartChain; // temporary variable to remember beginning of the current chain in proof logging
- int fLastConfId; // in proof-logging mode, the ID of the final conflict clause (conf_final)
- int nUnits; // the total number of unit clauses
+ veci proof_clas; // sequence of proof clauses
+ veci proof_vars; // sequence of proof variables
+ int iStartChain; // temporary variable to remember beginning of the current chain in proof logging
+ int nUnits; // the total number of unit clauses
// statistics
- stats_t stats;
- ABC_INT64_T nConfLimit; // external limit on the number of conflicts
- ABC_INT64_T nInsLimit; // external limit on the number of implications
- int nRuntimeLimit; // external limit on runtime
+ stats_t stats;
+ ABC_INT64_T nConfLimit; // external limit on the number of conflicts
+ ABC_INT64_T nInsLimit; // external limit on the number of implications
+ int nRuntimeLimit; // external limit on runtime
+};
+typedef struct satset_t satset;
+struct satset_t
+{
+ unsigned learnt : 1;
+ unsigned mark : 1;
+ unsigned partA : 1;
+ unsigned nEnts : 29;
+ int Id;
+ lit pEnts[0];
};
+static inline satset* satset_read (veci* p, cla h ) { return h ? (satset*)(veci_begin(p) + h) : NULL; }
+static inline cla satset_handle (veci* p, satset* c) { return (cla)((int *)c - veci_begin(p)); }
+static inline int satset_check (veci* p, satset* c) { return (int*)c > veci_begin(p) && (int*)c < veci_begin(p) + veci_size(p); }
+static inline int satset_size (int nLits) { return sizeof(satset)/4 + nLits; }
+static inline void satset_print (satset * c) {
+ int i;
+ printf( "{ " );
+ for ( i = 0; i < (int)c->nEnts; i++ )
+ printf( "%d ", (c->pEnts[i] & 1)? -(c->pEnts[i] >> 1) : c->pEnts[i] >> 1 );
+ printf( "}\n" );
+}
+
+
+#define satset_foreach_entry( p, c, h, s ) \
+ for ( h = s; (h < veci_size(p)) && (((c) = satset_read(p, h)), 1); h += satset_size(c->nEnts) )
+
+//=================================================================================================
+// Public APIs:
+
static inline int sat_solver2_nvars(sat_solver2* s)
{
return s->size;
@@ -213,6 +245,8 @@ static inline int sat_solver2_set_random(sat_solver2* s, int fNotUseRandom)
return fNotUseRandomOld;
}
+extern void Sat_ProofTest( veci * pClauses, veci * pProof, veci * pVars, veci * pRoots, int hRoot, veci * pGlobVars );
+
ABC_NAMESPACE_HEADER_END
#endif