summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sat/bsat/satProof.c24
-rw-r--r--src/sat/bsat/satSolver2.c262
-rw-r--r--src/sat/bsat/satSolver2.h13
3 files changed, 218 insertions, 81 deletions
diff --git a/src/sat/bsat/satProof.c b/src/sat/bsat/satProof.c
index d51df229..337fe3ca 100644
--- a/src/sat/bsat/satProof.c
+++ b/src/sat/bsat/satProof.c
@@ -215,7 +215,7 @@ void Proof_CleanCollected( Vec_Int_t * vProof, Vec_Int_t * vUsed )
SeeAlso []
***********************************************************************/
-void Proof_CollectUsed_iter( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed, Vec_Int_t * vStack )
+void Proof_CollectUsed_iter( Vec_Int_t * vProof, satset * pNode, Vec_Int_t * vUsed, Vec_Int_t * vStack )
{
satset * pNext;
int i, hNode;
@@ -223,7 +223,7 @@ void Proof_CollectUsed_iter( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed, V
return;
// start with node
pNode->Id = 1;
- Vec_IntPush( vStack, Proof_NodeHandle(p, pNode) << 1 );
+ Vec_IntPush( vStack, Proof_NodeHandle(vProof, pNode) << 1 );
// perform DFS search
while ( Vec_IntSize(vStack) )
{
@@ -236,12 +236,12 @@ void Proof_CollectUsed_iter( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed, V
// extracted first time
Vec_IntPush( vStack, hNode ^ 1 ); // add second time
// add its anticedents ;
- pNode = Proof_NodeRead( p, hNode >> 1 );
- Proof_NodeForeachFanin( p, pNode, pNext, i )
+ pNode = Proof_NodeRead( vProof, hNode >> 1 );
+ Proof_NodeForeachFanin( vProof, pNode, pNext, i )
if ( pNext && !pNext->Id )
{
pNext->Id = 1;
- Vec_IntPush( vStack, Proof_NodeHandle(p, pNext) << 1 ); // add first time
+ Vec_IntPush( vStack, Proof_NodeHandle(vProof, pNext) << 1 ); // add first time
}
}
}
@@ -314,17 +314,17 @@ Vec_Int_t * Proof_CollectUsedIter( Vec_Int_t * vProof, Vec_Int_t * vRoots, int h
SeeAlso []
***********************************************************************/
-void Proof_CollectUsed_rec( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed )
+void Proof_CollectUsed_rec( Vec_Int_t * vProof, satset * pNode, Vec_Int_t * vUsed )
{
satset * pNext;
int i;
if ( pNode->Id )
return;
pNode->Id = 1;
- Proof_NodeForeachFanin( p, pNode, pNext, i )
+ Proof_NodeForeachFanin( vProof, pNode, pNext, i )
if ( pNext && !pNext->Id )
- Proof_CollectUsed_rec( p, pNext, vUsed );
- Vec_IntPush( vUsed, Proof_NodeHandle(p, pNode) );
+ Proof_CollectUsed_rec( vProof, pNext, vUsed );
+ Vec_IntPush( vUsed, Proof_NodeHandle(vProof, pNode) );
}
/**Function*************************************************************
@@ -637,7 +637,7 @@ void Sat_ProofCheck( sat_solver2 * s )
{
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
- int hRoot = veci_begin(&s->claProofs)[satset_read(&s->clauses, s->hLearntLast)->Id];
+ int hRoot = veci_begin(&s->claProofs)[satset_read(&s->learnts, s->hLearntLast>>1)->Id];
Rec_Int_t * vResolves;
Vec_Int_t * vUsed, * vTemp;
@@ -731,7 +731,7 @@ void * Sat_ProofInterpolant( sat_solver2 * s, void * pGloVars )
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
Vec_Int_t * vGlobVars = (Vec_Int_t *)pGloVars;
- int hRoot = veci_begin(&s->claProofs)[satset_read(&s->clauses, s->hLearntLast)->Id];
+ int hRoot = veci_begin(&s->claProofs)[satset_read(&s->learnts, s->hLearntLast>>1)->Id];
Vec_Int_t * vUsed, * vCore, * vCoreNums, * vVarMap;
satset * pNode, * pFanin;
@@ -822,7 +822,7 @@ void * Sat_ProofCore( sat_solver2 * s )
{
Vec_Int_t * vClauses = (Vec_Int_t *)&s->clauses;
Vec_Int_t * vProof = (Vec_Int_t *)&s->proofs;
- int hRoot = veci_begin(&s->claProofs)[satset_read(&s->clauses, s->hLearntLast)->Id];
+ int hRoot = veci_begin(&s->claProofs)[satset_read(&s->learnts, s->hLearntLast>>1)->Id];
Vec_Int_t * vCore, * vUsed;
// collect visited clauses
diff --git a/src/sat/bsat/satSolver2.c b/src/sat/bsat/satSolver2.c
index bf616a10..2807e4c0 100644
--- a/src/sat/bsat/satSolver2.c
+++ b/src/sat/bsat/satSolver2.c
@@ -141,17 +141,20 @@ static inline void solver2_clear_marks(sat_solver2* s) {
//=================================================================================================
// Clause datatype + minor functions:
-static inline satset* clause_read (sat_solver2* s, cla h) { return satset_read( &s->clauses, h ); }
-static inline cla clause_handle (sat_solver2* s, satset* c) { return satset_handle( &s->clauses, c ); }
-static inline int clause_check (sat_solver2* s, satset* c) { return satset_check( &s->clauses, c ); }
-static inline int clause_proofid(sat_solver2* s, satset* c, int partA) { return c->learnt ? (veci_begin(&s->claProofs)[c->Id]<<2) | (partA<<1) : (clause_handle(s,c)<<2) | 1; }
+static inline satset* clause_read (sat_solver2* s, cla h) { return (h & 1) ? satset_read(&s->learnts, h>>1) : satset_read(&s->clauses, h>>1); }
+static inline cla clause_handle (sat_solver2* s, satset* c) { return c->learnt ? (satset_handle(&s->learnts, c)<<1)|1: satset_handle(&s->clauses, c)<<1; }
+static inline int clause_check (sat_solver2* s, satset* c) { return c->learnt ? satset_check(&s->learnts, c) : satset_check(&s->clauses, c); }
+static inline int clause_proofid(sat_solver2* s, satset* c, int partA) { return c->learnt ? (veci_begin(&s->claProofs)[c->Id]<<2) | (partA<<1) : (satset_handle(&s->clauses, c)<<2) | 1; }
+static inline int clause_is_used(sat_solver2* s, cla h) { return (h & 1) ? (h >> 1) < s->hLearntPivot : (h >> 1) < s->hClausePivot; }
+
+
//static inline int var_reason (sat_solver2* s, int v) { return (s->reasons[v]&1) ? 0 : s->reasons[v] >> 1; }
//static inline int lit_reason (sat_solver2* s, int l) { return (s->reasons[lit_var(l)&1]) ? 0 : s->reasons[lit_var(l)] >> 1; }
//static inline satset* var_unit_clause(sat_solver2* s, int v) { return (s->reasons[v]&1) ? clause_read(s, s->reasons[v] >> 1) : NULL; }
//static inline void var_set_unit_clause(sat_solver2* s, int v, cla i){ assert(i && !s->reasons[v]); s->reasons[v] = (i << 1) | 1; }
-static inline int var_reason (sat_solver2* s, int v) { return s->reasons[v]; }
-static inline int lit_reason (sat_solver2* s, int l) { return s->reasons[lit_var(l)]; }
+static inline int var_reason (sat_solver2* s, int v) { return s->reasons[v]; }
+static inline int lit_reason (sat_solver2* s, int l) { return s->reasons[lit_var(l)]; }
static inline satset* var_unit_clause(sat_solver2* s, int v) { return clause_read(s, s->units[v]); }
static inline void var_set_unit_clause(sat_solver2* s, int v, cla i){ assert(v >= 0 && v < s->size && !s->units[v]); s->units[v] = i; s->nUnits++; }
@@ -161,7 +164,7 @@ void clause_set_partA(sat_solver2* s, int h, int partA) { clause_read(s
int clause_id(sat_solver2* s, int h) { return clause_read(s, h)->Id; }
#define sat_solver_foreach_clause( s, c, h ) satset_foreach_entry( &s->clauses, c, h, 1 )
-#define sat_solver_foreach_learnt( s, c, h ) satset_foreach_entry( &s->clauses, c, h, s->hLearntFirst )
+#define sat_solver_foreach_learnt( s, c, h ) satset_foreach_entry( &s->learnts, c, h, 1 )
//=================================================================================================
// Simple helpers:
@@ -377,26 +380,27 @@ static int clause_create_new(sat_solver2* s, lit* begin, lit* end, int learnt, i
assert(nLits < 1 || lit_var(begin[0]) < s->size);
assert(nLits < 2 || lit_var(begin[1]) < s->size);
// add memory if needed
- if ( veci_size(&s->clauses) + satset_size(nLits) > s->clauses.cap )
- {
- int nMemAlloc = s->clauses.cap ? 2 * s->clauses.cap : (1 << 20);
- s->clauses.ptr = ABC_REALLOC( int, veci_begin(&s->clauses), nMemAlloc );
-// memset( veci_begin(&s->clauses) + s->clauses.cap, 0, sizeof(int) * (nMemAlloc - s->clauses.cap) );
-// printf( "Reallocing from %d to %d...\n", s->clauses.cap, nMemAlloc );
- s->clauses.cap = nMemAlloc;
- if ( veci_size(&s->clauses) == 0 )
- veci_push( &s->clauses, -1 );
- }
- // create clause
- c = (satset*)(veci_begin(&s->clauses) + veci_size(&s->clauses));
- ((int*)c)[0] = 0;
- c->learnt = learnt;
- c->nEnts = nLits;
- for (i = 0; i < nLits; i++)
- c->pEnts[i] = begin[i];
+
// assign clause ID
if ( learnt )
{
+ if ( veci_size(&s->learnts) + satset_size(nLits) > s->learnts.cap )
+ {
+ int nMemAlloc = s->learnts.cap ? 2 * s->learnts.cap : (1 << 20);
+ s->learnts.ptr = ABC_REALLOC( int, veci_begin(&s->learnts), nMemAlloc );
+ // printf( "Reallocing from %d to %d...\n", s->learnts.cap, nMemAlloc );
+ s->learnts.cap = nMemAlloc;
+ if ( veci_size(&s->learnts) == 0 )
+ veci_push( &s->learnts, -1 );
+ }
+ // create clause
+ c = (satset*)(veci_begin(&s->learnts) + veci_size(&s->learnts));
+ ((int*)c)[0] = 0;
+ c->learnt = learnt;
+ c->nEnts = nLits;
+ for (i = 0; i < nLits; i++)
+ c->pEnts[i] = begin[i];
+ // count the clause
s->stats.learnts++;
s->stats.learnts_literals += nLits;
c->Id = s->stats.learnts;
@@ -406,28 +410,44 @@ static int clause_create_new(sat_solver2* s, lit* begin, lit* end, int learnt, i
veci_push(&s->claProofs, proof_id);
if ( nLits > 2 )
act_clause_bump( s,c );
-
+ // extend storage
+ Cid = (veci_size(&s->learnts) << 1) | 1;
+ s->learnts.size += satset_size(nLits);
+ assert( veci_size(&s->learnts) <= s->learnts.cap );
+ assert(((ABC_PTRUINT_T)c & 3) == 0);
// printf( "Clause for proof %d: ", proof_id );
// satset_print( c );
}
else
{
+ if ( veci_size(&s->clauses) + satset_size(nLits) > s->clauses.cap )
+ {
+ int nMemAlloc = s->clauses.cap ? 2 * s->clauses.cap : (1 << 20);
+ s->clauses.ptr = ABC_REALLOC( int, veci_begin(&s->clauses), nMemAlloc );
+ // printf( "Reallocing from %d to %d...\n", s->clauses.cap, nMemAlloc );
+ s->clauses.cap = nMemAlloc;
+ if ( veci_size(&s->clauses) == 0 )
+ veci_push( &s->clauses, -1 );
+ }
+ // create clause
+ c = (satset*)(veci_begin(&s->clauses) + veci_size(&s->clauses));
+ ((int*)c)[0] = 0;
+ c->learnt = learnt;
+ c->nEnts = nLits;
+ for (i = 0; i < nLits; i++)
+ c->pEnts[i] = begin[i];
+ // count the clause
s->stats.clauses++;
s->stats.clauses_literals += nLits;
c->Id = s->stats.clauses;
+ // extend storage
+ Cid = (veci_size(&s->clauses) << 1);
+ s->clauses.size += satset_size(nLits);
+ assert( veci_size(&s->clauses) <= s->clauses.cap );
+ assert(((ABC_PTRUINT_T)c & 3) == 0);
+ // remember the last one
+ s->hLearntLast = Cid;
}
-
- // extend storage
- Cid = veci_size(&s->clauses);
- s->clauses.size += satset_size(nLits);
- assert( veci_size(&s->clauses) <= s->clauses.cap );
- assert(((ABC_PTRUINT_T)c & 3) == 0);
-
- // remember the last one and first learnt
- s->hLearntLast = Cid;
- if ( learnt && s->hLearntFirst == -1 )
- s->hLearntFirst = Cid;
-
// watch the clause
if ( nLits > 1 ){
veci_push(solver2_wlist(s,lit_neg(begin[0])),Cid);
@@ -439,7 +459,7 @@ static int clause_create_new(sat_solver2* s, lit* begin, lit* end, int learnt, i
//=================================================================================================
// Minor (solver) functions:
-static inline int solver2_enqueue(sat_solver2* s, lit l, int from)
+static inline int solver2_enqueue(sat_solver2* s, lit l, cla from)
{
int v = lit_var(l);
#ifdef VERBOSEDEBUG
@@ -507,7 +527,7 @@ static void solver2_record(sat_solver2* s, veci* cls, int proof_id)
{
lit* begin = veci_begin(cls);
lit* end = begin + veci_size(cls);
- int Cid = clause_create_new(s,begin,end,1, proof_id);
+ cla Cid = clause_create_new(s,begin,end,1, proof_id);
assert(veci_size(cls) > 0);
if ( veci_size(cls) == 1 )
{
@@ -1195,38 +1215,50 @@ sat_solver2* sat_solver2_new(void)
veci_new(&s->min_lit_order);
veci_new(&s->min_step_order);
veci_new(&s->learnt_live);
- veci_new(&s->proofs); veci_push(&s->proofs, -1);
- veci_new(&s->claActs); veci_push(&s->claActs, -1);
- veci_new(&s->claProofs); veci_push(&s->claProofs, -1);
+ veci_new(&s->claActs); veci_push(&s->claActs, -1);
+ veci_new(&s->claProofs); veci_push(&s->claProofs, -1);
- // initialize other
- s->hLearntFirst = -1; // the first learnt clause
- s->hLearntLast = -1; // the last learnt clause
#ifdef USE_FLOAT_ACTIVITY2
- s->var_inc = 1;
- s->cla_inc = 1;
- s->var_decay = (float)(1 / 0.95 );
- s->cla_decay = (float)(1 / 0.999 );
-// s->cla_decay = 1;
-// s->var_decay = 1;
+ s->var_inc = 1;
+ s->cla_inc = 1;
+ s->var_decay = (float)(1 / 0.95 );
+ s->cla_decay = (float)(1 / 0.999 );
+// s->cla_decay = 1;
+// s->var_decay = 1;
#else
- s->var_inc = (1 << 5);
- s->cla_inc = (1 << 11);
+ s->var_inc = (1 << 5);
+ s->cla_inc = (1 << 11);
#endif
- s->random_seed = 91648253;
+ s->random_seed = 91648253;
#ifdef SAT_USE_PROOF_LOGGING
- s->fProofLogging = 1;
+ s->fProofLogging = 1;
#else
- s->fProofLogging = 0;
+ s->fProofLogging = 0;
#endif
- // prealloc some arrays
+ // prealloc clause
+ assert( !s->clauses.ptr );
+ s->clauses.cap = (1 << 20);
+ s->clauses.ptr = ABC_ALLOC( int, s->clauses.cap );
+ veci_push(&s->clauses, -1);
+ // prealloc learnt
+ assert( !s->learnts.ptr );
+ s->learnts.cap = (1 << 20);
+ s->learnts.ptr = ABC_ALLOC( int, s->learnts.cap );
+ veci_push(&s->learnts, -1);
+ // prealloc proofs
if ( s->fProofLogging )
{
+ assert( !s->proofs.ptr );
s->proofs.cap = (1 << 20);
- s->proofs.ptr = ABC_REALLOC( int, s->proofs.ptr, s->proofs.cap );
+ s->proofs.ptr = ABC_ALLOC( int, s->proofs.cap );
+ veci_push(&s->proofs, -1);
}
+ // initialize clause pointers
+ s->hClausePivot = 1;
+ s->hLearntPivot = 1;
+ s->hLearntLast = -1; // the last learnt clause
return s;
}
@@ -1254,8 +1286,12 @@ void sat_solver2_setnvars(sat_solver2* s,int n)
}
for (var = s->size; var < n; var++){
- veci_new(&s->wlists[2*var]);
- veci_new(&s->wlists[2*var+1]);
+ assert(!s->wlists[2*var].size);
+ assert(!s->wlists[2*var+1].size);
+ if ( s->wlists[2*var].ptr == NULL )
+ veci_new(&s->wlists[2*var]);
+ if ( s->wlists[2*var+1].ptr == NULL )
+ veci_new(&s->wlists[2*var+1]);
*((int*)s->vi + var) = 0; s->vi[var].val = varX;
s->orderpos[var] = veci_size(&s->order);
s->reasons [var] = 0;
@@ -1304,6 +1340,7 @@ void sat_solver2_delete(sat_solver2* s)
veci_delete(&s->claActs);
veci_delete(&s->claProofs);
veci_delete(&s->clauses);
+ veci_delete(&s->learnts);
// delete arrays
if (s->vi != 0){
@@ -1460,15 +1497,17 @@ void solver2_reducedb(sat_solver2* s)
veci_size(&s->learnt_live), s->stats.learnts, 100.0 * veci_size(&s->learnt_live) / s->stats.learnts );
// remap clause proofs and clauses
- hHandle = s->hLearntFirst;
- pArray = veci_begin(&s->claProofs);
+ hHandle = 1;
+ pArray = s->fProofLogging ? veci_begin(&s->claProofs) : NULL;
pArray2 = veci_begin(&s->claActs);
- satset_foreach_entry_vec( &s->learnt_live, &s->clauses, c, i )
+ satset_foreach_entry_vec( &s->learnt_live, &s->learnts, c, i )
{
+ if ( pArray )
pArray[i+1] = pArray[c->Id];
pArray2[i+1] = pArray2[c->Id];
c->Id = hHandle; hHandle += satset_size(c->nEnts);
}
+ if ( s->fProofLogging )
veci_resize(&s->claProofs,veci_size(&s->learnt_live)+1);
veci_resize(&s->claActs,veci_size(&s->learnt_live)+1);
@@ -1477,33 +1516,120 @@ void solver2_reducedb(sat_solver2* s)
{
pArray = veci_begin(&s->wlists[i]);
for ( j = k = 0; k < veci_size(&s->wlists[i]); k++ )
- if ( pArray[k] < s->hLearntFirst )
+ if ( pArray[k] & 1 )
pArray[j++] = pArray[k];
else if ( !(c = clause_read(s, pArray[k]))->mark )
pArray[j++] = c->Id;
veci_resize(&s->wlists[i],j);
}
// compact units
+ if ( s->fProofLogging )
for ( i = 0; i < s->size; i++ )
- if ( s->units[i] >= s->hLearntFirst )
+ if ( s->units[i] && (s->units[i] & 1) )
s->units[i] = clause_read(s, s->units[i])->Id;
// compact clauses
- satset_foreach_entry_vec( &s->learnt_live, &s->clauses, c, i )
+ satset_foreach_entry_vec( &s->learnt_live, &s->learnts, c, i )
{
hTemp = c->Id; c->Id = i + 1;
- memmove( veci_begin(&s->clauses) + hTemp, c, sizeof(int)*satset_size(c->nEnts) );
+ memmove( veci_begin(&s->learnts) + hTemp, c, sizeof(int)*satset_size(c->nEnts) );
}
assert( hHandle == hTemp + satset_size(c->nEnts) );
- veci_resize(&s->clauses,hHandle);
+ veci_resize(&s->learnts,hHandle);
s->stats.learnts = veci_size(&s->learnt_live);
// compact proof (compacts 'proofs' and update 'claProofs')
+ if ( s->fProofLogging )
Sat_ProofReduce( s );
TimeTotal += clock() - clk;
Abc_PrintTime( 1, "Time", TimeTotal );
}
+// reverses to the previously bookmarked point
+void sat_solver2_rollback( sat_solver2* s )
+{
+ int i, k, j;
+ assert( s->hClausePivot >= 1 && s->hClausePivot <= veci_size(&s->clauses) );
+ assert( s->hLearntPivot >= 1 && s->hLearntPivot <= veci_size(&s->clauses) );
+ assert( s->iVarPivot >= 0 && s->iVarPivot <= s->size );
+ veci_resize(&s->order, 0);
+ if ( s->hClausePivot > 1 || s->hLearntPivot > 1 )
+ {
+ // update order
+ for ( i = 0; i < s->iVarPivot; i++ )
+ {
+ if ( var_value(s, i) != varX )
+ continue;
+ s->orderpos[i] = veci_size(&s->order);
+ veci_push(&s->order,i);
+ order_update(s, i);
+ }
+ // compact watches
+ for ( i = 0; i < s->size*2; i++ )
+ {
+ cla* pArray = veci_begin(&s->wlists[i]);
+ for ( j = k = 0; k < veci_size(&s->wlists[i]); k++ )
+ if ( clause_is_used(s, pArray[k]) )
+ pArray[j++] = pArray[k];
+ veci_resize(&s->wlists[i],j);
+ }
+ // compact units
+ if ( s->fProofLogging )
+ for ( i = 0; i < s->size; i++ )
+ if ( s->units[i] && !clause_is_used(s, s->units[i]) )
+ s->units[i] = 0;
+ }
+ // reset
+ if ( s->hLearntPivot < veci_size(&s->learnts) )
+ {
+ satset* first = satset_read(&s->learnts, s->hLearntPivot);
+ veci_resize(&s->claActs, first->Id);
+ if ( s->fProofLogging ) {
+ veci_resize(&s->claProofs, first->Id);
+ Sat_ProofReduce( s );
+ }
+ }
+ veci_resize(&s->clauses, s->hClausePivot);
+ veci_resize(&s->learnts, s->hLearntPivot);
+ for ( i = s->iVarPivot; i < s->size*2; i++ )
+ s->wlists[i].size = 0;
+ s->size = s->iVarPivot;
+ // initialize other vars
+ if ( s->size == 0 )
+ {
+ // s->size = 0;
+ // s->cap = 0;
+ s->qhead = 0;
+ s->qtail = 0;
+#ifdef USE_FLOAT_ACTIVITY
+ s->var_inc = 1;
+ s->cla_inc = 1;
+ s->var_decay = (float)(1 / 0.95 );
+ s->cla_decay = (float)(1 / 0.999 );
+#else
+ s->var_inc = (1 << 5);
+ s->cla_inc = (1 << 11);
+#endif
+ s->root_level = 0;
+ s->simpdb_assigns = 0;
+ s->simpdb_props = 0;
+ s->random_seed = 91648253;
+ s->progress_estimate = 0;
+ s->verbosity = 0;
+
+ s->stats.starts = 0;
+ s->stats.decisions = 0;
+ s->stats.propagations = 0;
+ s->stats.inspects = 0;
+ s->stats.conflicts = 0;
+ s->stats.clauses = 0;
+ s->stats.clauses_literals = 0;
+ s->stats.learnts = 0;
+ s->stats.learnts_literals = 0;
+ s->stats.tot_literals = 0;
+ }
+}
+
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)
{
int restart_iter = 0;
diff --git a/src/sat/bsat/satSolver2.h b/src/sat/bsat/satSolver2.h
index 8738abdf..063b6376 100644
--- a/src/sat/bsat/satSolver2.h
+++ b/src/sat/bsat/satSolver2.h
@@ -46,6 +46,7 @@ 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 void sat_solver2_rollback(sat_solver2* s);
extern void sat_solver2_setnvars(sat_solver2* s,int n);
@@ -112,9 +113,12 @@ struct sat_solver2_t
// clauses
veci clauses; // clause memory
+ veci learnts; // learnt memory
veci* wlists; // watcher lists (for each literal)
- int hLearntFirst; // the first learnt clause
+ int hClausePivot; // the pivot among problem clause
+ int hLearntPivot; // the pivot among learned clause
int hLearntLast; // in proof-logging mode, the ID of the final conflict clause (conf_final)
+ int iVarPivot; // the pivot among the variables
veci claActs; // clause activities
veci claProofs; // clause proofs
@@ -245,6 +249,13 @@ static inline int sat_solver2_set_random(sat_solver2* s, int fNotUseRandom)
return fNotUseRandomOld;
}
+static inline int sat_solver2_bookmark(sat_solver2* s)
+{
+ s->hLearntPivot = veci_size(&s->learnts);
+ s->hClausePivot = veci_size(&s->clauses);
+ s->iVarPivot = s->size;
+}
+
ABC_NAMESPACE_HEADER_END
#endif