ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
solver.c File Reference
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <math.h>
#include "act_clause.h"
#include "act_var.h"
#include "solver.h"
#include "utils/heap.h"
#include "utils/mem.h"
#include "utils/sort.h"
#include "misc/util/abc_global.h"
Include dependency graph for solver.c:

Go to the source code of this file.

Functions

unsigned solver_clause_create (solver_t *s, vec_uint_t *lits, unsigned f_learnt)
 
void solver_cancel_until (solver_t *s, unsigned level)
 
unsigned solver_propagate (solver_t *s)
 
char solver_search (solver_t *s)
 
void solver_debug_check_trail (solver_t *s)
 
void solver_debug_check_clauses (solver_t *s)
 
void solver_debug_check (solver_t *s, int result)
 

Function Documentation

◆ solver_cancel_until()

void solver_cancel_until ( solver_t * s,
unsigned level )

Definition at line 515 of file solver.c.

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}
unsigned short var
Definition giaNewBdd.h:35
#define UNDEF
Definition solver.h:35
@ SATOKO_VAR_UNASSING
Definition satoko.h:31
vec_char_t * assigns
Definition solver.h:59
vec_uint_t * trail_lim
Definition solver.h:64
unsigned i_qhead
Definition solver.h:65
vec_uint_t * trail
Definition solver.h:63
vec_uint_t * reasons
Definition solver.h:58
heap_t * var_order
Definition solver.h:56
Here is the caller graph for this function:

◆ solver_clause_create()

unsigned solver_clause_create ( solver_t * s,
vec_uint_t * lits,
unsigned f_learnt )

Definition at line 483 of file solver.c.

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}
unsigned f_learnt
Definition clause.h:18
union clause::@075032140136325172206014200035176200302203305006 data[0]
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
long n_original_lits
Definition satoko.h:84
long n_learnt_lits
Definition satoko.h:85
vec_uint_t * originals
Definition solver.h:47
vec_uint_t * learnts
Definition solver.h:46
struct cdb * all_clauses
Definition solver.h:45
struct satoko_stats stats
Definition solver.h:109
#define assert(ex)
Definition util_old.h:213
char * memcpy()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ solver_debug_check()

void solver_debug_check ( solver_t * s,
int result )

Definition at line 749 of file solver.c.

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}
@ SATOKO_SAT
Definition satoko.h:24
void solver_debug_check_trail(solver_t *s)
Definition solver.c:696
#define vec_uint_foreach(vec, entry, i)
Definition vec_uint.h:31
Here is the call graph for this function:

◆ solver_debug_check_clauses()

void solver_debug_check_clauses ( solver_t * s)

Definition at line 725 of file solver.c.

726{
727 unsigned cref, i;
728
729 fprintf(stdout, "[Satoko] Checking clauses (%d)...\n", vec_uint_size(s->originals));
730 vec_uint_foreach(s->originals, cref, i) {
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}

◆ solver_debug_check_trail()

void solver_debug_check_trail ( solver_t * s)

Definition at line 696 of file solver.c.

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}
typedefABC_NAMESPACE_HEADER_START struct vec_uint_t_ vec_uint_t
Definition vec_uint.h:21
Here is the caller graph for this function:

◆ solver_propagate()

unsigned solver_propagate ( solver_t * s)

Definition at line 534 of file solver.c.

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}
Cube * p
Definition exorList.c:222
#define stk_swap(type, a, b)
Definition misc.h:15
@ SATOKO_LIT_FALSE
Definition satoko.h:29
@ SATOKO_LIT_TRUE
Definition satoko.h:30
long n_inspects
Definition satoko.h:80
long n_propagations_all
Definition satoko.h:79
long n_propagations
Definition satoko.h:78
long n_props_simplify
Definition solver.h:68
vec_wl_t * watches
Definition solver.h:48
unsigned n_bin
Definition watch_list.h:26
unsigned cref
Definition watch_list.h:19
unsigned blocker
Definition watch_list.h:20
#define watch_list_foreach_bin(vec, watch, lit)
Definition watch_list.h:45
Here is the caller graph for this function:

◆ solver_search()

char solver_search ( solver_t * s)

Definition at line 627 of file solver.c.

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}
int lit
Definition satVec.h:130
@ SATOKO_UNSAT
Definition satoko.h:25
@ SATOKO_UNDEC
Definition satoko.h:23
int satoko_simplify(satoko_t *)
Definition solver_api.c:202
void solver_cancel_until(solver_t *s, unsigned level)
Definition solver.c:515
unsigned solver_propagate(solver_t *s)
Definition solver.c:534
char no_simplify
Definition satoko.h:69
unsigned inc_reduce
Definition satoko.h:52
float learnt_ratio
Definition satoko.h:55
unsigned n_starts
Definition satoko.h:74
long n_conflicts
Definition satoko.h:81
long n_conflicts_all
Definition satoko.h:82
long n_decisions
Definition satoko.h:77
struct satoko_opts opts
Definition solver.h:110
b_queue_t * bq_lbd
Definition solver.h:81
vec_uint_t * assumptions
Definition solver.h:41
long RC2
Definition solver.h:83
abctime nRuntimeLimit
Definition solver.h:104
b_queue_t * bq_trail
Definition solver.h:80
long RC1
Definition solver.h:82
long n_confl_bfr_reduce
Definition solver.h:84
Here is the call graph for this function:
Here is the caller graph for this function: