Commit 9b7ea213 by Bruno Schmitt

Prevents Satoko from silently becoming inconsistent

parent 4cf046c9
...@@ -40,6 +40,7 @@ enum { ...@@ -40,6 +40,7 @@ enum {
typedef struct solver_t_ solver_t; typedef struct solver_t_ solver_t;
struct solver_t_ { struct solver_t_ {
int status;
/* User data */ /* User data */
vec_uint_t *assumptions; vec_uint_t *assumptions;
vec_uint_t *final_conflict; vec_uint_t *final_conflict;
......
...@@ -81,6 +81,7 @@ solver_t * satoko_create() ...@@ -81,6 +81,7 @@ solver_t * satoko_create()
solver_t *s = satoko_calloc(solver_t, 1); solver_t *s = satoko_calloc(solver_t, 1);
satoko_default_opts(&s->opts); satoko_default_opts(&s->opts);
s->status = SATOKO_OK;
/* User data */ /* User data */
s->assumptions = vec_uint_alloc(0); s->assumptions = vec_uint_alloc(0);
s->final_conflict = vec_uint_alloc(0); s->final_conflict = vec_uint_alloc(0);
...@@ -259,11 +260,12 @@ int satoko_add_clause(solver_t *s, int *lits, int size) ...@@ -259,11 +260,12 @@ int satoko_add_clause(solver_t *s, int *lits, int size)
} }
} }
if (vec_uint_size(s->temp_lits) == 0) if (vec_uint_size(s->temp_lits) == 0) {
s->status = SATOKO_ERR;
return SATOKO_ERR; return SATOKO_ERR;
if (vec_uint_size(s->temp_lits) == 1) { } if (vec_uint_size(s->temp_lits) == 1) {
solver_enqueue(s, vec_uint_at(s->temp_lits, 0), UNDEF); solver_enqueue(s, vec_uint_at(s->temp_lits, 0), UNDEF);
return (solver_propagate(s) == UNDEF); return (s->status = (solver_propagate(s) == UNDEF));
} }
cref = solver_clause_create(s, s->temp_lits, 0); cref = solver_clause_create(s, s->temp_lits, 0);
...@@ -285,11 +287,15 @@ void satoko_assump_pop(solver_t *s) ...@@ -285,11 +287,15 @@ void satoko_assump_pop(solver_t *s)
int satoko_solve(solver_t *s) int satoko_solve(solver_t *s)
{ {
char status = SATOKO_UNDEC; int status = SATOKO_UNDEC;
assert(s); assert(s);
//if (s->opts.verbose) //if (s->opts.verbose)
// print_opts(s); // print_opts(s);
if (s->status == SATOKO_ERR) {
printf("Satoko in inconsistent state\n");
return SATOKO_UNDEC;
}
if (!s->opts.no_simplify) if (!s->opts.no_simplify)
if (satoko_simplify(s) != SATOKO_OK) if (satoko_simplify(s) != SATOKO_OK)
...@@ -324,6 +330,7 @@ satoko_stats_t satoko_stats(satoko_t *s) ...@@ -324,6 +330,7 @@ satoko_stats_t satoko_stats(satoko_t *s)
void satoko_bookmark(satoko_t *s) void satoko_bookmark(satoko_t *s)
{ {
assert(s->status == SATOKO_OK);
assert(solver_dlevel(s) == 0); assert(solver_dlevel(s) == 0);
s->book_cl_orig = vec_uint_size(s->originals); s->book_cl_orig = vec_uint_size(s->originals);
s->book_cl_lrnt = vec_uint_size(s->learnts); s->book_cl_lrnt = vec_uint_size(s->learnts);
...@@ -334,6 +341,7 @@ void satoko_bookmark(satoko_t *s) ...@@ -334,6 +341,7 @@ void satoko_bookmark(satoko_t *s)
void satoko_unbookmark(satoko_t *s) void satoko_unbookmark(satoko_t *s)
{ {
assert(s->status == SATOKO_OK);
s->book_cl_orig = 0; s->book_cl_orig = 0;
s->book_cl_lrnt = 0; s->book_cl_lrnt = 0;
s->book_cdb = 0; s->book_cdb = 0;
...@@ -366,6 +374,7 @@ void satoko_reset(satoko_t *s) ...@@ -366,6 +374,7 @@ void satoko_reset(satoko_t *s)
vec_uint_clear(s->stack); vec_uint_clear(s->stack);
vec_uint_clear(s->last_dlevel); vec_uint_clear(s->last_dlevel);
vec_uint_clear(s->stamps); vec_uint_clear(s->stamps);
s->status = SATOKO_OK;
s->var_act_inc = VAR_ACT_INIT_INC; s->var_act_inc = VAR_ACT_INIT_INC;
s->clause_act_inc = CLAUSE_ACT_INIT_INC; s->clause_act_inc = CLAUSE_ACT_INIT_INC;
s->n_confl_bfr_reduce = s->opts.n_conf_fst_reduce; s->n_confl_bfr_reduce = s->opts.n_conf_fst_reduce;
...@@ -385,6 +394,7 @@ void satoko_rollback(satoko_t *s) ...@@ -385,6 +394,7 @@ void satoko_rollback(satoko_t *s)
unsigned n_learnts = vec_uint_size(s->learnts) - s->book_cl_lrnt; unsigned n_learnts = vec_uint_size(s->learnts) - s->book_cl_lrnt;
struct clause **cl_to_remove; struct clause **cl_to_remove;
assert(s->status == SATOKO_OK);
assert(solver_dlevel(s) == 0); assert(solver_dlevel(s) == 0);
if (!s->book_vars) { if (!s->book_vars) {
satoko_reset(s); satoko_reset(s);
...@@ -454,7 +464,7 @@ void satoko_write_dimacs(satoko_t *s, char *fname, int wrt_lrnt, int zero_var) ...@@ -454,7 +464,7 @@ void satoko_write_dimacs(satoko_t *s, char *fname, int wrt_lrnt, int zero_var)
FILE *file; FILE *file;
unsigned i; unsigned i;
unsigned n_vars = vec_act_size(s->activity); unsigned n_vars = vec_act_size(s->activity);
unsigned n_orig = vec_uint_size(s->originals) + vec_uint_size(s->assumptions); unsigned n_orig = vec_uint_size(s->originals) + vec_uint_size(s->trail);
unsigned n_lrnts = vec_uint_size(s->learnts); unsigned n_lrnts = vec_uint_size(s->learnts);
unsigned *array; unsigned *array;
...@@ -470,8 +480,8 @@ void satoko_write_dimacs(satoko_t *s, char *fname, int wrt_lrnt, int zero_var) ...@@ -470,8 +480,8 @@ void satoko_write_dimacs(satoko_t *s, char *fname, int wrt_lrnt, int zero_var)
return; return;
} }
fprintf(file, "p cnf %d %d\n", n_vars, wrt_lrnt ? n_orig + n_lrnts : n_orig); fprintf(file, "p cnf %d %d\n", n_vars, wrt_lrnt ? n_orig + n_lrnts : n_orig);
array = vec_uint_data(s->assumptions); array = vec_uint_data(s->trail);
for (i = 0; i < vec_uint_size(s->assumptions); i++) for (i = 0; i < vec_uint_size(s->trail); i++)
fprintf(file, "%d\n", array[i] & 1 ? -(array[i] + !zero_var) : array[i] + !zero_var); fprintf(file, "%d\n", array[i] & 1 ? -(array[i] + !zero_var) : array[i] + !zero_var);
array = vec_uint_data(s->originals); array = vec_uint_data(s->originals);
...@@ -479,7 +489,6 @@ void satoko_write_dimacs(satoko_t *s, char *fname, int wrt_lrnt, int zero_var) ...@@ -479,7 +489,6 @@ void satoko_write_dimacs(satoko_t *s, char *fname, int wrt_lrnt, int zero_var)
clause_dump(file, clause_read(s, array[i]), !zero_var); clause_dump(file, clause_read(s, array[i]), !zero_var);
if (wrt_lrnt) { if (wrt_lrnt) {
printf(" Lertns %u", n_lrnts);
array = vec_uint_data(s->learnts); array = vec_uint_data(s->learnts);
for (i = 0; i < n_lrnts; i++) for (i = 0; i < n_lrnts; i++)
clause_dump(file, clause_read(s, array[i]), !zero_var); clause_dump(file, clause_read(s, array[i]), !zero_var);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment