21static void die (
const char *fmt, ...) {
22 fputs (
"cadical_kitten: error: ", stderr);
25 vfprintf (stderr, fmt, ap);
31static inline void *cadical_kitten_calloc (
size_t n,
size_t size) {
32 void *res =
calloc (n, size);
33 if (n && size && !res)
34 die (
"out of memory allocating '%zu * %zu' bytes", n, size);
38#define CALLOC(T, P, N) \
40 (P) = (T*)cadical_kitten_calloc (N, sizeof *(P)); \
42#define DEALLOC(P, N) free (P)
46#define ENLARGE_STACK(S) \
48 CADICAL_assert (FULL_STACK (S)); \
49 const size_t SIZE = SIZE_STACK (S); \
50 const size_t OLD_CAPACITY = CAPACITY_STACK (S); \
51 const size_t NEW_CAPACITY = OLD_CAPACITY ? 2 * OLD_CAPACITY : 1; \
52 const size_t BYTES = NEW_CAPACITY * sizeof *(S).begin; \
53 (S).begin = (unsigned*)realloc ((S).begin, BYTES); \
55 die ("out of memory reallocating '%zu' bytes", BYTES); \
56 (S).allocated = (S).begin + NEW_CAPACITY; \
57 (S).end = (S).begin + SIZE; \
64 statistics *statistics = &cadical_kitten->statistics; \
65 CADICAL_assert (statistics->NAME < UINT64_MAX); \
69#define ADD(NAME, DELTA) \
71 statistics *statistics = &cadical_kitten->statistics; \
72 CADICAL_assert (statistics->NAME <= UINT64_MAX - (DELTA)); \
73 statistics->NAME += (DELTA); \
76#define KITTEN_TICKS (cadical_kitten->statistics.cadical_kitten_ticks)
78#define INVALID UINT_MAX
79#define MAX_VARS ((1u << 31) - 1)
82#define LEARNED_FLAG (2u)
89typedef STACK (
unsigned) klauses;
90typedef unsigneds katches;
203static inline bool is_core_klause (
klause *c) {
207static inline bool is_learned_klause (
klause *c) {
223 const unsigned *
p = (
const unsigned *) c;
226 const unsigned res =
p - begin;
232#define KATCHES(KIT) (cadical_kitten->watches[CADICAL_assert ((KIT) < cadical_kitten->lits), (KIT)])
234#define all_klauses(C) \
235 klause *C = begin_klauses (cadical_kitten), *end_##C = end_klauses (cadical_kitten); \
237 (C) = next_klause (cadical_kitten, C)
239#define all_original_klauses(C) \
240 klause *C = begin_klauses (cadical_kitten), \
241 *end_##C = end_original_klauses (cadical_kitten); \
243 (C) = next_klause (cadical_kitten, C)
245#define all_learned_klauses(C) \
246 klause *C = begin_learned_klauses (cadical_kitten), \
247 *end_##C = end_klauses (cadical_kitten); \
249 (C) = next_klause (cadical_kitten, C)
251#define all_kits(KIT) \
252 size_t KIT = 0, KIT_##END = cadical_kitten->lits; \
256#define BEGIN_KLAUSE(C) (C)->lits
258#define END_KLAUSE(C) (BEGIN_KLAUSE (C) + (C)->size)
260#define all_literals_in_klause(KIT, C) \
261 unsigned KIT, *KIT##_PTR = BEGIN_KLAUSE (C), \
262 *KIT##_END = END_KLAUSE (C); \
263 KIT##_PTR != KIT##_END && ((KIT = *KIT##_PTR), true); \
266#define all_antecedents(REF, C) \
267 unsigned REF, *REF##_PTR = antecedents (C), \
268 *REF##_END = REF##_PTR + (C)->aux; \
269 REF##_PTR != REF##_END && ((REF = *REF##_PTR), true); \
274#define logging (cadical_kitten->logging)
277 __attribute__ ((format (printf, 2, 3)));
286 fputc (
'\n', stdout);
290static void log_reference (
cadical_kitten *,
unsigned,
const char *, ...)
291 __attribute__ ((format (printf, 3, 4)));
302 if (is_learned_klause (c)) {
303 fputs (
" learned", stdout);
305 printf (
"[%u]", c->
aux);
307 fputs (
" original", stdout);
309 printf (
"[%u]", c->
aux);
311 printf (
" size %u clause[%u]", c->
size, ref);
318 printf (
"@%u=%d", vars[
lit / 2].level, (
int)
value);
320 fputc (
'\n', stdout);
324static void log_literals (
cadical_kitten *,
unsigned *,
unsigned,
const char *, ...)
325 __attribute__ ((format (printf, 4, 5)));
328 const char *fmt, ...) {
337 for (
unsigned i = 0; i <
size; i++) {
338 const unsigned lit = lits[i];
342 printf (
"@%u=%d", vars[
lit / 2].level, (
int)
value);
344 fputc (
'\n', stdout);
351 log_basic (cadical_kitten, __VA_ARGS__); \
357 log_reference (cadical_kitten, __VA_ARGS__); \
360#define LOGLITS(...) \
363 log_literals (cadical_kitten, __VA_ARGS__); \
374#define LOGLITS(...) \
383 unsigned found = 0, prev =
INVALID;
415 const unsigned lit = 2 * idx;
428 LOG (
"search updated to %u stamped %" PRIu64, idx,
433 LOG (
"enqueue %u", idx);
449 LOG (
"dequeue %u", idx);
452 const unsigned prev = l->
prev;
453 const unsigned next = l->
next;
465 for (
size_t idx = old_vars; idx < new_vars; idx++) {
471 LOG (
"initialized decision queue from %zu to %zu", old_vars, new_vars);
495#define RESIZE1(T, P) \
497 void *OLD_PTR = (P); \
498 CALLOC (T, (P), new_size / 2); \
499 const size_t BYTES = old_vars * sizeof *(P); \
500 memcpy ((P), OLD_PTR, BYTES); \
501 void *NEW_PTR = (P); \
503 DEALLOC ((P), old_size / 2); \
507#define RESIZE2(T, P) \
509 void *OLD_PTR = (P); \
510 CALLOC (T, (P), new_size); \
511 const size_t BYTES = old_lits * sizeof *(P); \
512 memcpy ((P), OLD_PTR, BYTES); \
513 void *NEW_PTR = (P); \
515 DEALLOC ((P), old_size); \
520 const size_t new_lits = (
lit | 1) + 1;
527 const unsigned new_vars = new_lits / 2;
528 const unsigned old_vars = old_lits / 2;
529 if (old_size < new_lits) {
530 size_t new_size = old_size ? 2 * old_size : 2;
531 while (new_size <=
lit)
533 LOG (
"internal literals resized to %zu from %zu (requested %zu)",
534 new_size, old_size, new_lits);
548 LOG (
"internal literals activated until %zu literals", new_lits);
552static const char *status_to_string (
int status) {
555 return "formula satisfied";
557 return "formula satisfied and prime implicant computed";
559 return "formula inconsistent";
561 return "formula inconsistent and core computed";
564 return "formula unsolved";
568static void invalid_api_usage (
const char *fun,
const char *fmt, ...) {
569 fprintf (stderr,
"cadical_kitten: fatal error: invalid API usage in '%s': ", fun);
572 vfprintf (stderr, fmt, ap);
574 fputc (
'\n', stderr);
579#define INVALID_API_USAGE(...) invalid_api_usage (__func__, __VA_ARGS__)
581#define REQUIRE_INITIALIZED() \
583 if (!cadical_kitten) \
584 INVALID_API_USAGE ("solver argument zero"); \
587#define REQUIRE_STATUS(EXPECTED) \
589 REQUIRE_INITIALIZED (); \
590 if (cadical_kitten->status != (EXPECTED)) \
591 INVALID_API_USAGE ("invalid status '%s' (expected '%s')", \
592 status_to_string (cadical_kitten->status), \
593 status_to_string (EXPECTED)); \
596#define UPDATE_STATUS(STATUS) \
598 if (cadical_kitten->status != (STATUS)) \
599 LOG ("updating status from '%s' to '%s'", \
600 status_to_string (cadical_kitten->status), status_to_string (STATUS)); \
602 LOG ("keeping status at '%s'", status_to_string (STATUS)); \
603 cadical_kitten->status = (STATUS); \
623 LOG (
"enabling antecedents tracking");
630 LOG (
"randomizing phases");
638 const unsigned rest = vars & ~63u;
641 uint64_t *
p = (uint64_t *) (
phases + i);
642 p[0] = (
random >> 0) & 0x0101010101010101;
643 p[1] = (
random >> 1) & 0x0101010101010101;
644 p[2] = (
random >> 2) & 0x0101010101010101;
645 p[3] = (
random >> 3) & 0x0101010101010101;
646 p[4] = (
random >> 4) & 0x0101010101010101;
647 p[5] = (
random >> 5) & 0x0101010101010101;
648 p[6] = (
random >> 6) & 0x0101010101010101;
649 p[7] = (
random >> 7) & 0x0101010101010101;
662 LOG (
"flipping phases");
668 const unsigned rest = vars & ~7u;
671 uint64_t *
p = (uint64_t *) (
phases + i);
672 *
p ^= 0x0101010101010101;
682 LOG (
"forcing no ticks limit");
696 if (UINT64_MAX - delta <= current) {
697 LOG (
"forcing unlimited ticks limit");
700 limit = current + delta;
701 LOG (
"new limit of %" PRIu64
" ticks after %" PRIu64, limit, delta);
709 LOG (
"removing terminator");
715 int (*terminator) (
void *)) {
717 LOG (
"setting terminator");
724 for (
size_t i = 0; i <
size; i++) {
728 const unsigned first = a[i];
729 const unsigned second = a[j];
742 LOG (
"shuffling watch lists");
748 LOG (
"shuffling variable decision order");
751 for (
unsigned i = 0; i < vars; i++) {
760 LOG (
"shuffling units");
771static inline unsigned *antecedents (
klause *c) {
778 ROG (ref,
"watching %u in",
lit);
790 ROG (ref,
"registering inconsistent empty");
793 ROG (ref,
"ignoring inconsistent empty");
794 }
else if (c->
size == 1) {
795 ROG (ref,
"watching unit");
806 die (
"maximum number of literals exhausted");
808 const unsigned res = (unsigned) ref;
810 INC (cadical_kitten_ticks);
832 const unsigned new_evars = eidx + 1;
833 if (old_size <= eidx) {
834 size_t new_size = old_size ? 2 * old_size : 1;
835 while (new_size <= eidx)
837 LOG (
"external resizing to %zu variables from %zu (requested %u)",
838 new_size, old_size, new_evars);
843 DEALLOC (old_import, old_size);
847 LOG (
"external variables enlarged to %u", new_evars);
851 const unsigned eidx = elit / 2;
862 unsigned ilit = 2 * iidx + (elit & 1);
863 LOG (
"imported external literal %u as internal literal %u", elit, ilit);
870 const unsigned iidx = ilit / 2;
873 const unsigned elit = 2 * eidx + (ilit & 1);
923 const unsigned vars = lits / 2;
925#ifndef CADICAL_NDEBUG
926 for (
unsigned i = 0; i < vars; i++)
957 const unsigned vars = lits / 2;
974 LOG (
"move to front variable %u", idx);
983 LOG (
"assign %u as decision",
lit);
985 ROG (reason,
"assign %u reason",
lit);
988 const unsigned not_lit =
lit ^ 1;
992 values[not_lit] = -1;
993 const unsigned idx =
lit / 2;
1007 const unsigned other_idx = other / 2;
1025 LOG (
"propagating %u",
lit);
1028 const unsigned not_lit =
lit ^ 1;
1033 unsigned const *
p = q;
1034 uint64_t ticks = (((
char *) end_watches - (
char *) q) >> 7) + 1;
1035 while (
p != end_watches) {
1036 const unsigned ref = *q++ = *
p++;
1039 unsigned *lits = c->
lits;
1040 const unsigned other = lits[0] ^ lits[1] ^ not_lit;
1041 const value other_value = values[other];
1043 if (other_value > 0)
1045 value replacement_value = -1;
1046 unsigned replacement =
INVALID;
1047 const unsigned *
const end_lits = lits + c->
size;
1049 for (r = lits + 2; r != end_lits; r++) {
1051 replacement_value = values[replacement];
1052 if (replacement_value >= 0)
1055 if (replacement_value >= 0) {
1057 ROG (ref,
"unwatching %u in", not_lit);
1059 lits[1] = replacement;
1063 }
else if (other_value < 0) {
1064 ROG (ref,
"conflict");
1065 INC (cadical_kitten_conflicts);
1073 while (
p != end_watches)
1076 ADD (cadical_kitten_ticks, ticks);
1082 unsigned propagated = 0;
1095 ADD (cadical_kitten_propagations, propagated);
1109 const unsigned not_lit =
lit ^ 1;
1112 const unsigned idx =
lit / 2;
1116 LOG (
"unassign %u",
lit);
1118 values[
lit] = values[not_lit] = 0;
1130 LOG (
"back%s to level %u",
1137 const unsigned idx =
lit / 2;
1138 const unsigned level = vars[idx].level;
1151 LOG (
"completely backtracking to level 0");
1155#ifndef CADICAL_NDEBUG
1163 for (
all_stack (
unsigned, ref, *units)) {
1166 const unsigned unit = c->
lits[0];
1184 unsigned reason = conflict;
1189 unsigned open = 0, jump = 0,
size = 1, uip;
1194 ROG (reason,
"analyzing");
1197 const unsigned idx =
lit / 2;
1201 LOG (
"analyzed %u",
lit);
1204 const kar *
const v = vars + idx;
1205 const unsigned tmp = v->level;
1224 }
while (!marks[idx = uip / 2]);
1228 reason = vars[idx].reason;
1230 const unsigned not_uip = uip ^ 1;
1231 LOG (
"first UIP %u jump level %u size %u", not_uip, jump, size);
1248 LOG (
"analyzing failing assumptions");
1251 unsigned failed_clashing =
INVALID;
1252 unsigned first_failed =
INVALID;
1253 unsigned failed_unit =
INVALID;
1255 if (values[
lit] >= 0)
1259 const unsigned failed_idx =
lit / 2;
1260 const kar *
const failed_var = vars + failed_idx;
1261 if (!failed_var->level) {
1266 failed_clashing =
lit;
1270 failed = failed_unit;
1271 else if (failed_clashing !=
INVALID)
1272 failed = failed_clashing;
1274 failed = first_failed;
1276 const unsigned failed_idx = failed / 2;
1277 const kar *
const failed_var = vars + failed_idx;
1278 const unsigned failed_reason = failed_var->reason;
1279 LOG (
"first failed assumption %u", failed);
1284 LOG (
"root-level falsified assumption %u", failed);
1290 const unsigned not_failed = failed ^ 1;
1291 if (failed_clashing !=
INVALID) {
1292 LOG (
"clashing with negated assumption %u", not_failed);
1300 marks[failed_idx] =
true;
1321 }
while (!marks[idx = uip / 2]);
1323 const kar *
var = vars + idx;
1324 const unsigned reason =
var->reason;
1326 unsigned lit = 2 * idx;
1327 if (values[
lit] < 0)
1329 LOG (
"failed assumption %u",
lit);
1332 const unsigned not_lit =
lit ^ 1;
1335 ROG (reason,
"analyzing");
1339 const unsigned other_idx = other / 2;
1340 if (marks[other_idx])
1343 marks[other_idx] =
true;
1345 if (vars[other_idx].level)
1351 LOG (
"analyzing final literal %u", other ^ 1);
1355 for (
size_t next = 0; next <
SIZE_STACK (work); next++) {
1356 const unsigned idx =
PEEK_STACK (work, next);
1357 const kar *
var = vars + idx;
1358 const unsigned reason =
var->reason;
1360 unsigned lit = 2 * idx;
1361 if (values[
lit] < 0)
1363 LOG (
"failed assumption %u",
lit);
1366 const unsigned not_lit =
lit ^ 1;
1369 ROG (reason,
"analyzing unit");
1417 if (resolved == 1) {
1431 LOG (
"flushing %zu root-level literals from trail",
SIZE_STACK (*trail));
1448 LOG (
"found failing assumption %u", assumption);
1451 }
else if (
value > 0) {
1454 LOG (
"pseudo decision level %u for already satisfied assumption %u",
1457 decision = assumption;
1458 LOG (
"using assumption %u as decision", decision);
1467 LOG (
"ticks limit %" PRIu64
" hit after %" PRIu64
" ticks",
1473 LOG (
"terminator requested termination");
1482 if (!values[2 * idx])
1488 decision = 2 * idx + phase;
1489 LOG (
"decision %u variable %u phase %u", decision, idx, phase);
1491 INC (cadical_kitten_decisions);
1503 ROG (ref,
"registering inconsistent virtually empty");
1521 ROG (ref,
"analyzing inconsistent");
1524 const unsigned idx =
lit / 2;
1529 LOG (
"analyzed %u",
lit);
1537 const kar *
const v = vars + idx;
1543 ROG (ref,
"registering final inconsistent empty");
1546 for (
all_stack (
unsigned, idx, *analyzed))
1558 LOG (
"no root level unit clauses");
1562 LOG (
"propagating %zu root level unit clauses",
1572 ROG (ref,
"propagating unit");
1573 const unsigned unit = c->
lits[0];
1617 LOG (
"resetting core clauses");
1620 if (is_core_klause (c))
1621 unset_core_klause (c), reset++;
1622 LOG (
"reset %zu core clauses", reset);
1632#ifndef CADICAL_NDEBUG
1658 INC (cadical_kitten_flip);
1660 if (values[
lit] < 0)
1662 LOG (
"trying to flip value of satisfied literal %u",
lit);
1667 unsigned const *
p = q;
1668 uint64_t ticks = (((
char *) end_watches - (
char *) q) >> 7) + 1;
1670 while (
p != end_watches) {
1671 const unsigned ref = *q++ = *
p++;
1673 unsigned *lits = c->
lits;
1674 const unsigned other = lits[0] ^ lits[1] ^
lit;
1675 const value other_value = values[other];
1677 if (other_value > 0)
1679 value replacement_value = -1;
1680 unsigned replacement =
INVALID;
1681 const unsigned *
const end_lits = lits + c->
size;
1683 for (r = lits + 2; r != end_lits; r++) {
1686 replacement_value = values[replacement];
1688 if (replacement_value > 0)
1691 if (replacement_value > 0) {
1693 ROG (ref,
"unwatching %u in",
lit);
1695 lits[1] = replacement;
1701 ROG (ref,
"single satisfied");
1706 while (
p != end_watches)
1709 ADD (cadical_kitten_ticks, ticks);
1711 LOG (
"flipping value of %u",
lit);
1713 const unsigned not_lit =
lit ^ 1;
1714 values[not_lit] = 1;
1715 INC (cadical_kitten_flipped);
1717 LOG (
"failed to flip value of %u",
lit);
1726static unsigned int2u (
int lit) {
1728 int idx = abs (
lit) - 1;
1729 return (
lit < 0) + 2u * (unsigned) idx;
1737 LOG (
"registering assumption %u", ilit);
1742 unsigned kelit = int2u (elit);
1748 const unsigned *elits,
1754 const unsigned *
const end = elits + size;
1755 for (
const unsigned *
p = elits;
p != end;
p++) {
1756 const unsigned elit = *
p;
1761 const unsigned iidx = ilit / 2;
1775 size_t size,
const int *elits,
1781 const int *
const end = elits + size;
1782 for (
const int *
p = elits;
p != end;
p++) {
1783 const unsigned elit = int2u (*
p);
1788 const unsigned iidx = ilit / 2;
1802 size_t size,
const int *elits,
1803 unsigned lit,
unsigned other) {
1809 const int *
const end = elits + size;
1810 for (
const int *
p = elits;
p != end;
p++) {
1811 const unsigned elit = int2u (*
p);
1812 if (elit == (
lit ^ 1u) || elit == (other ^ 1u))
1814 if (elit ==
lit || elit == other) {
1820 const unsigned iidx = ilit / 2;
1849 unsigned clause[2] = {a, b};
1860 LOG (
"starting solving under %zu assumptions",
1863 INC (cadical_kitten_solved);
1870 LOG (
"terminator requested termination");
1894 INC (cadical_kitten_sat);
1896 INC (cadical_kitten_unsat);
1898 INC (cadical_kitten_unknown);
1900 LOG (
"finished solving with result %d", res);
1908 uint64_t *learned_ptr) {
1914 LOG (
"computing clausal core");
1919 unsigned original = 0;
1920 uint64_t learned = 0;
1928 LOG (
"assumptions mutually inconsistent");
1931 *learned_ptr = learned;
1933 LOG (
"clausal core of %u original clauses", original);
1934 LOG (
"clausal core of %" PRIu64
" learned clauses", learned);
1948 const unsigned c_ref =
POP_STACK (*resolved);
1950 const unsigned d_ref =
POP_STACK (*resolved);
1955 set_core_klause (d);
1956 if (is_learned_klause (d))
1962 if (is_core_klause (c))
1966 ROG (c_ref,
"analyzing antecedent core");
1967 if (!is_learned_klause (c))
1971 if (!is_core_klause (d))
1980 *learned_ptr = learned;
1982 LOG (
"clausal core of %u original clauses", original);
1983 LOG (
"clausal core of %" PRIu64
" learned clauses", learned);
1992 void (*traverse) (
void *,
unsigned)) {
1995 LOG (
"traversing core of original clauses");
1997 unsigned traversed = 0;
2002 if (is_learned_klause (c))
2004 if (!is_core_klause (c))
2007 traverse (state, c->
aux);
2011 LOG (
"traversed %u original core clauses", traversed);
2018 void (*traverse) (
void *,
bool,
size_t,
2019 const unsigned *)) {
2022 LOG (
"traversing clausal core");
2024 unsigned traversed = 0;
2029 const bool learned = is_learned_klause (c);
2037 const unsigned *elits = eclause->begin;
2039 traverse (state, learned, size, elits);
2044 LOG (
"traversed %u core clauses", traversed);
2052 void (*traverse) (
void *state,
unsigned,
bool learned,
size_t,
2053 const unsigned *)) {
2056 LOG (
"traversing clausal core");
2058 unsigned traversed = 0;
2063 const bool learned = is_learned_klause (c);
2071 const unsigned *elits = eclause->begin;
2073 unsigned ctag = learned ? 0 : c->
aux;
2074 traverse (state, ctag, learned, size, elits);
2079 LOG (
"traversed %u core clauses", traversed);
2086 void (*
trace) (
void *,
unsigned,
unsigned,
bool,
2087 size_t,
const unsigned *,
size_t,
2088 const unsigned *)) {
2091 LOG (
"tracing clausal core");
2093 unsigned traced = 0;
2098 const bool learned = is_learned_klause (c);
2106 const unsigned *elits = eclause->begin;
2116 const unsigned *rids = resolved->begin;
2119 unsigned ctag = learned ? 0 : c->
aux;
2120 ROG (cid,
"tracing");
2121 trace (state, cid, ctag, learned, size, elits, rsize, rids);
2127 LOG (
"traced %u core clauses", traced);
2136 LOG (
"shrinking formula to core of original clauses");
2153 if (is_learned_klause (inconsistent) || inconsistent->size) {
2164 unsigned original = 0;
2166 for (
klause *c = begin, *next; c != end; c = next) {
2169 if (is_learned_klause (c))
2171 if (!is_core_klause (c))
2173 unset_core_klause (c);
2174 const unsigned dst = (
unsigned *) q - (
unsigned *) begin;
2175 const unsigned size = c->
size;
2179 }
else if (size == 1) {
2181 ROG (dst,
"keeping");
2189 const size_t bytes = (
char *) next - (
char *) c;
2191 q = (
klause *) ((
char *) q + bytes);
2200 LOG (
"%u original clauses left", original);
2209 const unsigned elit = int2u (selit);
2210 const unsigned eidx = elit / 2;
2216 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2222 const unsigned eidx = elit / 2;
2228 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2233 const unsigned eidx = elit / 2;
2240 const unsigned ilit = 2 * iidx + (elit & 1);
2251 unsigned kelit = int2u (elit);
2257 const unsigned eidx = elit / 2;
2263 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2271 unsigned kelit = int2u (elit);
2277 const unsigned eidx = elit / 2;
2283 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2291 void *state,
const bool ignoring,
2292 bool (*ignore) (
void *,
unsigned)) {
2293 unsigned lit = 2 * idx;
2296 for (
int i = 0; i < 2; i++) {
2300 const unsigned not_lit =
lit ^ 1;
2304 unsigned const *
p = q;
2305 uint64_t ticks = (((
char *) end_watches - (
char *) q) >> 7) + 1;
2306 while (
p != end_watches) {
2307 const unsigned ref = *q++ = *
p++;
2309 if (is_learned_klause (c) || ignore (state, c->
aux) == ignoring)
2312 unsigned *lits = c->
lits;
2313 const unsigned other = lits[0] ^ lits[1] ^ not_lit;
2314 const value other_value = values[other];
2316 if (other_value > 0)
2318 value replacement_value = -1;
2319 unsigned replacement =
INVALID;
2320 const unsigned *
const end_lits = lits + c->
size;
2322 for (r = lits + 2; r != end_lits; r++) {
2324 replacement_value = values[replacement];
2325 if (replacement_value > 0)
2328 if (replacement_value > 0) {
2330 ROG (ref,
"unwatching %u in", not_lit);
2332 lits[1] = replacement;
2337 ROG (ref,
"idx %u forced prime by", idx);
2342 while (
p != end_watches)
2345 ADD (cadical_kitten_ticks, ticks);
2351 void (*add_implicant) (
void *,
int,
size_t,
2352 const unsigned *)) {
2361 const unsigned not_lit =
lit ^ 1;
2377 bool (*ignore) (
void *,
unsigned)) {
2382 unsigneds unassigned;
2386 for (
int i = 0; i < 2; i++) {
2387 const bool ignoring = i;
2390 LOG (
"ticks limit %" PRIu64
" hit after %" PRIu64
" ticks",
2396 const unsigned idx =
lit / 2;
2397 const unsigned ref = vars[idx].reason;
2402 if (ref ==
INVALID || is_learned_klause (c) ||
2403 ignore (state, c->
aux) == ignoring) {
2404 LOG (
"non-prime candidate var %d", idx);
2405 if (prime_propagate (
cadical_kitten, idx, state, ignoring, ignore)) {
2407 values[
lit ^ 1] = 0;
2416 if (values[
lit] > 0)
2423 values[
lit ^ 1] = -1;
2453 const unsigned blit) {
2454 unsigned lit = 2 * idx;
2457 LOG (
"prime propagating idx %u for blit %u", idx, blit);
2458 for (
int i = 0; i < 2; i++) {
2464 const unsigned not_lit =
lit ^ 1;
2468 unsigned const *
p = q;
2469 uint64_t ticks = (((
char *) end_watches - (
char *) q) >> 7) + 1;
2470 while (
p != end_watches) {
2471 const unsigned ref = *q++ = *
p++;
2473 if (is_learned_klause (c))
2475 ROG (ref,
"checking with blit %u", blit);
2477 unsigned *lits = c->
lits;
2478 const unsigned other = lits[0] ^ lits[1] ^ not_lit;
2479 const value other_value = values[other];
2481 bool use = other == blit || not_lit == blit;
2482 if (other_value > 0)
2484 value replacement_value = -1;
2485 unsigned replacement =
INVALID;
2486 const unsigned *
const end_lits = lits + c->
size;
2488 for (r = lits + 2; r != end_lits; r++) {
2490 replacement_value = values[replacement];
2491 use = use || replacement == blit;
2492 if (replacement_value > 0)
2495 if (replacement_value > 0) {
2497 ROG (ref,
"unwatching %u in", not_lit);
2499 lits[1] = replacement;
2506 ROG (ref,
"idx %u forced prime by", idx);
2511 while (
p != end_watches)
2514 ADD (cadical_kitten_ticks, ticks);
2522 unsigneds unassigned;
2524 bool limit_hit =
false;
2526 for (
int i = 0; i < 2; i++) {
2527 const unsigned block = blit ^ i;
2528 const bool ignoring = i;
2530 value tmp = values[blit];
2533 values[blit ^ 1] = 0;
2534 PUSH_STACK (unassigned, tmp > 0 ? blit : blit ^ 1);
2540 LOG (
"ticks limit %" PRIu64
" hit after %" PRIu64
" ticks",
2548 const unsigned idx =
lit / 2;
2549 const unsigned ref = vars[idx].reason;
2551 LOG (
"non-prime candidate var %d", idx);
2556 values[
lit ^ 1] = 0;
2563 if (values[
lit] > 0)
2570 values[
lit ^ 1] = -1;
2586 "first implicant %u", blit);
2588 "second implicant %u", blit ^ 1);
2598 unsigned kelit = int2u (elit);
2602 const unsigned eidx = kelit / 2;
2605 const unsigned ilit = 2 * (iidx - 1) + (kelit & 1);
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
#define POKE_STACK(S, N, E)
#define all_stack(T, E, S)
#define SET_END_OF_STACK(S, P)
void cadical_kitten_assume_signed(cadical_kitten *cadical_kitten, int elit)
void cadical_kitten_traverse_core_clauses_with_id(cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *state, unsigned, bool learned, size_t, const unsigned *))
void citten_clause_with_id_and_equivalence(cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned lit, unsigned other)
void cadical_kitten_clause(cadical_kitten *cadical_kitten, size_t size, unsigned *elits)
void cadical_kitten_shuffle_clauses(cadical_kitten *cadical_kitten)
void cadical_kitten_no_terminator(cadical_kitten *cadical_kitten)
void cadical_completely_backtrack_to_root_level(cadical_kitten *cadical_kitten)
void cadical_kitten_no_ticks_limit(cadical_kitten *cadical_kitten)
#define REQUIRE_INITIALIZED()
unsigned cadical_kitten_compute_clausal_core(cadical_kitten *cadical_kitten, uint64_t *learned_ptr)
cadical_kitten * cadical_kitten_init(void)
int cadical_kitten_flip_and_implicant_for_signed_literal(cadical_kitten *cadical_kitten, int elit)
bool cadical_kitten_flip_literal(cadical_kitten *cadical_kitten, unsigned elit)
uint64_t cadical_kitten_current_ticks(cadical_kitten *cadical_kitten)
signed char cadical_kitten_fixed(cadical_kitten *cadical_kitten, unsigned elit)
void cadical_kitten_set_ticks_limit(cadical_kitten *cadical_kitten, uint64_t delta)
void cadical_kitten_traverse_core_clauses(cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
void cadical_kitten_flip_phases(cadical_kitten *cadical_kitten)
void cadical_kitten_unit(cadical_kitten *cadical_kitten, unsigned lit)
#define all_antecedents(REF, C)
ABC_NAMESPACE_IMPL_START typedef signed char value
signed char cadical_kitten_signed_value(cadical_kitten *cadical_kitten, int selit)
#define all_literals_in_klause(KIT, C)
void cadical_kitten_binary(cadical_kitten *cadical_kitten, unsigned a, unsigned b)
#define REQUIRE_STATUS(EXPECTED)
int cadical_kitten_solve(cadical_kitten *cadical_kitten)
void cadical_kitten_trace_core(cadical_kitten *cadical_kitten, void *state, void(*trace)(void *, unsigned, unsigned, bool, size_t, const unsigned *, size_t, const unsigned *))
void cadical_kitten_set_terminator(cadical_kitten *cadical_kitten, void *data, int(*terminator)(void *))
#define INVALID_API_USAGE(...)
void cadical_kitten_add_prime_implicant(cadical_kitten *cadical_kitten, void *state, int side, void(*add_implicant)(void *, int, size_t, const unsigned *))
void cadical_kitten_clear(cadical_kitten *cadical_kitten)
void citten_clause_with_id(cadical_kitten *cadical_kitten, unsigned id, size_t size, int *elits)
#define all_original_klauses(C)
void cadical_kitten_randomize_phases(cadical_kitten *cadical_kitten)
void cadical_kitten_assume(cadical_kitten *cadical_kitten, unsigned elit)
int cadical_kitten_status(cadical_kitten *cadical_kitten)
void citten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned except)
int cadical_kitten_compute_prime_implicant(cadical_kitten *cadical_kitten, void *state, bool(*ignore)(void *, unsigned))
bool cadical_kitten_flip_signed_literal(cadical_kitten *cadical_kitten, int elit)
signed char cadical_kitten_value(cadical_kitten *cadical_kitten, unsigned elit)
void cadical_kitten_release(cadical_kitten *cadical_kitten)
void cadical_kitten_shrink_to_clausal_core(cadical_kitten *cadical_kitten)
void cadical_kitten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
signed char cadical_kitten_fixed_signed(cadical_kitten *cadical_kitten, int elit)
unsigned cadical_new_learned_klause(cadical_kitten *cadical_kitten)
void cadical_kitten_traverse_core_ids(cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *, unsigned))
#define UPDATE_STATUS(STATUS)
void cadical_kitten_track_antecedents(cadical_kitten *cadical_kitten)
bool cadical_kitten_failed(cadical_kitten *cadical_kitten, unsigned elit)
int(* terminator)(void *)
struct cadical_kitten::@204357353010102162247340364316301064170137016325 queue
uint64_t cadical_kitten_unsat
uint64_t cadical_kitten_conflicts
uint64_t cadical_kitten_ticks
uint64_t cadical_kitten_flipped
uint64_t cadical_kitten_propagations
uint64_t cadical_kitten_sat
uint64_t cadical_kitten_flip
uint64_t cadical_kitten_solved
uint64_t cadical_kitten_unknown
uint64_t cadical_kitten_decisions