ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
solver.c
Go to the documentation of this file.
1//===--- solver.c -----------------------------------------------------------===
2//
3// satoko: Satisfiability solver
4//
5// This file is distributed under the BSD 2-Clause License.
6// See LICENSE for details.
7//
8//===------------------------------------------------------------------------===
9#include <stdio.h>
10#include <assert.h>
11#include <string.h>
12#include <math.h>
13
14#include "act_clause.h"
15#include "act_var.h"
16#include "solver.h"
17#include "utils/heap.h"
18#include "utils/mem.h"
19#include "utils/sort.h"
20
23
24//===------------------------------------------------------------------------===
25// Lit funtions
26//===------------------------------------------------------------------------===
32static inline int lit_is_removable(solver_t* s, unsigned lit, unsigned min_level)
33{
34 unsigned top = vec_uint_size(s->tagged);
35
36 assert(lit_reason(s, lit) != UNDEF);
37 vec_uint_clear(s->stack);
38 vec_uint_push_back(s->stack, lit2var(lit));
39 while (vec_uint_size(s->stack)) {
40 unsigned i;
41 unsigned var = vec_uint_pop_back(s->stack);
42 struct clause *c = clause_fetch(s, var_reason(s, var));
43 unsigned *lits = &(c->data[0].lit);
44
45 assert(var_reason(s, var) != UNDEF);
46 if (c->size == 2 && lit_value(s, lits[0]) == SATOKO_LIT_FALSE) {
47 assert(lit_value(s, lits[1]) == SATOKO_LIT_TRUE);
48 stk_swap(unsigned, lits[0], lits[1]);
49 }
50
51 /* Check scan the literals of the reason clause.
52 * The first literal is skiped because is the literal itself. */
53 for (i = 1; i < c->size; i++) {
54 var = lit2var(lits[i]);
55
56 /* Check if the variable has already been seen or if it
57 * was assinged a value at the decision level 0. In a
58 * positive case, there is no need to look any further */
59 if (vec_char_at(s->seen, var) || var_dlevel(s, var) == 0)
60 continue;
61
62 /* If the variable has a reason clause and if it was
63 * assingned at a 'possible' level, then we need to
64 * check if it is recursively redundant, otherwise the
65 * literal being checked is not redundant */
66 if (var_reason(s, var) != UNDEF && ((1 << (var_dlevel(s, var) & 31)) & min_level)) {
67 vec_uint_push_back(s->stack, var);
68 vec_uint_push_back(s->tagged, var);
69 vec_char_assign(s->seen, var, 1);
70 } else {
71 vec_uint_foreach_start(s->tagged, var, i, top)
72 vec_char_assign(s->seen, var, 0);
73 vec_uint_shrink(s->tagged, top);
74 return 0;
75 }
76 }
77 }
78 return 1;
79}
80
81//===------------------------------------------------------------------------===
82// Clause functions
83//===------------------------------------------------------------------------===
84/* Calculate clause LBD (Literal Block Distance):
85 * - It's the number of variables in the final conflict clause that come from
86 * different decision levels
87 */
88static inline unsigned clause_clac_lbd(solver_t *s, unsigned *lits, unsigned size)
89{
90 unsigned i;
91 unsigned lbd = 0;
92
93 s->cur_stamp++;
94 for (i = 0; i < size; i++) {
95 unsigned level = lit_dlevel(s, lits[i]);
96 if (vec_uint_at(s->stamps, level) != s->cur_stamp) {
97 vec_uint_assign(s->stamps, level, s->cur_stamp);
98 lbd++;
99 }
100 }
101 return lbd;
102}
103
104static inline void clause_bin_resolution(solver_t *s, vec_uint_t *clause_lits)
105{
106 unsigned *lits = vec_uint_data(clause_lits);
107 unsigned counter, sz, i;
108 unsigned lit;
109 unsigned neg_lit = lit_compl(lits[0]);
110 struct watcher *w;
111
112 s->cur_stamp++;
113 vec_uint_foreach(clause_lits, lit, i)
114 vec_uint_assign(s->stamps, lit2var(lit), s->cur_stamp);
115
116 counter = 0;
117 watch_list_foreach_bin(s->watches, w, neg_lit) {
118 unsigned imp_lit = w->blocker;
119 if (vec_uint_at(s->stamps, lit2var(imp_lit)) == s->cur_stamp &&
120 lit_value(s, imp_lit) == SATOKO_LIT_TRUE) {
121 counter++;
122 vec_uint_assign(s->stamps, lit2var(imp_lit), (s->cur_stamp - 1));
123 }
124 }
125 if (counter > 0) {
126 sz = vec_uint_size(clause_lits) - 1;
127 for (i = 1; i < vec_uint_size(clause_lits) - counter; i++)
128 if (vec_uint_at(s->stamps, lit2var(lits[i])) != s->cur_stamp) {
129 stk_swap(unsigned, lits[i], lits[sz]);
130 i--;
131 sz--;
132 }
133 vec_uint_shrink(clause_lits, vec_uint_size(clause_lits) - counter);
134 }
135}
136
137static inline void clause_minimize(solver_t *s, vec_uint_t *clause_lits)
138{
139 unsigned i, j;
140 unsigned *lits = vec_uint_data(clause_lits);
141 unsigned min_level = 0;
142 unsigned clause_size;
143
144 for (i = 1; i < vec_uint_size(clause_lits); i++) {
145 unsigned level = lit_dlevel(s, lits[i]);
146 min_level |= 1 << (level & 31);
147 }
148
149 /* Remove reduntant literals */
150 vec_uint_foreach(clause_lits, i, j)
151 vec_uint_push_back(s->tagged, lit2var(i));
152 for (i = j = 1; i < vec_uint_size(clause_lits); i++)
153 if (lit_reason(s, lits[i]) == UNDEF || !lit_is_removable(s, lits[i], min_level))
154 lits[j++] = lits[i];
155 vec_uint_shrink(clause_lits, j);
156
157 /* Binary Resolution */
158 clause_size = vec_uint_size(clause_lits);
159 if (clause_size <= s->opts.clause_max_sz_bin_resol &&
160 clause_clac_lbd(s, lits, clause_size) <= s->opts.clause_min_lbd_bin_resol)
161 clause_bin_resolution(s, clause_lits);
162}
163
164static inline void clause_realloc(struct cdb *dest, struct cdb *src, unsigned *cref)
165{
166 unsigned new_cref;
167 struct clause *new_clause;
168 struct clause *old_clause = cdb_handler(src, *cref);
169
170 if (old_clause->f_reallocd) {
171 *cref = (unsigned) old_clause->size;
172 return;
173 }
174 new_cref = cdb_append(dest, 3 + old_clause->f_learnt + old_clause->size);
175 new_clause = cdb_handler(dest, new_cref);
176 memcpy(new_clause, old_clause, (size_t)((3 + old_clause->f_learnt + old_clause->size) * 4));
177 old_clause->f_reallocd = 1;
178 old_clause->size = (unsigned) new_cref;
179 *cref = new_cref;
180}
181
182//===------------------------------------------------------------------------===
183// Solver internal functions
184//===------------------------------------------------------------------------===
185static inline unsigned solver_decide(solver_t *s)
186{
187 unsigned next_var = UNDEF;
188
189 while (next_var == UNDEF || var_value(s, next_var) != SATOKO_VAR_UNASSING) {
190 if (heap_size(s->var_order) == 0) {
191 next_var = UNDEF;
192 return UNDEF;
193 }
194 next_var = heap_remove_min(s->var_order);
195 if (solver_has_marks(s) && !var_mark(s, next_var))
196 next_var = UNDEF;
197 }
198 return var2lit(next_var, satoko_var_polarity(s, next_var));
199}
200
201static inline void solver_new_decision(solver_t *s, unsigned lit)
202{
203 if (solver_has_marks(s) && !var_mark(s, lit2var(lit)))
204 return;
205 assert(var_value(s, lit2var(lit)) == SATOKO_VAR_UNASSING);
206 vec_uint_push_back(s->trail_lim, vec_uint_size(s->trail));
207 solver_enqueue(s, lit, UNDEF);
208}
209
210/* Calculate Backtrack Level from the learnt clause */
211static inline unsigned solver_calc_bt_level(solver_t *s, vec_uint_t *learnt)
212{
213 unsigned i, tmp;
214 unsigned i_max = 1;
215 unsigned *lits = vec_uint_data(learnt);
216 unsigned max = lit_dlevel(s, lits[1]);
217
218 if (vec_uint_size(learnt) == 1)
219 return 0;
220 for (i = 2; i < vec_uint_size(learnt); i++) {
221 if (lit_dlevel(s, lits[i]) > max) {
222 max = lit_dlevel(s, lits[i]);
223 i_max = i;
224 }
225 }
226 tmp = lits[1];
227 lits[1] = lits[i_max];
228 lits[i_max] = tmp;
229 return lit_dlevel(s, lits[1]);
230}
231
253static inline void solver_analyze(solver_t *s, unsigned cref, vec_uint_t *learnt,
254 unsigned *bt_level, unsigned *lbd)
255{
256 unsigned i;
257 unsigned *trail = vec_uint_data(s->trail);
258 unsigned idx = vec_uint_size(s->trail) - 1;
259 unsigned n_paths = 0;
260 unsigned p = UNDEF;
261 unsigned var;
262
263 vec_uint_push_back(learnt, UNDEF);
264 do {
265 struct clause *clause;
266 unsigned *lits;
267 unsigned j;
268
269 assert(cref != UNDEF);
270 clause = clause_fetch(s, cref);
271 lits = &(clause->data[0].lit);
272
273 if (p != UNDEF && clause->size == 2 && lit_value(s, lits[0]) == SATOKO_LIT_FALSE) {
274 assert(lit_value(s, lits[1]) == SATOKO_LIT_TRUE);
275 stk_swap(unsigned, lits[0], lits[1] );
276 }
277
278 if (clause->f_learnt)
279 clause_act_bump(s, clause);
280
281 if (clause->f_learnt && clause->lbd > 2) {
282 unsigned n_levels = clause_clac_lbd(s, lits, clause->size);
283 if (n_levels + 1 < clause->lbd) {
284 if (clause->lbd <= s->opts.lbd_freeze_clause)
285 clause->f_deletable = 0;
286 clause->lbd = n_levels;
287 }
288 }
289
290 for (j = (p == UNDEF ? 0 : 1); j < clause->size; j++) {
291 var = lit2var(lits[j]);
292 if (vec_char_at(s->seen, var) || var_dlevel(s, var) == 0)
293 continue;
294 vec_char_assign(s->seen, var, 1);
295 var_act_bump(s, var);
296 if (var_dlevel(s, var) == solver_dlevel(s)) {
297 n_paths++;
298 if (var_reason(s, var) != UNDEF && clause_fetch(s, var_reason(s, var))->f_learnt)
299 vec_uint_push_back(s->last_dlevel, var);
300 } else
301 vec_uint_push_back(learnt, lits[j]);
302 }
303
304 while (!vec_char_at(s->seen, lit2var(trail[idx--])));
305
306 p = trail[idx + 1];
307 cref = lit_reason(s, p);
308 vec_char_assign(s->seen, lit2var(p), 0);
309 n_paths--;
310 } while (n_paths > 0);
311
312 vec_uint_data(learnt)[0] = lit_compl(p);
313 clause_minimize(s, learnt);
314 *bt_level = solver_calc_bt_level(s, learnt);
315 *lbd = clause_clac_lbd(s, vec_uint_data(learnt), vec_uint_size(learnt));
316
317 if (vec_uint_size(s->last_dlevel) > 0) {
318 vec_uint_foreach(s->last_dlevel, var, i) {
319 if (clause_fetch(s, var_reason(s, var))->lbd < *lbd)
320 var_act_bump(s, var);
321 }
322 vec_uint_clear(s->last_dlevel);
323 }
324 vec_uint_foreach(s->tagged, var, i)
325 vec_char_assign(s->seen, var, 0);
326 vec_uint_clear(s->tagged);
327}
328
329static inline int solver_rst(solver_t *s)
330{
331 return b_queue_is_valid(s->bq_lbd) &&
332 (((long)b_queue_avg(s->bq_lbd) * s->opts.f_rst) > (s->sum_lbd / s->stats.n_conflicts));
333}
334
335static inline int solver_block_rst(solver_t *s)
336{
337 return s->stats.n_conflicts > (int)s->opts.fst_block_rst &&
338 b_queue_is_valid(s->bq_lbd) &&
339 ((long)vec_uint_size(s->trail) > (s->opts.b_rst * (long)b_queue_avg(s->bq_trail)));
340}
341
342static inline void solver_handle_conflict(solver_t *s, unsigned confl_cref)
343{
344 unsigned bt_level;
345 unsigned lbd;
346 unsigned cref;
347
348 vec_uint_clear(s->temp_lits);
349 solver_analyze(s, confl_cref, s->temp_lits, &bt_level, &lbd);
350 s->sum_lbd += lbd;
351 b_queue_push(s->bq_lbd, lbd);
352 solver_cancel_until(s, bt_level);
353 cref = UNDEF;
354 if (vec_uint_size(s->temp_lits) > 1) {
355 cref = solver_clause_create(s, s->temp_lits, 1);
356 clause_watch(s, cref);
357 }
358 solver_enqueue(s, vec_uint_at(s->temp_lits, 0), cref);
359 var_act_decay(s);
360 clause_act_decay(s);
361}
362
363static inline void solver_analyze_final(solver_t *s, unsigned lit)
364{
365 unsigned i;
366
367 // printf("[Satoko] Analize final..\n");
368 // printf("[Satoko] Conflicting lit: %d\n", lit);
369 vec_uint_clear(s->final_conflict);
370 vec_uint_push_back(s->final_conflict, lit);
371 if (solver_dlevel(s) == 0)
372 return;
373 vec_char_assign(s->seen, lit2var(lit), 1);
374 for (i = vec_uint_size(s->trail); i --> vec_uint_at(s->trail_lim, 0);) {
375 unsigned var = lit2var(vec_uint_at(s->trail, i));
376
377 if (vec_char_at(s->seen, var)) {
378 unsigned reason = var_reason(s, var);
379 if (reason == UNDEF) {
380 assert(var_dlevel(s, var) > 0);
381 vec_uint_push_back(s->final_conflict, lit_compl(vec_uint_at(s->trail, i)));
382 } else {
383 unsigned j;
384 struct clause *clause = clause_fetch(s, reason);
385 for (j = (clause->size == 2 ? 0 : 1); j < clause->size; j++) {
386 if (lit_dlevel(s, clause->data[j].lit) > 0)
387 vec_char_assign(s->seen, lit2var(clause->data[j].lit), 1);
388 }
389 }
390 vec_char_assign(s->seen, var, 0);
391 }
392 }
393 vec_char_assign(s->seen, lit2var(lit), 0);
394 // solver_debug_check_unsat(s);
395}
396
397static inline void solver_garbage_collect(solver_t *s)
398{
399 unsigned i;
400 unsigned *array;
401 struct cdb *new_cdb = cdb_alloc(cdb_capacity(s->all_clauses) - cdb_wasted(s->all_clauses));
402
403 if (s->book_cdb)
404 s->book_cdb = 0;
405
406 for (i = 0; i < 2 * vec_char_size(s->assigns); i++) {
407 struct watcher *w;
409 clause_realloc(new_cdb, s->all_clauses, &(w->cref));
410 }
411
412 /* Update CREFS */
413 for (i = 0; i < vec_uint_size(s->trail); i++)
414 if (lit_reason(s, vec_uint_at(s->trail, i)) != UNDEF)
415 clause_realloc(new_cdb, s->all_clauses, &(vec_uint_data(s->reasons)[lit2var(vec_uint_at(s->trail, i))]));
416
417 array = vec_uint_data(s->learnts);
418 for (i = 0; i < vec_uint_size(s->learnts); i++)
419 clause_realloc(new_cdb, s->all_clauses, &(array[i]));
420
421 array = vec_uint_data(s->originals);
422 for (i = 0; i < vec_uint_size(s->originals); i++)
423 clause_realloc(new_cdb, s->all_clauses, &(array[i]));
424
425 cdb_free(s->all_clauses);
426 s->all_clauses = new_cdb;
427}
428
429static inline void solver_reduce_cdb(solver_t *s)
430{
431 unsigned i, limit;
432 unsigned n_learnts = vec_uint_size(s->learnts);
433 unsigned cref;
434 struct clause *clause;
435 struct clause **learnts_cls;
436
437 learnts_cls = satoko_alloc(struct clause *, n_learnts);
439 learnts_cls[i] = clause_fetch(s, cref);
440
441 limit = (unsigned)(n_learnts * s->opts.learnt_ratio);
442
443 satoko_sort((void **)learnts_cls, n_learnts,
444 (int (*)(const void *, const void *)) clause_compare);
445
446 if (learnts_cls[n_learnts / 2]->lbd <= 3)
447 s->RC2 += s->opts.inc_special_reduce;
448 if (learnts_cls[n_learnts - 1]->lbd <= 6)
449 s->RC2 += s->opts.inc_special_reduce;
450
451 vec_uint_clear(s->learnts);
452 for (i = 0; i < n_learnts; i++) {
453 clause = learnts_cls[i];
454 cref = cdb_cref(s->all_clauses, (unsigned *)clause);
455 assert(clause->f_mark == 0);
456 if (clause->f_deletable && clause->lbd > 2 && clause->size > 2 && lit_reason(s, clause->data[0].lit) != cref && (i < limit)) {
457 clause->f_mark = 1;
458 s->stats.n_learnt_lits -= clause->size;
459 clause_unwatch(s, cref);
460 cdb_remove(s->all_clauses, clause);
461 } else {
462 if (!clause->f_deletable)
463 limit++;
464 clause->f_deletable = 1;
465 vec_uint_push_back(s->learnts, cref);
466 }
467 }
468 satoko_free(learnts_cls);
469
470 if (s->opts.verbose) {
471 printf("reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) \n",
472 vec_uint_size(s->learnts), n_learnts,
473 100.0 * vec_uint_size(s->learnts) / n_learnts);
474 fflush(stdout);
475 }
476 if (cdb_wasted(s->all_clauses) > cdb_size(s->all_clauses) * s->opts.garbage_max_ratio)
477 solver_garbage_collect(s);
478}
479
480//===------------------------------------------------------------------------===
481// Solver external functions
482//===------------------------------------------------------------------------===
484{
485 struct clause *clause;
486 unsigned cref;
487 unsigned n_words;
488
489 assert(vec_uint_size(lits) > 1);
490 assert(f_learnt == 0 || f_learnt == 1);
491
492 n_words = 3 + f_learnt + vec_uint_size(lits);
493 cref = cdb_append(s->all_clauses, n_words);
494 clause = clause_fetch(s, cref);
496 clause->f_mark = 0;
497 clause->f_reallocd = 0;
499 clause->size = vec_uint_size(lits);
500 memcpy(&(clause->data[0].lit), vec_uint_data(lits), sizeof(unsigned) * vec_uint_size(lits));
501
502 if (f_learnt) {
503 vec_uint_push_back(s->learnts, cref);
504 clause->lbd = clause_clac_lbd(s, vec_uint_data(lits), vec_uint_size(lits));
505 clause->data[clause->size].act = 0;
506 s->stats.n_learnt_lits += vec_uint_size(lits);
507 clause_act_bump(s, clause);
508 } else {
509 vec_uint_push_back(s->originals, cref);
510 s->stats.n_original_lits += vec_uint_size(lits);
511 }
512 return cref;
513}
514
515void solver_cancel_until(solver_t *s, unsigned level)
516{
517 unsigned i;
518
519 if (solver_dlevel(s) <= level)
520 return;
521 for (i = vec_uint_size(s->trail); i --> vec_uint_at(s->trail_lim, level);) {
522 unsigned var = lit2var(vec_uint_at(s->trail, i));
523
524 vec_char_assign(s->assigns, var, SATOKO_VAR_UNASSING);
525 vec_uint_assign(s->reasons, var, UNDEF);
526 if (!heap_in_heap(s->var_order, var))
527 heap_insert(s->var_order, var);
528 }
529 s->i_qhead = vec_uint_at(s->trail_lim, level);
530 vec_uint_shrink(s->trail, vec_uint_at(s->trail_lim, level));
531 vec_uint_shrink(s->trail_lim, level);
532}
533
535{
536 unsigned conf_cref = UNDEF;
537 unsigned *lits;
538 unsigned neg_lit;
539 unsigned n_propagations = 0;
540
541 while (s->i_qhead < vec_uint_size(s->trail)) {
542 unsigned p = vec_uint_at(s->trail, s->i_qhead++);
543 struct watch_list *ws;
544 struct watcher *begin;
545 struct watcher *end;
546 struct watcher *i, *j;
547
548 n_propagations++;
550 if (solver_has_marks(s) && !var_mark(s, lit2var(i->blocker)))
551 continue;
552 if (var_value(s, lit2var(i->blocker)) == SATOKO_VAR_UNASSING)
553 solver_enqueue(s, i->blocker, i->cref);
554 else if (lit_value(s, i->blocker) == SATOKO_LIT_FALSE)
555 return i->cref;
556 }
557
558 ws = vec_wl_at(s->watches, p);
559 begin = watch_list_array(ws);
560 end = begin + watch_list_size(ws);
561 for (i = j = begin + ws->n_bin; i < end;) {
562 struct clause *clause;
563 struct watcher w;
564
565 if (solver_has_marks(s) && !var_mark(s, lit2var(i->blocker))) {
566 *j++ = *i++;
567 continue;
568 }
569 if (lit_value(s, i->blocker) == SATOKO_LIT_TRUE) {
570 *j++ = *i++;
571 continue;
572 }
573
574 clause = clause_fetch(s, i->cref);
575 lits = &(clause->data[0].lit);
576
577 // Make sure the false literal is data[1]:
578 neg_lit = lit_compl(p);
579 if (lits[0] == neg_lit)
580 stk_swap(unsigned, lits[0], lits[1]);
581 assert(lits[1] == neg_lit);
582
583 w.cref = i->cref;
584 w.blocker = lits[0];
585
586 /* If 0th watch is true, then clause is already satisfied. */
587 if (lits[0] != i->blocker && lit_value(s, lits[0]) == SATOKO_LIT_TRUE)
588 *j++ = w;
589 else {
590 /* Look for new watch */
591 unsigned k;
592 for (k = 2; k < clause->size; k++) {
593 if (lit_value(s, lits[k]) != SATOKO_LIT_FALSE) {
594 lits[1] = lits[k];
595 lits[k] = neg_lit;
596 watch_list_push(vec_wl_at(s->watches, lit_compl(lits[1])), w, 0);
597 goto next;
598 }
599 }
600
601 *j++ = w;
602
603 /* Clause becomes unit under this assignment */
604 if (lit_value(s, lits[0]) == SATOKO_LIT_FALSE) {
605 conf_cref = i->cref;
606 s->i_qhead = vec_uint_size(s->trail);
607 i++;
608 // Copy the remaining watches:
609 while (i < end)
610 *j++ = *i++;
611 } else
612 solver_enqueue(s, lits[0], i->cref);
613 }
614 next:
615 i++;
616 }
617
618 s->stats.n_inspects += j - watch_list_array(ws);
619 watch_list_shrink(ws, j - watch_list_array(ws));
620 }
621 s->stats.n_propagations += n_propagations;
622 s->stats.n_propagations_all += n_propagations;
623 s->n_props_simplify -= n_propagations;
624 return conf_cref;
625}
626
628{
629 s->stats.n_starts++;
630 while (1) {
631 unsigned confl_cref = solver_propagate(s);
632 if (confl_cref != UNDEF) {
633 s->stats.n_conflicts++;
635 if (solver_dlevel(s) == 0)
636 return SATOKO_UNSAT;
637 /* Restart heuristic */
638 b_queue_push(s->bq_trail, vec_uint_size(s->trail));
639 if (solver_block_rst(s))
640 b_queue_clean(s->bq_lbd);
641 solver_handle_conflict(s, confl_cref);
642 } else {
643 // solver_debug_check_clauses(s);
644 /* No conflict */
645 unsigned next_lit;
646
647 if (solver_rst(s) || solver_check_limits(s) == 0 || solver_stop(s) ||
648 (s->nRuntimeLimit && (s->stats.n_conflicts & 63) == 0 && Abc_Clock() > s->nRuntimeLimit)) {
649 b_queue_clean(s->bq_lbd);
651 return SATOKO_UNDEC;
652 }
653 if (!s->opts.no_simplify && solver_dlevel(s) == 0)
655
656 /* Reduce the set of learnt clauses */
657 if (s->opts.learnt_ratio && vec_uint_size(s->learnts) > 100 &&
659 s->RC1 = (s->stats.n_conflicts / s->RC2) + 1;
660 solver_reduce_cdb(s);
661 s->RC2 += s->opts.inc_reduce;
662 s->n_confl_bfr_reduce = s->RC1 * s->RC2;
663 }
664
665 /* Make decisions based on user assumptions */
666 next_lit = UNDEF;
667 while (solver_dlevel(s) < vec_uint_size(s->assumptions)) {
668 unsigned lit = vec_uint_at(s->assumptions, solver_dlevel(s));
669 if (lit_value(s, lit) == SATOKO_LIT_TRUE) {
670 vec_uint_push_back(s->trail_lim, vec_uint_size(s->trail));
671 } else if (lit_value(s, lit) == SATOKO_LIT_FALSE) {
672 solver_analyze_final(s, lit_compl(lit));
673 return SATOKO_UNSAT;
674 } else {
675 next_lit = lit;
676 break;
677 }
678
679 }
680 if (next_lit == UNDEF) {
681 s->stats.n_decisions++;
682 next_lit = solver_decide(s);
683 if (next_lit == UNDEF) {
684 // solver_debug_check(s, SATOKO_SAT);
685 return SATOKO_SAT;
686 }
687 }
688 solver_new_decision(s, next_lit);
689 }
690 }
691}
692
693//===------------------------------------------------------------------------===
694// Debug procedures
695//===------------------------------------------------------------------------===
697{
698 unsigned i;
699 unsigned *array;
700 vec_uint_t *trail_dup = vec_uint_alloc(0);
701 fprintf(stdout, "[Satoko] Checking for trail(%u) inconsistencies...\n", vec_uint_size(s->trail));
702 vec_uint_duplicate(trail_dup, s->trail);
703 vec_uint_sort(trail_dup, 1);
704 array = vec_uint_data(trail_dup);
705 for (i = 1; i < vec_uint_size(trail_dup); i++) {
706 if (array[i - 1] == lit_compl(array[i])) {
707 fprintf(stdout, "[Satoko] Inconsistent trail: %u %u\n", array[i - 1], array[i]);
708 assert(0);
709 return;
710 }
711 }
712 for (i = 0; i < vec_uint_size(trail_dup); i++) {
713 if (var_value(s, lit2var(array[i])) != lit_polarity(array[i])) {
714 fprintf(stdout, "[Satoko] Inconsistent trail assignment: %u, %u\n", vec_char_at(s->assigns, lit2var(array[i])), array[i]);
715 assert(0);
716 return;
717 }
718 }
719 fprintf(stdout, "[Satoko] Trail OK.\n");
720 vec_uint_print(trail_dup);
721 vec_uint_free(trail_dup);
722
723}
724
726{
727 unsigned cref, i;
728
729 fprintf(stdout, "[Satoko] Checking clauses (%d)...\n", vec_uint_size(s->originals));
731 unsigned j;
732 struct clause *clause = clause_fetch(s, cref);
733 for (j = 0; j < clause->size; j++) {
734 if (vec_uint_find(s->trail, lit_compl(clause->data[j].lit))) {
735 continue;
736 }
737 break;
738 }
739 if (j == clause->size) {
740 vec_uint_print(s->trail);
741 fprintf(stdout, "[Satoko] FOUND UNSAT CLAUSE]: (%d) ", i);
742 clause_print(clause);
743 assert(0);
744 }
745 }
746 fprintf(stdout, "[Satoko] All SAT - OK\n");
747}
748
749void solver_debug_check(solver_t *s, int result)
750{
751 unsigned cref, i;
753 fprintf(stdout, "[Satoko] Checking clauses (%d)... \n", vec_uint_size(s->originals));
754 vec_uint_foreach(s->originals, cref, i) {
755 unsigned j;
756 struct clause *clause = clause_fetch(s, cref);
757 for (j = 0; j < clause->size; j++) {
758 if (vec_uint_find(s->trail, clause->data[j].lit)) {
759 break;
760 }
761 }
762 if (result == SATOKO_SAT && j == clause->size) {
763 fprintf(stdout, "[Satoko] FOUND UNSAT CLAUSE: (%d) ", i);
764 clause_print(clause);
765 assert(0);
766 }
767 }
768 fprintf(stdout, "[Satoko] All SAT - OK\n");
769}
770
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
#define stk_swap(type, a, b)
Definition misc.h:15
unsigned short var
Definition giaNewBdd.h:35
int lit
Definition satVec.h:130
#define satoko_free(p)
Definition mem.h:20
#define satoko_alloc(type, n_elements)
Definition mem.h:17
struct solver_t_ solver_t
Definition solver.h:37
#define UNDEF
Definition solver.h:35
@ SATOKO_UNSAT
Definition satoko.h:25
@ SATOKO_SAT
Definition satoko.h:24
@ SATOKO_UNDEC
Definition satoko.h:23
char satoko_var_polarity(satoko_t *, unsigned)
Definition solver_api.c:672
@ SATOKO_LIT_FALSE
Definition satoko.h:29
@ SATOKO_LIT_TRUE
Definition satoko.h:30
@ SATOKO_VAR_UNASSING
Definition satoko.h:31
int satoko_simplify(satoko_t *)
Definition solver_api.c:202
void solver_debug_check_clauses(solver_t *s)
Definition solver.c:725
void solver_cancel_until(solver_t *s, unsigned level)
Definition solver.c:515
unsigned solver_propagate(solver_t *s)
Definition solver.c:534
char solver_search(solver_t *s)
Definition solver.c:627
unsigned solver_clause_create(solver_t *s, vec_uint_t *lits, unsigned f_learnt)
Definition solver.c:483
void solver_debug_check_trail(solver_t *s)
Definition solver.c:696
void solver_debug_check(solver_t *s, int result)
Definition solver.c:749
for(p=first;p->value< newval;p=p->next)
if(last==0)
Definition sparse_int.h:34
Definition cdb.h:18
unsigned f_learnt
Definition clause.h:18
union clause::@075032140136325172206014200035176200302203305006 data[0]
bool reason
Definition clause.h:27
unsigned f_mark
Definition clause.h:19
clause_act_t act
Definition clause.h:26
unsigned lbd
Definition clause.h:22
unsigned lits[3]
Definition clause.h:39
unsigned f_reallocd
Definition clause.h:20
unsigned f_deletable
Definition clause.h:21
unsigned size
Definition clause.h:37
unsigned lit
Definition clause.h:25
Definition walk.c:35
char no_simplify
Definition satoko.h:69
unsigned clause_min_lbd_bin_resol
Definition satoko.h:66
double f_rst
Definition satoko.h:44
unsigned fst_block_rst
Definition satoko.h:46
unsigned inc_reduce
Definition satoko.h:52
unsigned lbd_freeze_clause
Definition satoko.h:54
double b_rst
Definition satoko.h:45
float learnt_ratio
Definition satoko.h:55
long n_inspects
Definition satoko.h:80
unsigned n_starts
Definition satoko.h:74
long n_conflicts
Definition satoko.h:81
long n_original_lits
Definition satoko.h:84
long n_conflicts_all
Definition satoko.h:82
long n_learnt_lits
Definition satoko.h:85
long n_decisions
Definition satoko.h:77
long n_propagations_all
Definition satoko.h:79
long n_propagations
Definition satoko.h:78
vec_char_t * assigns
Definition solver.h:59
vec_char_t * seen
Definition solver.h:74
vec_uint_t * final_conflict
Definition solver.h:42
struct satoko_opts opts
Definition solver.h:110
b_queue_t * bq_lbd
Definition solver.h:81
vec_uint_t * stack
Definition solver.h:76
long n_props_simplify
Definition solver.h:68
unsigned cur_stamp
Definition solver.h:88
vec_uint_t * trail_lim
Definition solver.h:64
vec_uint_t * originals
Definition solver.h:47
vec_uint_t * learnts
Definition solver.h:46
unsigned i_qhead
Definition solver.h:65
vec_uint_t * assumptions
Definition solver.h:41
vec_uint_t * stamps
Definition solver.h:89
vec_uint_t * trail
Definition solver.h:63
struct cdb * all_clauses
Definition solver.h:45
vec_uint_t * tagged
Definition solver.h:75
long RC2
Definition solver.h:83
abctime nRuntimeLimit
Definition solver.h:104
b_queue_t * bq_trail
Definition solver.h:80
vec_uint_t * reasons
Definition solver.h:58
vec_wl_t * watches
Definition solver.h:48
long RC1
Definition solver.h:82
float sum_lbd
Definition solver.h:85
vec_uint_t * temp_lits
Definition solver.h:73
vec_uint_t * last_dlevel
Definition solver.h:77
long n_confl_bfr_reduce
Definition solver.h:84
struct satoko_stats stats
Definition solver.h:109
heap_t * var_order
Definition solver.h:56
unsigned book_cdb
Definition solver.h:95
unsigned book_cl_lrnt
Definition solver.h:94
unsigned n_bin
Definition watch_list.h:26
unsigned cref
Definition watch_list.h:19
unsigned blocker
Definition watch_list.h:20
#define assert(ex)
Definition util_old.h:213
char * memcpy()
#define vec_uint_foreach(vec, entry, i)
Definition vec_uint.h:31
typedefABC_NAMESPACE_HEADER_START struct vec_uint_t_ vec_uint_t
Definition vec_uint.h:21
#define vec_uint_foreach_start(vec, entry, i, start)
Definition vec_uint.h:34
#define watch_list_foreach_bin(vec, watch, lit)
Definition watch_list.h:45
#define watch_list_foreach(vec, watch, lit)
Definition watch_list.h:40
#define const
Definition zconf.h:196