summaryrefslogtreecommitdiffstats
path: root/src/sat/asat/solver.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2006-06-11 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2006-06-11 08:01:00 -0700
commit3db1557f45b03875a0a0b8adddcc15c4565895d2 (patch)
tree2896d20ddcb85ae4aa7245ca28bc585f567fea54 /src/sat/asat/solver.c
parent7d0921330b1f4e789901b4c2450920e7c412f95f (diff)
downloadabc-3db1557f45b03875a0a0b8adddcc15c4565895d2.tar.gz
abc-3db1557f45b03875a0a0b8adddcc15c4565895d2.tar.bz2
abc-3db1557f45b03875a0a0b8adddcc15c4565895d2.zip
Version abc60611
Diffstat (limited to 'src/sat/asat/solver.c')
-rw-r--r--src/sat/asat/solver.c201
1 files changed, 111 insertions, 90 deletions
diff --git a/src/sat/asat/solver.c b/src/sat/asat/solver.c
index 6d76d890..548abd1d 100644
--- a/src/sat/asat/solver.c
+++ b/src/sat/asat/solver.c
@@ -26,7 +26,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
#include "solver.h"
-//#define ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
+#define ASAT_USE_SYSTEM_MEMORY_MANAGEMENT
//=================================================================================================
// Simple (var/literal) helpers:
@@ -96,14 +96,14 @@ static inline void clause_setactivity(clause* c, float a) { *((float*)&c->lits[
//=================================================================================================
// Encode literals in clause pointers:
-clause* clause_from_lit (lit l) { return (clause*)(l + l + 1); }
-bool clause_is_lit (clause* c) { return ((unsigned int)c & 1); }
-lit clause_read_lit (clause* c) { return (lit)((unsigned int)c >> 1); }
+clause* clause_from_lit (lit l) { return (clause*)(((unsigned long)l) + ((unsigned long)l) + 1); }
+bool clause_is_lit (clause* c) { return ((unsigned long)c & 1); }
+lit clause_read_lit (clause* c) { return (lit)((unsigned long)c >> 1); }
//=================================================================================================
// Simple helpers:
-static inline int solver_dlevel(solver* s) { return vec_size(&s->trail_lim); }
+static inline int solver_dlevel(solver* s) { return veci_size(&s->trail_lim); }
static inline vec* solver_read_wlist (solver* s, lit l){ return &s->wlists[l]; }
static inline void vec_remove(vec* v, void* e)
{
@@ -124,7 +124,7 @@ static inline void order_update(solver* s, int v) // updateorder
// int clk = clock();
int* orderpos = s->orderpos;
double* activity = s->activity;
- int* heap = (int*)vec_begin(&s->order);
+ int* heap = veci_begin(&s->order);
int i = orderpos[v];
int x = heap[i];
int parent = (i - 1) / 2;
@@ -151,8 +151,8 @@ static inline void order_unassigned(solver* s, int v) // undoorder
// int clk = clock();
int* orderpos = s->orderpos;
if (orderpos[v] == -1){
- orderpos[v] = vec_size(&s->order);
- vec_push(&s->order,(void*)v);
+ orderpos[v] = veci_size(&s->order);
+ veci_push(&s->order,v);
order_update(s,v);
}
// s->timeUpdate += clock() - clk;
@@ -161,12 +161,23 @@ static inline void order_unassigned(solver* s, int v) // undoorder
static int order_select(solver* s, float random_var_freq) // selectvar
{
// int clk = clock();
+ static int Counter = 0;
int* heap;
double* activity;
int* orderpos;
lbool* values = s->assigns;
+ // The first decisions
+ if ( s->pPrefVars && s->nPrefDecNum < s->nPrefVars )
+ {
+ int i;
+ s->nPrefDecNum++;
+ for ( i = 0; i < s->nPrefVars; i++ )
+ if ( values[s->pPrefVars[i]] == l_Undef )
+ return s->pPrefVars[i];
+ }
+
// Random decision:
if (drand(&s->random_seed) < random_var_freq){
int next = irand(&s->random_seed,s->size);
@@ -177,17 +188,17 @@ static int order_select(solver* s, float random_var_freq) // selectvar
// Activity based decision:
- heap = (int*)vec_begin(&s->order);
+ heap = veci_begin(&s->order);
activity = s->activity;
orderpos = s->orderpos;
- while (vec_size(&s->order) > 0){
+ while (veci_size(&s->order) > 0){
int next = heap[0];
- int size = vec_size(&s->order)-1;
+ int size = veci_size(&s->order)-1;
int x = heap[size];
- vec_resize(&s->order,size);
+ veci_resize(&s->order,size);
orderpos[next] = -1;
@@ -300,7 +311,10 @@ static clause* clause_new(solver* s, lit* begin, lit* end, int learnt)
assert(((unsigned int)c & 1) == 0);
for (i = 0; i < size; i++)
+ {
+ assert(begin[i] >= 0);
c->lits[i] = begin[i];
+ }
if (learnt)
*((float*)&c->lits[size]) = 0.0;
@@ -328,11 +342,11 @@ static void clause_remove(solver* s, clause* c)
lit* lits = clause_begin(c);
assert(neg(lits[0]) < s->size*2);
assert(neg(lits[1]) < s->size*2);
+ assert(lits[0] < s->size*2);
//vec_remove(solver_read_wlist(s,neg(lits[0])),(void*)c);
//vec_remove(solver_read_wlist(s,neg(lits[1])),(void*)c);
- assert(lits[0] < s->size*2);
vec_remove(solver_read_wlist(s,neg(lits[0])),(void*)(clause_size(c) > 2 ? c : clause_from_lit(lits[1])));
vec_remove(solver_read_wlist(s,neg(lits[1])),(void*)(clause_size(c) > 2 ? c : clause_from_lit(lits[0])));
@@ -399,8 +413,8 @@ static void solver_setnvars(solver* s,int n)
s->levels [var] = 0;
s->tags [var] = l_Undef;
- assert(vec_size(&s->order) == var);
- vec_push(&s->order,(void*)var);
+ assert(veci_size(&s->order) == var);
+ veci_push(&s->order,var);
order_update(s,var);
}
@@ -413,20 +427,19 @@ static inline bool enqueue(solver* s, lit l, clause* from)
lbool* values = s->assigns;
int v = lit_var(l);
lbool val = values[v];
+ lbool sig = !lit_sign(l); sig += sig - 1;
#ifdef VERBOSEDEBUG
printf(L_IND"enqueue("L_LIT")\n", L_ind, L_lit(l));
#endif
-
- lbool sig = !lit_sign(l); sig += sig - 1;
if (val != l_Undef){
return val == sig;
}else{
// New fact -- store it.
+ int* levels = s->levels;
+ clause** reasons = s->reasons;
#ifdef VERBOSEDEBUG
printf(L_IND"bind("L_LIT")\n", L_ind, L_lit(l));
#endif
- int* levels = s->levels;
- clause** reasons = s->reasons;
values [v] = sig;
levels [v] = solver_dlevel(s);
@@ -448,7 +461,7 @@ static inline void assume(solver* s, lit l){
#ifdef VERBOSEDEBUG
printf(L_IND"assume("L_LIT")\n", L_ind, L_lit(l));
#endif
- vec_push(&s->trail_lim,(void*)s->qtail);
+ veci_push(&s->trail_lim,s->qtail);
enqueue(s,l,(clause*)0);
}
@@ -466,7 +479,7 @@ static inline void solver_canceluntil(solver* s, int level) {
trail = s->trail;
values = s->assigns;
reasons = s->reasons;
- bound = ((int*)vec_begin(&s->trail_lim))[level];
+ bound = veci_begin(&s->trail_lim)[level];
for (c = s->qtail-1; c >= bound; c--) {
int x = lit_var(trail[c]);
@@ -482,23 +495,23 @@ static inline void solver_canceluntil(solver* s, int level) {
order_unassigned( s, lit_var(trail[c]) );
s->qhead = s->qtail = bound;
- vec_resize(&s->trail_lim,level);
+ veci_resize(&s->trail_lim,level);
}
-static void solver_record(solver* s, vec* cls)
+static void solver_record(solver* s, veci* cls)
{
- lit* begin = (lit*)vec_begin(cls);
- lit* end = begin + vec_size(cls);
- clause* c = (vec_size(cls) > 1) ? clause_new(s,begin,end,1) : (clause*)0;
+ lit* begin = veci_begin(cls);
+ lit* end = begin + veci_size(cls);
+ clause* c = (veci_size(cls) > 1) ? clause_new(s,begin,end,1) : (clause*)0;
enqueue(s,*begin,c);
- assert(vec_size(cls) > 0);
+ assert(veci_size(cls) > 0);
if (c != 0) {
vec_push(&s->learnts,(void*)c);
act_clause_bump(s,c);
s->solver_stats.learnts++;
- s->solver_stats.learnts_literals += vec_size(cls);
+ s->solver_stats.learnts_literals += veci_size(cls);
}
}
@@ -525,18 +538,18 @@ static bool solver_lit_removable(solver* s, lit l, int minl)
lbool* tags = s->tags;
clause** reasons = s->reasons;
int* levels = s->levels;
- int top = vec_size(&s->tagged);
+ int top = veci_size(&s->tagged);
assert(lit_var(l) >= 0 && lit_var(l) < s->size);
assert(reasons[lit_var(l)] != 0);
- vec_resize(&s->stack,0);
- vec_push(&s->stack,(void*)lit_var(l));
+ veci_resize(&s->stack,0);
+ veci_push(&s->stack,lit_var(l));
- while (vec_size(&s->stack) > 0){
+ while (veci_size(&s->stack) > 0){
clause* c;
- int v = (int)vec_begin(&s->stack)[vec_size(&s->stack)-1];
+ int v = veci_begin(&s->stack)[veci_size(&s->stack)-1];
assert(v >= 0 && v < s->size);
- vec_resize(&s->stack,vec_size(&s->stack)-1);
+ veci_resize(&s->stack,veci_size(&s->stack)-1);
assert(reasons[v] != 0);
c = reasons[v];
@@ -544,15 +557,15 @@ static bool solver_lit_removable(solver* s, lit l, int minl)
int v = lit_var(clause_read_lit(c));
if (tags[v] == l_Undef && levels[v] != 0){
if (reasons[v] != 0 && ((1 << (levels[v] & 31)) & minl)){
- vec_push(&s->stack,(void*)v);
+ veci_push(&s->stack,v);
tags[v] = l_True;
- vec_push(&s->tagged,(void*)v);
+ veci_push(&s->tagged,v);
}else{
- int* tagged = (int*)vec_begin(&s->tagged);
+ int* tagged = veci_begin(&s->tagged);
int j;
- for (j = top; j < vec_size(&s->tagged); j++)
+ for (j = top; j < veci_size(&s->tagged); j++)
tags[tagged[j]] = l_Undef;
- vec_resize(&s->tagged,top);
+ veci_resize(&s->tagged,top);
return 0;
}
}
@@ -565,14 +578,14 @@ static bool solver_lit_removable(solver* s, lit l, int minl)
if (tags[v] == l_Undef && levels[v] != 0){
if (reasons[v] != 0 && ((1 << (levels[v] & 31)) & minl)){
- vec_push(&s->stack,(void*)lit_var(lits[i]));
+ veci_push(&s->stack,lit_var(lits[i]));
tags[v] = l_True;
- vec_push(&s->tagged,(void*)v);
+ veci_push(&s->tagged,v);
}else{
- int* tagged = (int*)vec_begin(&s->tagged);
- for (j = top; j < vec_size(&s->tagged); j++)
+ int* tagged = veci_begin(&s->tagged);
+ for (j = top; j < veci_size(&s->tagged); j++)
tags[tagged[j]] = l_Undef;
- vec_resize(&s->tagged,top);
+ veci_resize(&s->tagged,top);
return 0;
}
}
@@ -583,7 +596,7 @@ static bool solver_lit_removable(solver* s, lit l, int minl)
return 1;
}
-static void solver_analyze(solver* s, clause* c, vec* learnt)
+static void solver_analyze(solver* s, clause* c, veci* learnt)
{
lit* trail = s->trail;
lbool* tags = s->tags;
@@ -596,7 +609,7 @@ static void solver_analyze(solver* s, clause* c, vec* learnt)
int i, j, minl;
int* tagged;
- vec_push(learnt,(void*)lit_Undef);
+ veci_push(learnt,lit_Undef);
do{
assert(c != 0);
@@ -606,12 +619,12 @@ static void solver_analyze(solver* s, clause* c, vec* learnt)
assert(lit_var(q) >= 0 && lit_var(q) < s->size);
if (tags[lit_var(q)] == l_Undef && levels[lit_var(q)] > 0){
tags[lit_var(q)] = l_True;
- vec_push(&s->tagged,(void*)lit_var(q));
+ veci_push(&s->tagged,lit_var(q));
act_var_bump(s,lit_var(q));
if (levels[lit_var(q)] == solver_dlevel(s))
cnt++;
else
- vec_push(learnt,(void*)q);
+ veci_push(learnt,q);
}
}else{
@@ -625,12 +638,12 @@ static void solver_analyze(solver* s, clause* c, vec* learnt)
assert(lit_var(q) >= 0 && lit_var(q) < s->size);
if (tags[lit_var(q)] == l_Undef && levels[lit_var(q)] > 0){
tags[lit_var(q)] = l_True;
- vec_push(&s->tagged,(void*)lit_var(q));
+ veci_push(&s->tagged,lit_var(q));
act_var_bump(s,lit_var(q));
if (levels[lit_var(q)] == solver_dlevel(s))
cnt++;
else
- vec_push(learnt,(void*)q);
+ veci_push(learnt,q);
}
}
}
@@ -643,31 +656,34 @@ static void solver_analyze(solver* s, clause* c, vec* learnt)
}while (cnt > 0);
- *(lit*)vec_begin(learnt) = neg(p);
+// *veci_begin(learnt) = neg(p);
+
+ lits = veci_begin(learnt);
+ lits[0] = neg(p);
- lits = (lit*)vec_begin(learnt);
minl = 0;
- for (i = 1; i < vec_size(learnt); i++){
+ for (i = 1; i < veci_size(learnt); i++){
int lev = levels[lit_var(lits[i])];
minl |= 1 << (lev & 31);
}
// simplify (full)
- for (i = j = 1; i < vec_size(learnt); i++){
+ for (i = j = 1; i < veci_size(learnt); i++){
if (reasons[lit_var(lits[i])] == 0 || !solver_lit_removable(s,lits[i],minl))
lits[j++] = lits[i];
}
+// j = veci_size(learnt);
// update size of learnt + statistics
- s->solver_stats.max_literals += vec_size(learnt);
- vec_resize(learnt,j);
+ s->solver_stats.max_literals += veci_size(learnt);
+ veci_resize(learnt,j);
s->solver_stats.tot_literals += j;
// clear tags
- tagged = (int*)vec_begin(&s->tagged);
- for (i = 0; i < vec_size(&s->tagged); i++)
+ tagged = veci_begin(&s->tagged);
+ for (i = 0; i < veci_size(&s->tagged); i++)
tags[tagged[i]] = l_Undef;
- vec_resize(&s->tagged,0);
+ veci_resize(&s->tagged,0);
#ifdef DEBUG
for (i = 0; i < s->size; i++)
@@ -676,14 +692,14 @@ static void solver_analyze(solver* s, clause* c, vec* learnt)
#ifdef VERBOSEDEBUG
printf(L_IND"Learnt {", L_ind);
- for (i = 0; i < vec_size(learnt); i++) printf(" "L_LIT, L_lit(lits[i]));
+ for (i = 0; i < veci_size(learnt); i++) printf(" "L_LIT, L_lit(lits[i]));
#endif
- if (vec_size(learnt) > 1){
+ if (veci_size(learnt) > 1){
int max_i = 1;
int max = levels[lit_var(lits[1])];
lit tmp;
- for (i = 2; i < vec_size(learnt); i++)
+ for (i = 2; i < veci_size(learnt); i++)
if (levels[lit_var(lits[i])] > max){
max = levels[lit_var(lits[i])];
max_i = i;
@@ -695,7 +711,7 @@ static void solver_analyze(solver* s, clause* c, vec* learnt)
}
#ifdef VERBOSEDEBUG
{
- int lev = vec_size(learnt) > 1 ? levels[lit_var(lits[1])] : 0;
+ int lev = veci_size(learnt) > 1 ? levels[lit_var(lits[1])] : 0;
printf(" } at level %d\n", lev);
}
#endif
@@ -824,15 +840,15 @@ static lbool solver_search(solver* s, int nof_conflicts, int nof_learnts)
double random_var_freq = 0.0;//0.02;
int conflictC = 0;
- vec learnt_clause;
+ veci learnt_clause;
assert(s->root_level == solver_dlevel(s));
s->solver_stats.starts++;
s->var_decay = (float)(1 / var_decay );
s->cla_decay = (float)(1 / clause_decay);
- vec_resize(&s->model,0);
- vec_new(&learnt_clause);
+ veci_resize(&s->model,0);
+ veci_new(&learnt_clause);
for (;;){
clause* confl = solver_propagate(s);
@@ -845,13 +861,13 @@ static lbool solver_search(solver* s, int nof_conflicts, int nof_learnts)
#endif
s->solver_stats.conflicts++; conflictC++;
if (solver_dlevel(s) == s->root_level){
- vec_delete(&learnt_clause);
+ veci_delete(&learnt_clause);
return l_False;
}
- vec_resize(&learnt_clause,0);
+ veci_resize(&learnt_clause,0);
solver_analyze(s, confl, &learnt_clause);
- blevel = vec_size(&learnt_clause) > 1 ? levels[lit_var(((lit*)vec_begin(&learnt_clause))[1])] : s->root_level;
+ blevel = veci_size(&learnt_clause) > 1 ? levels[lit_var(veci_begin(&learnt_clause)[1])] : s->root_level;
solver_canceluntil(s,blevel);
solver_record(s,&learnt_clause);
act_var_decay(s);
@@ -866,17 +882,17 @@ static lbool solver_search(solver* s, int nof_conflicts, int nof_learnts)
// Reached bound on number of conflicts:
s->progress_estimate = solver_progress(s);
solver_canceluntil(s,s->root_level);
- vec_delete(&learnt_clause);
+ veci_delete(&learnt_clause);
return l_Undef;
}
- if ( s->nConfLimit && s->solver_stats.conflicts > s->nConfLimit ||
- s->nImpLimit && s->solver_stats.propagations > s->nImpLimit )
+ if ( s->nConfLimit && s->solver_stats.conflicts > s->nConfLimit ||
+ s->nInsLimit && s->solver_stats.inspects > s->nInsLimit )
{
// Reached bound on number of conflicts:
s->progress_estimate = solver_progress(s);
solver_canceluntil(s,s->root_level);
- vec_delete(&learnt_clause);
+ veci_delete(&learnt_clause);
return l_Undef;
}
@@ -899,9 +915,9 @@ static lbool solver_search(solver* s, int nof_conflicts, int nof_learnts)
// Model found:
lbool* values = s->assigns;
int i;
- for (i = 0; i < s->size; i++) vec_push(&s->model,(void*)((int)values[i]));
+ for (i = 0; i < s->size; i++) veci_push(&s->model,(int)values[i]);
solver_canceluntil(s,s->root_level);
- vec_delete(&learnt_clause);
+ veci_delete(&learnt_clause);
return l_True;
}
@@ -922,11 +938,11 @@ solver* solver_new(void)
// initialize vectors
vec_new(&s->clauses);
vec_new(&s->learnts);
- vec_new(&s->order);
- vec_new(&s->trail_lim);
- vec_new(&s->tagged);
- vec_new(&s->stack);
- vec_new(&s->model);
+ veci_new(&s->order);
+ veci_new(&s->trail_lim);
+ veci_new(&s->tagged);
+ veci_new(&s->stack);
+ veci_new(&s->model);
// initialize arrays
s->wlists = 0;
@@ -975,6 +991,8 @@ solver* solver_new(void)
s->pMem = Asat_MmStepStart( 10 );
#endif
s->pJMan = NULL;
+ s->pPrefVars = NULL;
+ s->nPrefVars = 0;
s->timeTotal = clock();
s->timeSelect = 0;
s->timeUpdate = 0;
@@ -998,11 +1016,11 @@ void solver_delete(solver* s)
// delete vectors
vec_delete(&s->clauses);
vec_delete(&s->learnts);
- vec_delete(&s->order);
- vec_delete(&s->trail_lim);
- vec_delete(&s->tagged);
- vec_delete(&s->stack);
- vec_delete(&s->model);
+ veci_delete(&s->order);
+ veci_delete(&s->trail_lim);
+ veci_delete(&s->tagged);
+ veci_delete(&s->stack);
+ veci_delete(&s->model);
free(s->binary);
// delete arrays
@@ -1022,7 +1040,8 @@ void solver_delete(solver* s)
free(s->tags );
}
- if ( s->pJMan ) Asat_JManStop( s );
+ if ( s->pJMan ) Asat_JManStop( s );
+ if ( s->pPrefVars ) free( s->pPrefVars );
free(s);
}
@@ -1117,9 +1136,10 @@ bool solver_simplify(solver* s)
}
-bool solver_solve(solver* s, lit* begin, lit* end, int nConfLimit, int nImpLimit )
+bool solver_solve(solver* s, lit* begin, lit* end, sint64 nConfLimit, sint64 nInsLimit )
{
double nof_conflicts = 100;
+// double nof_conflicts = 1000000;
double nof_learnts = solver_nclauses(s) / 3;
lbool status = l_Undef;
lbool* values = s->assigns;
@@ -1127,7 +1147,7 @@ bool solver_solve(solver* s, lit* begin, lit* end, int nConfLimit, int nImpLimit
// set the external limits
s->nConfLimit = nConfLimit; // external limit on the number of conflicts
- s->nImpLimit = nImpLimit; // external limit on the number of implications
+ s->nInsLimit = nInsLimit; // external limit on the number of implications
for (i = begin; i < end; i++)
@@ -1160,6 +1180,7 @@ bool solver_solve(solver* s, lit* begin, lit* end, int nConfLimit, int nImpLimit
s->progress_estimate*100);
fflush(stdout);
}
+ s->nPrefDecNum = 0;
status = solver_search(s,(int)nof_conflicts, (int)nof_learnts);
nof_conflicts *= 1.5;
nof_learnts *= 1.1;
@@ -1170,9 +1191,9 @@ bool solver_solve(solver* s, lit* begin, lit* end, int nConfLimit, int nImpLimit
// printf( "Reached the limit on the number of conflicts (%d).\n", s->nConfLimit );
break;
}
- if ( s->nImpLimit && s->solver_stats.propagations > s->nImpLimit )
+ if ( s->nInsLimit && s->solver_stats.inspects > s->nInsLimit )
{
-// printf( "Reached the limit on the number of implications (%d).\n", s->nImpLimit );
+// printf( "Reached the limit on the number of implications (%d).\n", s->nInsLimit );
break;
}
}