17#define LOGPREFIX "CHECK"
21void kissat_check_satisfying_assignment (
kissat *
solver) {
22 LOG (
"checking satisfying assignment");
28 for (
const int *
p = begin, *q;
p != end;
p = q + 1) {
29 bool satisfied =
false;
31 for (q =
p; (
lit = *q); q++)
39 for (q =
p; (
lit = *q); q++)
40 for (
const int *r = q + 1; (other = *r); r++)
46 fputs (
"unsatisfied clause:\n", stderr);
47 for (q =
p; (
lit = *q); q++)
48 fprintf (stderr,
"%d ",
lit);
49 fputs (
"0\n", stderr);
53 LOG (
"assignment satisfies all %zu original clauses", count);
64typedef struct hash hash;
65typedef struct bucket bucket;
69typedef STACK (bucket*) buckets_;
110 uint64_t propagations;
118#define LOGIMPORTED3(...) \
119 LOGUNSIGNEDS3 (SIZE_STACK (checker->imported), \
120 BEGIN_STACK (checker->imported), __VA_ARGS__)
122#define LOGLINE3(...) \
123 LOGUNSIGNEDS3 (bucket->size, bucket->lits, __VA_ARGS__)
125#define MAX_NONCES (sizeof checker->nonces / sizeof *checker->nonces)
127static inline bool less_unsigned (
unsigned a,
unsigned b) {
return a < b; }
129static void sort_line (
kissat *
solver, checker *checker) {
130 SORT_STACK (
unsigned, checker->imported, less_unsigned);
131 LOGIMPORTED3 (
"sorted checker");
134static unsigned hash_line (checker *checker) {
135 unsigned res = 0,
pos = 0;
137 res += checker->nonces[
pos++] *
lit;
138 if (
pos == MAX_NONCES)
144static size_t bytes_line (
unsigned size) {
145 return sizeof (bucket) + size *
sizeof (
unsigned);
148static void init_nonces (
kissat *
solver, checker *checker) {
150 for (
unsigned i = 0; i < MAX_NONCES; i++)
151 checker->nonces[i] = 1 | kissat_next_random32 (&
random);
152 LOG3 (
"initialized %zu checker nonces", MAX_NONCES);
159 LOG (
"initializing internal proof checker");
161 solver->checker = checker;
162 init_nonces (
solver, checker);
165static void release_hash (
kissat *
solver, checker *checker) {
166 for (
unsigned h = 0; h < checker->hashed; h++) {
167 for (bucket *bucket = checker->table[h], *next; bucket; bucket = next) {
176static void release_watches (
kissat *
solver, checker *checker) {
177 const unsigned lits = 2 * checker->vars;
178 for (
unsigned i = 0; i < lits; i++)
185 LOG (
"releasing internal proof checker");
186 checker *checker =
solver->checker;
187 release_hash (
solver, checker);
194 release_watches (
solver, checker);
206#define PERCENT_ADDED(NAME) kissat_percent (checker->NAME, checker->added)
207#define PERCENT_CHECKED(NAME) \
208 kissat_percent (checker->NAME, checker->checked)
210void kissat_print_checker_statistics (
kissat *
solver,
bool verbose) {
211 checker *checker =
solver->checker;
212 PRINT_STAT (
"checker_added", checker->added, 100,
"%",
"");
214 PRINT_STAT (
"checker_blocked", checker->blocked,
215 PERCENT_CHECKED (blocked),
"%",
"checked");
216 PRINT_STAT (
"checker_checked", checker->checked, PERCENT_ADDED (checked),
219 PRINT_STAT (
"checker_collisions", checker->collisions,
220 kissat_percent (checker->collisions, checker->searches),
222 PRINT_STAT (
"checker_decisions", checker->decisions,
223 kissat_average (checker->decisions, checker->checked),
"",
225 PRINT_STAT (
"checker_propagations", checker->propagations,
226 kissat_average (checker->propagations, checker->checked),
228 PRINT_STAT (
"checker_pure", checker->pure, PERCENT_CHECKED (pure),
"%",
231 PRINT_STAT (
"checker_removed", checker->removed, PERCENT_ADDED (removed),
234 PRINT_STAT (
"checker_satisfied", checker->satisfied,
235 PERCENT_CHECKED (satisfied),
"%",
"checked");
236 PRINT_STAT (
"checker_unchecked", checker->unchecked,
237 PERCENT_ADDED (unchecked),
"%",
"added");
243#define MAX_VARS (1u << 29)
244#define MAX_SIZE (1u << 30)
246static unsigned reduce_hash (
unsigned hash,
unsigned mod) {
251 for (
unsigned shift = 16, mask = 0xffff; res >= mod;
252 mask >>= (shift >>= 1))
253 res = (res >> shift) & mask;
258static void resize_hash (
kissat *
solver, checker *checker) {
259 const unsigned old_hashed = checker->hashed;
261 const unsigned new_hashed = old_hashed ? 2 * old_hashed : 1;
263 bucket **old_table = checker->table;
264 for (
unsigned i = 0; i < old_hashed; i++) {
265 for (bucket *bucket = old_table[i], *next; bucket; bucket = next) {
267 const unsigned reduced = reduce_hash (bucket->hash, new_hashed);
268 bucket->next = table[reduced];
269 table[reduced] = bucket;
273 checker->hashed = new_hashed;
274 checker->table = table;
277static bucket *new_line (
kissat *
solver, checker *checker,
unsigned size,
284 size *
sizeof *res->lits);
288#define CHECKER_LITS (2 * (checker)->vars)
289#define VALID_CHECKER_LIT(LIT) ((LIT) < CHECKER_LITS)
291static bucket decision_line;
292static bucket unit_line;
294static void checker_assign (
kissat *
solver, checker *checker,
unsigned lit,
297 if (bucket == &decision_line)
298 LOG3 (
"checker assign %u (decision)",
lit);
299 else if (bucket == &unit_line)
300 LOG3 (
"checker assign %u (unit)",
lit);
302 LOGLINE3 (
"checker assign %u reason",
lit);
307 const unsigned not_lit =
lit ^ 1;
308 signed char *values = checker->values;
312 values[not_lit] = -1;
316static buckets_ *checker_watches (checker *checker,
unsigned lit) {
318 return checker->watches +
lit;
321static void watch_checker_literal (
kissat *
solver, checker *checker,
322 bucket *bucket,
unsigned lit) {
323 LOGLINE3 (
"checker watches %u in",
lit);
324 buckets_ *buckets = checker_watches (checker,
lit);
328static void unwatch_checker_literal (
kissat *
solver, checker *checker,
329 bucket *bucket,
unsigned lit) {
330 LOGLINE3 (
"checker unwatches %u in",
lit);
331 buckets_ *buckets = checker_watches (checker,
lit);
338static void unwatch_line (
kissat *
solver, checker *checker,
341 const unsigned *
const lits = bucket->lits;
342 unwatch_checker_literal (
solver, checker, bucket, lits[0]);
343 unwatch_checker_literal (
solver, checker, bucket, lits[1]);
346static bool satisfied_or_trivial_imported (
kissat *
solver,
348 const unsigned *
const lits =
BEGIN_STACK (checker->imported);
349 const unsigned *
const end_of_lits =
END_STACK (checker->imported);
350 const signed char *values = checker->values;
351 bool *marks = checker->marks;
354 for (
p = lits; !res &&
p != end_of_lits;
p++) {
355 const unsigned lit = *
p;
359 const unsigned not_lit =
lit ^ 1;
360 if (marks[not_lit]) {
361 LOGIMPORTED3 (
"trivial by %u and %u imported checker", not_lit,
lit);
363 }
else if (values[
lit] > 0) {
364 LOGIMPORTED3 (
"satisfied by %u imported checker",
lit);
368 for (
const unsigned *q = lits; q !=
p; q++)
376static void mark_line (checker *checker) {
377 bool *marks = checker->marks;
380 checker->marked =
true;
383static void unmark_line (checker *checker) {
384 bool *marks = checker->marks;
387 checker->marked =
false;
390static bool simplify_imported (
kissat *
solver, checker *checker) {
391 if (checker->inconsistent) {
392 LOG3 (
"skipping addition since checker already inconsistent");
395 unsigned non_false = 0;
397 unsigned num_false = 0;
399 const unsigned *
const end_of_lits =
END_STACK (checker->imported);
401 const signed char *values = checker->values;
402 bool *marks = checker->marks;
405 for (
p = lits; !res &&
p != end_of_lits;
p++) {
406 const unsigned lit = *
p;
410 const unsigned not_lit =
lit ^ 1;
411 if (marks[not_lit]) {
412 LOG3 (
"simplified checker clause trivial (contains %u and %u)",
416 signed char lit_value = values[
lit];
421 }
else if (lit_value > 0) {
422 LOG3 (
"simplified checker clause satisfied by %u",
lit);
426 SWAP (
unsigned, *
p, lits[0]);
427 else if (non_false == 1)
428 SWAP (
unsigned, *
p, lits[1]);
433 for (
const unsigned *q = lits; q !=
p; q++)
437 LOG3 (
"simplified checker clause inconsistent");
438 checker->inconsistent =
true;
440 }
else if (non_false == 1) {
441 LOG3 (
"simplified checker clause unit");
442 checker_assign (
solver, checker, lits[0], &unit_line);
447 LOG3 (
"non-trivial and non-satisfied imported checker clause "
448 "has %u false and %u non-false literals",
449 num_false, non_false);
450 LOGIMPORTED3 (
"simplified checker");
455static void use_literal (
kissat *
solver, checker *checker,
unsigned lit) {
456 if (checker->used[
lit])
458 checker->used[
lit] =
true;
460 LOG3 (
"used checker literal %u",
lit);
466static void large_literal (
kissat *
solver, checker *checker,
unsigned lit) {
467 if (checker->large[
lit])
469 checker->large[
lit] =
true;
471 LOG3 (
"large checker literal %u",
lit);
477static void use_line (
kissat *
solver, checker *checker) {
478 bool large = (
SIZE_STACK (checker->imported) > 2);
486static void insert_imported (
kissat *
solver, checker *checker,
490 if (checker->buckets == checker->hashed)
491 resize_hash (
solver, checker);
492 bucket *bucket = new_line (
solver, checker, size, hash);
493 const unsigned reduced = reduce_hash (hash, checker->hashed);
494 struct bucket **
p = checker->table + reduced;
497 LOGLINE3 (
"inserted checker");
498 const unsigned *
const lits =
BEGIN_STACK (checker->imported);
499 const signed char *values = checker->values;
502 watch_checker_literal (
solver, checker, bucket, lits[0]);
503 watch_checker_literal (
solver, checker, bucket, lits[1]);
508static void insert_imported_if_not_simplified (
kissat *
solver,
510 sort_line (
solver, checker);
511 const unsigned hash = hash_line (checker);
512 if (!simplify_imported (
solver, checker)) {
513 insert_imported (
solver, checker, hash);
514 use_line (
solver, checker);
518static bool match_line (checker *checker,
unsigned size,
unsigned hash,
520 if (bucket->size != size)
522 if (bucket->hash != hash)
524 if (!checker->marked)
526 const unsigned *
const lits = bucket->lits;
527 const unsigned *
const end_of_lits = lits + bucket->size;
528 const bool *
const marks = checker->marks;
529 for (
const unsigned *
p = lits;
p != end_of_lits;
p++)
535static void resize_checker (
kissat *
solver, checker *checker,
537 const unsigned vars = checker->vars;
538 const unsigned size = checker->size;
539 if (new_vars > size) {
541 unsigned new_size =
size ? 2 *
size : 1;
542 while (new_size < new_vars)
545 LOG3 (
"resizing checker form %u to %u", size, new_size);
546 const unsigned size2 = 2 *
size;
547 const unsigned new_size2 = 2 * new_size;
549 new_size2 * sizeof (
bool));
551 new_size2 * sizeof (
bool));
553 new_size2 * sizeof (
bool));
557 solver, checker->watches, size2 *
sizeof *checker->watches,
558 new_size2 *
sizeof *checker->watches);
559 checker->size = new_size;
561 const unsigned delta = new_vars - vars;
563 LOG3 (
"initializing one checker variable %u", vars);
565 LOG3 (
"initializing %u checker variables from %u to %u", delta, vars,
567 const unsigned vars2 = 2 * vars;
568 const unsigned new_vars2 = 2 * new_vars;
569 const unsigned delta2 = 2 * delta;
571 memset (checker->watches + vars2, 0, delta2 *
sizeof *checker->watches);
572 memset (checker->marks + vars2, 0, delta2);
573 memset (checker->used + vars2, 0, delta2);
574 memset (checker->large + vars2, 0, delta2);
575 memset (checker->values + vars2, 0, delta2);
576 checker->vars = new_vars;
579static inline unsigned
580import_external_checker (
kissat *
solver, checker *checker,
int elit) {
582 const unsigned var =
ABS (elit) - 1;
583 if (var >= checker->vars)
584 resize_checker (
solver, checker, var + 1);
586 return 2 *
var + (elit < 0);
589static inline unsigned
590import_internal_checker (
kissat *
solver, checker *checker,
unsigned ilit) {
591 const int elit = kissat_export_literal (
solver, ilit);
592 return import_external_checker (
solver, checker, elit);
595static inline int export_checker (checker *checker,
unsigned ilit) {
597 return (1 + (ilit >> 1)) * ((ilit & 1) ? -1 : 1);
600static bucket *find_line (
kissat *
solver, checker *checker,
size_t size,
602 if (!checker->hashed)
604 sort_line (
solver, checker);
606 const unsigned hash = hash_line (checker);
607 const unsigned reduced = reduce_hash (hash, checker->hashed);
608 struct bucket **
p, *bucket;
609 for (
p = checker->table + reduced;
610 (bucket = *
p) && !match_line (checker, size, hash, bucket);
612 checker->collisions++;
614 unmark_line (checker);
615 if (bucket && remove)
620static void remove_line (
kissat *
solver, checker *checker,
size_t size) {
621 bucket *bucket = find_line (
solver, checker, size,
true);
624 fputs (
"trying to remove non-existing clause:\n", stderr);
626 fprintf (stderr,
"%d ", export_checker (checker,
lit));
627 fputs (
"0\n", stderr);
631 unwatch_line (
solver, checker, bucket);
632 LOGLINE3 (
"removed checker");
639static void import_external_literals (
kissat *
solver, checker *checker,
640 size_t size,
const int *elits) {
642 kissat_fatal (
"can not check handle original clause of size %zu", size);
644 for (
size_t i = 0; i <
size; i++) {
646 import_external_checker (
solver, checker, elits[i]);
649 LOGIMPORTED3 (
"checker imported external");
652static void import_internal_literals (
kissat *
solver, checker *checker,
653 size_t size,
const unsigned *ilits) {
656 for (
size_t i = 0; i <
size; i++) {
657 const unsigned ilit = ilits[i];
658 const unsigned lit = import_internal_checker (
solver, checker, ilit);
661 LOGIMPORTED3 (
"checker imported internal");
666 LOGIMPORTED3 (
"checker imported clause");
669static void import_binary (
kissat *
solver, checker *checker,
unsigned a,
672 const unsigned c = import_internal_checker (
solver, checker, a);
673 const unsigned d = import_internal_checker (
solver, checker, b);
676 LOGIMPORTED3 (
"checker imported binary");
679static void import_internal_unit (
kissat *
solver, checker *checker,
682 const unsigned b = import_internal_checker (
solver, checker, a);
684 LOGIMPORTED3 (
"checker imported unit");
687static bool checker_propagate (
kissat *
solver, checker *checker) {
688 unsigned propagated = checker->propagated;
689 signed char *values = checker->values;
691 while (res && propagated <
SIZE_STACK (checker->trail)) {
692 const unsigned lit =
PEEK_STACK (checker->trail, propagated);
693 const unsigned not_lit =
lit ^ 1;
694 LOG3 (
"checker propagate %u",
lit);
698 buckets_ *buckets = checker_watches (checker, not_lit);
699 bucket **begin_of_lines =
BEGIN_STACK (*buckets), **q = begin_of_lines;
700 bucket *
const *end_of_lines =
END_STACK (*buckets), *
const *
p = q;
701 while (
p != end_of_lines) {
702 bucket *bucket = *q++ = *
p++;
705 unsigned *lits = bucket->lits;
706 const unsigned other = not_lit ^ lits[0] ^ lits[1];
707 const signed char other_value = values[other];
710 const unsigned *
const end_of_lits = lits + bucket->size;
711 unsigned replacement;
712 signed char replacement_value = -1;
714 for (r = lits + 2; r != end_of_lits; r++) {
716 if (replacement == other)
718 if (replacement == not_lit)
720 replacement_value = values[replacement];
721 if (replacement_value >= 0)
724 if (replacement_value >= 0) {
726 lits[1] = replacement;
728 LOGLINE3 (
"checker unwatching %u in", not_lit);
729 watch_checker_literal (
solver, checker, bucket, replacement);
731 }
else if (other_value < 0) {
732 LOGLINE3 (
"checker conflict");
735 checker_assign (
solver, checker, other, bucket);
739 checker->propagations += propagated - checker->propagated;
740 checker->propagated = propagated;
744static bool bucket_redundant (
kissat *
solver, checker *checker,
746 if (!checker_propagate (
solver, checker)) {
747 LOG3 (
"root level checker unit propagations leads to conflict");
748 LOG2 (
"checker becomes inconsistent");
749 checker->inconsistent =
true;
752 if (checker->inconsistent) {
753 LOG3 (
"skipping removal since checker already inconsistent");
757 kissat_fatal (
"checker can not remove empty checker clause");
759 const unsigned unit =
PEEK_STACK (checker->imported, 0);
760 const signed char value = checker->values[unit];
762 kissat_fatal (
"consistent checker can not remove falsified unit %d",
763 export_checker (checker, unit));
765 kissat_fatal (
"checker can not remove unassigned unit %d",
766 export_checker (checker, unit));
767 LOG3 (
"checker skips removal of satisfied unit %u", unit);
769 }
else if (satisfied_or_trivial_imported (
solver, checker)) {
770 LOGIMPORTED3 (
"satisfied imported checker");
776static void remove_line_if_not_redundant (
kissat *
solver,
779 if (!bucket_redundant (
solver, checker, size))
780 remove_line (
solver, checker, size);
783static void checker_backtrack (checker *checker,
unsigned saved) {
784 unsigned *begin =
BEGIN_STACK (checker->trail) + saved;
786 signed char *values = checker->values;
788 const unsigned lit = *--
p;
790 const unsigned not_lit =
lit ^ 1;
793 values[
lit] = values[not_lit] = 0;
795 checker->propagated = saved;
799static bool checker_blocked_literal (
kissat *
solver, checker *checker,
801 signed char *values = checker->values;
803 const unsigned not_lit =
lit ^ 1;
804 if (checker->large[not_lit])
806 buckets_ *buckets = checker_watches (checker, not_lit);
807 bucket *
const *
const begin_of_lines =
BEGIN_STACK (*buckets);
808 bucket *
const *
const end_of_lines =
END_STACK (*buckets);
809 bucket *
const *
p = begin_of_lines;
810 while (
p != end_of_lines) {
811 bucket *bucket = *
p++;
812 const unsigned *
const lits = bucket->lits;
813 const unsigned *
const end_of_lits = lits + bucket->size;
814 const unsigned *l = lits;
815 while (l != end_of_lits) {
816 const unsigned other = *l++;
817 if (other == not_lit)
819 if (values[other] > 0)
820 goto CONTINUE_WITH_NEXT_BUCKET;
823 CONTINUE_WITH_NEXT_BUCKET:;
826 LOG3 (
"blocked literal %u",
lit);
833static bool checker_blocked_imported (
kissat *
solver, checker *checker) {
835 if (checker_blocked_literal (
solver, checker,
lit))
840static void check_line (
kissat *
solver, checker *checker) {
842 if (checker->inconsistent)
844 if (!checker_propagate (
solver, checker)) {
845 LOG3 (
"root level checker unit propagations leads to conflict");
846 LOG2 (
"checker becomes inconsistent");
847 checker->inconsistent =
true;
850 const unsigned saved =
SIZE_STACK (checker->trail);
851 signed char *values = checker->values;
852 bool satisfied =
false, pure =
false;
857 signed char lit_value = values[
lit];
861 LOG3 (
"found satisfied literal %u",
lit);
862 checker->satisfied++;
866 const unsigned not_lit =
lit ^ 1;
867 bool used = checker->used[not_lit];
869 LOG3 (
"found pure literal %u",
lit);
874 checker_assign (
solver, checker, not_lit, &decision_line);
877 checker->decisions += decisions;
878 if (!satisfied && !pure) {
879 if (!checker_propagate (
solver, checker))
880 LOG3 (
"checker imported clause unit implied");
881 else if (checker_blocked_imported (
solver, checker)) {
882 LOG3 (
"checker imported clause binary blocked");
886 fputs (
"failed to check clause:\n", stderr);
888 fprintf (stderr,
"%d ", export_checker (checker,
lit));
889 fputs (
"0\n", stderr);
894 checker_backtrack (checker, saved);
897void kissat_add_unchecked_external (
kissat *
solver,
size_t size,
899 LOGINTS3 (size, elits,
"adding unchecked external checker");
900 checker *checker =
solver->checker;
901 checker->unchecked++;
902 import_external_literals (
solver, checker, size, elits);
903 insert_imported_if_not_simplified (
solver, checker);
906void kissat_add_unchecked_internal (
kissat *
solver,
size_t size,
908 LOGUNSIGNEDS3 (size, lits,
"adding unchecked internal checker");
909 checker *checker =
solver->checker;
910 checker->unchecked++;
912 import_internal_literals (
solver, checker, size, lits);
913 insert_imported_if_not_simplified (
solver, checker);
916void kissat_check_and_add_binary (
kissat *
solver,
unsigned a,
unsigned b) {
917 LOGBINARY3 (a, b,
"checking and adding internal checker");
918 checker *checker =
solver->checker;
921 import_binary (
solver, checker, a, b);
922 check_line (
solver, checker);
923 insert_imported_if_not_simplified (
solver, checker);
928 checker *checker =
solver->checker;
930 check_line (
solver, checker);
931 insert_imported_if_not_simplified (
solver, checker);
935 LOG3 (
"checking and adding empty checker clause");
936 checker *checker =
solver->checker;
938 check_line (
solver, checker);
939 insert_imported_if_not_simplified (
solver, checker);
942void kissat_check_and_add_internal (
kissat *
solver,
size_t size,
943 const unsigned *lits) {
944 LOGUNSIGNEDS3 (size, lits,
"checking and adding internal checker");
945 checker *checker =
solver->checker;
946 import_internal_literals (
solver, checker, size, lits);
947 check_line (
solver, checker);
948 insert_imported_if_not_simplified (
solver, checker);
951void kissat_check_and_add_unit (
kissat *
solver,
unsigned a) {
952 LOG3 (
"checking and adding internal checker internal unit %u", a);
953 checker *checker =
solver->checker;
955 import_internal_unit (
solver, checker, a);
956 check_line (
solver, checker);
957 insert_imported_if_not_simplified (
solver, checker);
962 LOGCLS3 (c,
"checking and shrinking by %u internal checker", remove);
963 checker *checker =
solver->checker;
969 if (ilit != keep && values[ilit] < 0 && !
LEVEL (ilit))
971 const unsigned lit = import_internal_checker (
solver, checker, ilit);
974 LOGIMPORTED3 (
"checker imported internal");
975 check_line (
solver, checker);
976 insert_imported_if_not_simplified (
solver, checker);
977 import_clause (
solver, checker, c);
978 remove_line_if_not_redundant (
solver, checker);
981void kissat_remove_checker_binary (
kissat *
solver,
unsigned a,
unsigned b) {
982 LOGBINARY3 (a, b,
"removing internal checker");
983 checker *checker =
solver->checker;
986 import_binary (
solver, checker, a, b);
987 remove_line_if_not_redundant (
solver, checker);
992 checker *checker =
solver->checker;
994 remove_line_if_not_redundant (
solver, checker);
998 checker *checker =
solver->checker;
1001 if (bucket_redundant (
solver, checker, size))
1003 return find_line (
solver, checker, size,
false);
1006void kissat_remove_checker_external (
kissat *
solver,
size_t size,
1008 LOGINTS3 (size, elits,
"removing external checker");
1009 checker *checker =
solver->checker;
1010 import_external_literals (
solver, checker, size, elits);
1011 remove_line_if_not_redundant (
solver, checker);
1014void kissat_remove_checker_internal (
kissat *
solver,
size_t size,
1015 const unsigned *ilits) {
1017 checker *checker =
solver->checker;
1018 import_internal_literals (
solver, checker, size, ilits);
1019 remove_line_if_not_redundant (
solver, checker);
1022void dump_line (bucket *bucket) {
1023 printf (
"bucket[%p]", (
void *) bucket);
1024 for (
unsigned i = 0; i < bucket->size; i++)
1025 printf (
" %u", bucket->lits[i]);
1026 fputc (
'\n', stdout);
1030 checker *checker =
solver->checker;
1031 printf (
"%s\n", checker->inconsistent ?
"inconsistent" :
"consistent");
1032 printf (
"vars %u\n", checker->vars);
1033 printf (
"size %u\n", checker->size);
1034 printf (
"buckets %u\n", checker->buckets);
1035 printf (
"hashed %u\n", checker->hashed);
1036 for (
unsigned i = 0; i <
SIZE_STACK (checker->trail); i++)
1037 printf (
"trail[%u] %u\n", i,
PEEK_STACK (checker->trail, i));
1038 for (
unsigned h = 0; h < checker->hashed; h++)
1039 for (bucket *bucket = checker->table[h]; bucket; bucket = bucket->next)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void * kissat_malloc(kissat *solver, size_t bytes)
void * kissat_calloc(kissat *solver, size_t n, size_t size)
void kissat_free(kissat *solver, void *ptr, size_t bytes)
void * kissat_realloc(kissat *solver, void *p, size_t old_bytes, size_t new_bytes)
void kissat_dealloc(kissat *solver, void *ptr, size_t n, size_t size)
ABC_NAMESPACE_HEADER_START typedef uint64_t generator
#define REMOVE_STACK(T, S, E)
#define all_stack(T, E, S)
#define SET_END_OF_STACK(S, P)
ABC_NAMESPACE_IMPL_START typedef signed char value
ABC_NAMESPACE_IMPL_START int kissat_check_dummy_to_avoid_warning
void kissat_fatal_message_start(void)
void kissat_fatal(const char *fmt,...)
int kissat_value(kissat *solver, int elit)
#define all_literals_in_clause(LIT, C)
#define KISSAT_assert(ignore)
#define SORT_STACK(TYPE, S, LESS)
#define LOGUNSIGNEDS3(...)
#define VALID_INTERNAL_LITERAL(LIT)