summaryrefslogtreecommitdiffstats
path: root/src/sat/satoko/solver.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2017-02-11 17:28:37 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2017-02-11 17:28:37 -0800
commit2a5fa67d36393ab3ddb14e5bf542b0f29c8634e1 (patch)
tree82554b6141c65a7c954c6017af8700a0ac348dbe /src/sat/satoko/solver.c
parent7b7ebf91e458271b5979a3464b25faae5a5e4a6a (diff)
downloadabc-2a5fa67d36393ab3ddb14e5bf542b0f29c8634e1.tar.gz
abc-2a5fa67d36393ab3ddb14e5bf542b0f29c8634e1.tar.bz2
abc-2a5fa67d36393ab3ddb14e5bf542b0f29c8634e1.zip
Adding APIs to mark cones. Creating test-bench for incremental solving &satoko -i.
Diffstat (limited to 'src/sat/satoko/solver.c')
-rw-r--r--src/sat/satoko/solver.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/sat/satoko/solver.c b/src/sat/satoko/solver.c
index cdd3141e..2abc9833 100644
--- a/src/sat/satoko/solver.c
+++ b/src/sat/satoko/solver.c
@@ -190,14 +190,18 @@ static inline unsigned solver_decide(solver_t *s)
if (heap_size(s->var_order) == 0) {
next_var = UNDEF;
return UNDEF;
- } else
- next_var = heap_remove_min(s->var_order);
+ }
+ next_var = heap_remove_min(s->var_order);
+ if (solver_has_marks(s) && !var_mark(s, next_var))
+ next_var = UNDEF;
}
return var2lit(next_var, vec_char_at(s->polarity, next_var));
}
static inline void solver_new_decision(solver_t *s, unsigned lit)
{
+ if (solver_has_marks(s) && !var_mark(s, lit2var(lit)))
+ return;
assert(var_value(s, lit2var(lit)) == VAR_UNASSING);
vec_uint_push_back(s->trail_lim, vec_uint_size(s->trail));
solver_enqueue(s, lit, UNDEF);
@@ -538,6 +542,8 @@ unsigned solver_propagate(solver_t *s)
n_propagations++;
watch_list_foreach(s->bin_watches, i, p) {
+ if (solver_has_marks(s) && !var_mark(s, lit2var(i->blocker)))
+ continue;
if (var_value(s, lit2var(i->blocker)) == VAR_UNASSING)
solver_enqueue(s, i->blocker, i->cref);
else if (lit_value(s, i->blocker) == LIT_FALSE)
@@ -551,6 +557,12 @@ unsigned solver_propagate(solver_t *s)
struct clause *clause;
struct watcher w;
+ if (solver_has_marks(s) && !var_mark(s, lit2var(i->blocker)))
+ {
+ *j++ = *i++;
+ continue;
+ }
+
if (lit_value(s, i->blocker) == LIT_TRUE) {
*j++ = *i++;
continue;