56 uint64_t remaining = 0;
60 LOG (
"'kitten_ticks' remaining %" PRIu64, remaining);
64static bool kitten_ticks_limit_hit (
sweeper *
sweeper,
const char *when) {
67 LOG (
"'kitten_ticks' limit of %" PRIu64
" ticks hit after %" PRIu64
109 unsigned completed =
solver->statistics_.sweep_completed;
110 const unsigned max_completed = 32;
111 if (completed > max_completed)
112 completed = max_completed;
115 vars_limit <<= completed;
116 const unsigned max_vars_limit =
GET_OPTION (sweepmaxvars);
117 if (vars_limit > max_vars_limit)
118 vars_limit = max_vars_limit;
123 uint64_t depth_limit =
solver->statistics_.sweep_completed;
125 const unsigned max_depth =
GET_OPTION (sweepmaxdepth);
126 if (depth_limit > max_depth)
127 depth_limit = max_depth;
132 uint64_t clause_limit =
GET_OPTION (sweepclauses);
133 clause_limit <<= completed;
134 const unsigned max_clause_limit =
GET_OPTION (sweepmaxclauses);
135 if (clause_limit > max_clause_limit)
136 clause_limit = max_clause_limit;
148 set_kitten_ticks_limit (
sweeper);
158 const unsigned lit =
LIT (idx);
181 LOG (
"clearing sweeping environment");
198 set_kitten_ticks_limit (
sweeper);
210#if defined(LOGGING) || !defined(KISSAT_NDEBUG)
215 const unsigned not_res =
NOT (res);
219 const unsigned not_prev =
NOT (
prev);
231 const unsigned repr = sweep_repr (
sweeper,
lit);
235 const unsigned idx =
IDX (
lit);
259 if (sweep_repr (
sweeper, other) != other)
265 const value other_value = values[other];
266 if (other_value > 0) {
271 const unsigned other_idx =
IDX (other);
272 const unsigned other_depth =
depths[other_idx];
273 const unsigned lit_idx =
IDX (
lit);
274 const unsigned lit_depth =
depths[lit_idx];
275 if (other_depth && other_depth < lit_depth) {
276 LOGBINARY (
lit, other,
"skipping depth %u copied", other_depth);
313static void save_core_clause (
void *state,
bool learned,
size_t size,
314 const unsigned *lits) {
322 const unsigned *end = lits +
size;
323 unsigned non_false = 0;
324 for (
const unsigned *
p = lits;
p != end;
p++) {
325 const unsigned lit = *
p;
335 if (!learned && ++non_false > 1) {
336 LOGLITS (size, lits,
"ignoring extracted original clause");
353 LOG (
"check and add extracted core[%u] lemmas to proof", core_idx);
361 while (
p != end_core) {
362 const unsigned *c =
p;
366 size_t old_size =
p - c;
367 LOGLITS (old_size, c,
"simplifying extracted core[%u] lemma", core_idx);
369 bool satisfied =
false;
374 for (
const unsigned *l = c; !satisfied && l !=
p; l++) {
375 const unsigned lit = *l;
385 size_t new_size = q - d;
390 LOG (
"not adding satisfied clause");
395 LOG (
"sweeping produced empty clause");
398 solver->inconsistent =
true;
406 LOG (
"sweeping produced unit %s",
LOGLIT (unit));
417 LOGLITS (new_size, d,
"adding extracted core[%u] lemma", core_idx);
429 LOG (
"saving extracted core[%u] lemmas",
core);
441#if defined(LOGGING) || !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
443 LOG (
"clearing core[%u] lemmas", core_idx);
446#ifdef CHECKING_OR_PROVING
447 LOG (
"deleting sub-solver core clauses");
450 for (
const unsigned *
p = c; c != end; c = ++
p) {
453 const size_t size =
p - c;
468#define LOGBACKBONE(MESSAGE) \
469 LOGLITSET (SIZE_STACK (sweeper->backbone), \
470 BEGIN_STACK (sweeper->backbone), MESSAGE)
472#define LOGPARTITION(MESSAGE) \
473 LOGLITPART (SIZE_STACK (sweeper->partition), \
474 BEGIN_STACK (sweeper->partition), MESSAGE)
478 LOG (
"initializing backbone and equivalent literals candidates");
482 const unsigned lit =
LIT (idx);
483 const unsigned not_lit =
NOT (
lit);
504 LOG (
"refining partition");
507 unsigneds new_partition;
510 const unsigned *
const old_begin =
BEGIN_STACK (old_partition);
511 const unsigned *
const old_end =
END_STACK (old_partition);
513 unsigned old_classes = 0;
514 unsigned new_classes = 0;
516 for (
const unsigned *
p = old_begin, *q;
p != old_end;
p = q + 1) {
517 unsigned assigned_true = 0, other;
519 if (sweep_repr (
sweeper, other) != other)
525 LOG (
"dropping sub-solver unassigned %s",
LOGLIT (other));
526 else if (
value > 0) {
532 LOG (
"refining class %u of size %zu", old_classes, (
size_t) (q -
p));
535 if (assigned_true == 0)
536 LOG (
"no positive literal in class");
537 else if (assigned_true == 1) {
544 LOG (
"dropping singleton class %s",
LOGLIT (other));
546 LOG (
"%u positive literal in class", assigned_true);
553 unsigned assigned_false = 0;
555 if (sweep_repr (
sweeper, other) != other)
566 if (assigned_false == 0)
567 LOG (
"no negative literal in class");
568 else if (assigned_false == 1) {
575 LOG (
"dropping singleton class %s",
LOGLIT (other));
577 LOG (
"%u negative literal in class", assigned_false);
586 LOG (
"refined %u classes into %u", old_classes, new_classes);
592 LOG (
"refining backbone candidates");
597 for (
const unsigned *
p = q;
p != end;
p++) {
598 const unsigned lit = *
p;
603 LOG (
"dropping sub-solver unassigned %s",
LOGLIT (
lit));
616 LOG (
"no need to refine empty backbone candidates");
618 sweep_refine_backbone (
sweeper);
620 LOG (
"no need to refine empty partition candidates");
622 sweep_refine_partition (
sweeper);
627 const unsigned max_rounds =
GET_OPTION (sweepfliprounds);
635 unsigned total_flipped = 0;
637 unsigned flipped, round = 0;
644 const unsigned lit = *
p++;
645 INC (sweep_flip_backbone);
647 LOG (
"flipping backbone candidate %s succeeded",
LOGLIT (
lit));
651 INC (sweep_flipped_backbone);
654 LOG (
"flipping backbone candidate %s failed",
LOGLIT (
lit));
659 LOG (
"flipped %u backbone candidates in round %u", flipped, round);
665 }
while (flipped && round < max_rounds);
666 LOG (
"flipped %u backbone candidates in total in %u rounds",
667 total_flipped, round);
676 INC (sweep_fixed_backbone);
682 INC (sweep_flip_backbone);
684 INC (sweep_flipped_backbone);
691 const unsigned not_lit =
NOT (
lit);
692 INC (sweep_solved_backbone);
694 int res = sweep_solve (
sweeper);
696 LOG (
"sweeping backbone candidate %s failed",
LOGLIT (
lit));
698 INC (sweep_sat_backbone);
705 INC (sweep_unsat_backbone);
709 INC (sweep_unknown_backbone);
711 LOG (
"sweeping backbone candidate %s failed",
LOGLIT (
lit));
734 LOG (
"rescheduling inner %s as last", LOGVAR (idx));
757 LOG (
"scheduling inner %s as last", LOGVAR (idx));
770 LOG (
"keeping inner %s scheduled as last", LOGVAR (idx));
774#if !defined(KISSAT_NDEBUG) || defined(LOGGING)
791 LOG (
"scheduling outer %s as first", LOGVAR (idx));
795#if !defined(KISSAT_NDEBUG) || defined(LOGGING)
800 LOG (
"no more scheduled variables left");
804 LOG (
"dequeuing next scheduled %s", LOGVAR (res));
819#define all_scheduled(IDX) \
820 unsigned IDX = sweeper->first, NEXT_##IDX; \
821 IDX != INVALID_IDX && (NEXT_##IDX = sweeper->next[IDX], true); \
834 LOG (
"substituting %s with %s in all irredundant clauses",
LOGLIT (
lit),
840#ifdef CHECKING_OR_PROVING
841 const bool checking_or_proving = kissat_checking_or_proving (
solver);
846 unsigneds *
const delayed = &
solver->delayed;
854 watch *q = begin_watches;
857 while (
p != end_watches) {
858 const watch head = *q++ = *
p++;
862 if (other ==
NOT (repr))
894 bool satisfied =
false;
895 bool repr_already_watched =
false;
896 const unsigned not_repr =
NOT (repr);
912 repr_already_watched =
true;
915 if (other == not_repr) {
939 LOGCLS (c,
"substituted empty clause");
941 solver->inconsistent =
true;
948 LOGCLS (c,
"reduces to unit");
972 const unsigned other =
first ^ second ^ repr;
973 const watch src = {.raw = head.
raw};
974 watch dst = kissat_binary_watch (repr);
978 solver->statistics_.clauses_irredundant--;
980 solver->statistics_.clauses_binary++;
983 const size_t bytes = kissat_actual_bytes_of_clause (c);
984 ADD (arena_garbage, bytes);
991 const unsigned old_size = c->
size;
1000 for (
const unsigned *
p = begin;
p != end;
p++) {
1001 const unsigned other = *
p;
1005 if (new_size < old_size) {
1016 LOGCLS (c,
"substituted");
1018 if (!repr_already_watched)
1024 while (
p != end_watches)
1029 const unsigned *
const begin_delayed =
BEGIN_STACK (*delayed);
1030 const unsigned *
const end_delayed =
END_STACK (*delayed);
1031 for (
const unsigned *
p = begin_delayed;
p != end_delayed;
p++) {
1032 const watch head = {.raw = *
p};
1040#ifdef CHECKING_OR_PROVING
1041 if (checking_or_proving) {
1052 unsigned *
const begin_partition =
BEGIN_STACK (*partition), *
p;
1053 const unsigned *
const end_partition =
END_STACK (*partition);
1054 for (
p = begin_partition; *
p !=
lit;
p++)
1056 unsigned *begin_class =
p;
1057 while (begin_class != begin_partition && begin_class[-1] !=
INVALID_LIT)
1059 const unsigned *end_class =
p;
1062 const unsigned size = end_class - begin_class;
1063 LOG (
"removing non-representative %s from equivalence class of size %u",
1066 unsigned *q = begin_class;
1068 LOG (
"completely squashing equivalence class of %s",
LOGLIT (
lit));
1069 for (
const unsigned *r = end_class + 1; r != end_partition; r++)
1072 for (
const unsigned *r = begin_class; r != end_partition; r++)
1084 const unsigned max_rounds =
GET_OPTION (sweepfliprounds);
1092 unsigned total_flipped = 0;
1094 unsigned flipped, round = 0;
1100 while (src != end) {
1101 const unsigned *end_src = src;
1104 unsigned size = end_src - src;
1107 for (
const unsigned *
p = src;
p != end_src;
p++) {
1108 const unsigned lit = *
p;
1110 LOG (
"flipping equivalence candidate %s succeeded",
LOGLIT (
lit));
1118 LOG (
"flipping equivalence candidate %s failed",
LOGLIT (
lit));
1129 LOG (
"flipped %u equivalence candidates in round %u", flipped, round);
1135 }
while (flipped && round < max_rounds);
1136 LOG (
"flipped %u equivalence candidates in total in %u rounds",
1137 total_flipped, round);
1143 LOG (
"trying equivalence candidates %s = %s",
LOGLIT (
lit),
1145 const unsigned not_other =
NOT (other);
1146 const unsigned not_lit =
NOT (
lit);
1153 const unsigned third = (end - begin == 3) ?
INVALID_LIT : end[-4];
1156 INC (sweep_flip_equivalences);
1157 INC (sweep_flipped_equivalences);
1160 LOG (
"squashing equivalence class of %s",
LOGLIT (
lit));
1163 LOG (
"removing %s from equivalence class of %s",
LOGLIT (
lit),
1172 ADD (sweep_flip_equivalences, 2);
1173 INC (sweep_flipped_equivalences);
1174 LOG (
"flipping %s succeeded",
LOGLIT (other));
1176 LOG (
"squashing equivalence class of %s",
LOGLIT (
lit));
1179 LOG (
"removing %s from equivalence class of %s",
LOGLIT (other),
1188 ADD (sweep_flip_equivalences, 2);
1192 INC (sweep_solved_equivalences);
1193 int res = sweep_solve (
sweeper);
1195 INC (sweep_sat_equivalences);
1196 LOG (
"first sweeping implication %s -> %s failed",
LOGLIT (other),
1200 INC (sweep_unknown_equivalences);
1201 LOG (
"first sweeping implication %s -> %s hit ticks limit",
1208 INC (sweep_unsat_equivalences);
1209 LOG (
"first sweeping implication %s -> %s succeeded",
LOGLIT (other),
1217 INC (sweep_solved_equivalences);
1219 INC (sweep_sat_equivalences);
1220 LOG (
"second sweeping implication %s <- %s failed",
LOGLIT (other),
1224 INC (sweep_unknown_equivalences);
1225 LOG (
"second sweeping implication %s <- %s hit ticks limit",
1234 INC (sweep_unsat_equivalences);
1235 LOG (
"second sweeping implication %s <- %s succeeded too",
LOGLIT (other),
1241 INC (sweep_equivalences);
1248 add_binary (
solver, not_lit, other);
1255 substitute_connected_clauses (
sweeper, other,
lit);
1256 substitute_connected_clauses (
sweeper, not_other, not_lit);
1257 sweep_remove (
sweeper, other);
1261 substitute_connected_clauses (
sweeper,
lit, other);
1262 substitute_connected_clauses (
sweeper, not_lit, not_other);
1266 const unsigned repr_idx =
IDX (repr);
1267 schedule_inner (
sweeper, repr_idx);
1272static const char *sweep_variable (
sweeper *
sweeper,
unsigned idx) {
1276 return "inactive variable";
1277 const unsigned start =
LIT (idx);
1279 return "non-representative variable";
1286 INC (sweep_variables);
1288 LOG (
"sweeping %s", LOGVAR (idx));
1290 LOG (
"starting sweeping[0]");
1291 add_literal_to_environment (
sweeper, 0, start);
1292 LOG (
"finished sweeping[0]");
1293 LOG (
"starting sweeping[1]");
1295 bool limit_reached =
false;
1296 size_t expand = 0, next = 1;
1297 bool success =
false;
1300 while (!limit_reached) {
1302 LOG (
"environment clause limit reached");
1303 limit_reached =
true;
1307 LOG (
"finished sweeping[%u]", depth);
1309 LOG (
"environment depth limit reached");
1314 LOG (
"completely copied all clauses");
1318 LOG (
"starting sweeping[%u]", depth);
1320 const unsigned choices = next -
expand;
1322 const unsigned swap =
1323 kissat_pick_random (&
solver->random, 0, choices);
1330 LOG (
"traversing and adding clauses of %s", LOGVAR (idx));
1331 for (
unsigned sign = 0;
sign < 2;
sign++) {
1340 sweep_reference (
sweeper, depth, ref);
1343 LOG (
"environment variable limit reached");
1344 limit_reached =
true;
1353 ADD (sweep_depth, depth);
1357 "sweeping variable %d environment of "
1358 "%zu variables %u clauses depth %u",
1359 kissat_export_literal (
solver,
LIT (idx)),
1362 int res = sweep_solve (
sweeper);
1363 LOG (
"sub-solver returns '%d'", res);
1365 init_backbone_and_partition (
sweeper);
1368 uint64_t solved =
solver->statistics_.sweep_solved;
1370 START (sweepbackbone);
1373 kitten_ticks_limit_hit (
sweeper,
"backbone refinement")) {
1374 limit_reached =
true;
1375 STOP_SWEEP_BACKBONE:
1376 STOP (sweepbackbone);
1379 flip_backbone_literals (
sweeper);
1381 kitten_ticks_limit_hit (
sweeper,
"backbone refinement")) {
1382 limit_reached =
true;
1383 goto STOP_SWEEP_BACKBONE;
1393 STOP (sweepbackbone);
1396 solved =
solver->statistics_.sweep_solved - solved;
1399 "complete swept variable %d backbone with %" PRIu64
1400 " units in %" PRIu64
" solver calls",
1405 uint64_t equivalences =
solver->statistics_.sweep_equivalences;
1406 solved =
solver->statistics_.sweep_solved;
1408 START (sweepequivalences);
1411 kitten_ticks_limit_hit (
sweeper,
"partition refinement")) {
1412 limit_reached =
true;
1413 STOP_SWEEP_EQUIVALENCES:
1414 STOP (sweepequivalences);
1417 flip_partition_literals (
sweeper);
1419 kitten_ticks_limit_hit (
sweeper,
"backbone refinement")) {
1420 limit_reached =
true;
1421 goto STOP_SWEEP_EQUIVALENCES;
1428 unsigned lit = end[-3];
1429 unsigned other = end[-2];
1430 if (sweep_equivalence_candidates (
sweeper,
lit, other))
1435 STOP (sweepequivalences);
1437 equivalences =
solver->statistics_.sweep_equivalences - equivalences;
1438 solved =
solver->statistics_.sweep_solved - solved;
1442 "complete swept variable %d partition with %" PRIu64
1443 " equivalences in %" PRIu64
" solver calls",
1444 kissat_export_literal (
solver,
LIT (idx)), equivalences, solved);
1446 }
else if (res == 20)
1452 if (!
solver->inconsistent && !kissat_propagated (
solver))
1455 if (success && limit_reached)
1456 return "successfully despite reaching limit";
1457 if (!success && !limit_reached)
1458 return "unsuccessfully without reaching limit";
1459 else if (success && !limit_reached)
1460 return "successfully without reaching limit";
1462 return "unsuccessfully and reached limit";
1478#define RANK_SWEEP_CANDIDATE(CAND) (CAND).rank
1483 const unsigned lit =
LIT (idx);
1488 if (
pos > max_occurrences)
1490 const unsigned not_lit =
NOT (
lit);
1494 if (neg > max_occurrences)
1496 *occ_ptr =
pos + neg;
1500static unsigned schedule_all_other_not_scheduled_yet (
sweeper *
sweeper) {
1502 sweep_candidates fresh;
1505 const bool incomplete =
solver->sweep_incomplete;
1510 if (incomplete && !f->
sweep)
1512 if (scheduled_variable (
sweeper, idx))
1515 if (!scheduable_variable (
sweeper, idx, &occ)) {
1516 FLAGS (idx)->sweep =
false;
1528 schedule_outer (
sweeper, cand.idx);
1533static unsigned reschedule_previously_remaining (
sweeper *
sweeper) {
1536 unsigned rescheduled = 0;
1537 unsigneds *remaining = &
solver->sweep_schedule;
1538 for (
all_stack (
unsigned, idx, *remaining)) {
1542 if (scheduled_variable (
sweeper, idx))
1545 if (!scheduable_variable (
sweeper, idx, &occ)) {
1549 schedule_inner (
sweeper, idx);
1573 unsigned marked = 0;
1579 solver->sweep_incomplete =
true;
1582 solver,
"marked %u scheduled sweeping variables as incomplete",
1590 const unsigned rescheduled = reschedule_previously_remaining (
sweeper);
1591 const unsigned fresh = schedule_all_other_not_scheduled_yet (
sweeper);
1592 const unsigned scheduled = fresh + rescheduled;
1593 const unsigned incomplete = incomplete_variables (
sweeper);
1597 "scheduled %u variables %.0f%% "
1598 "(%u rescheduled %.0f%%, %u incomplete %.0f%%)",
1601 rescheduled, kissat_percent (rescheduled, scheduled),
1602 incomplete, kissat_percent (incomplete, scheduled));
1607 if (
solver->sweep_incomplete)
1608 INC (sweep_completed);
1614static void unschedule_sweeping (
sweeper *
sweeper,
unsigned swept,
1615 unsigned scheduled) {
1618 (void) scheduled, (
void) swept;
1626 LOG (
"untried scheduled %s", LOGVAR (idx));
1631 solver,
"retained %u variables %.0f%% to be swept next time",
1632 retained, kissat_percent (retained,
solver->active));
1634 const unsigned incomplete = incomplete_variables (
sweeper);
1637 solver,
"need to sweep %u more variables %.0f%% for completion",
1638 incomplete, kissat_percent (incomplete,
solver->active));
1641 "no more variables needed to complete sweep");
1642 solver->sweep_incomplete =
false;
1643 INC (sweep_completed);
1646 "swept %u variables (%u remain %.0f%%)", swept, incomplete,
1647 kissat_percent (incomplete, scheduled));
1653 if (
solver->inconsistent)
1664 uint64_t equivalences =
statistics->sweep_equivalences;
1668 const unsigned scheduled = schedule_sweeping (&
sweeper);
1669 uint64_t swept = 0, limit = 10;
1671 if (
solver->inconsistent)
1677 unsigned idx = next_scheduled (&
sweeper);
1680 FLAGS (idx)->sweep =
false;
1684 sweep_variable (&
sweeper, idx);
1686 solver,
"swept[%" PRIu64
"] external variable %d %s", swept,
1687 kissat_export_literal (
solver,
LIT (idx)), res);
1688 if (++swept == limit) {
1690 "found %" PRIu64
" equivalences and %" PRIu64
1691 " units after sweeping %" PRIu64
" variables ",
1692 statistics->sweep_equivalences - equivalences,
1693 solver->statistics_.sweep_units - units, swept);
1698 equivalences =
statistics->sweep_equivalences - equivalences,
1699 units =
solver->statistics_.sweep_units - units;
1701 "found %" PRIu64
" equivalences and %" PRIu64
" units",
1702 equivalences, units);
1703 unschedule_sweeping (&
sweeper, swept, scheduled);
1704 unsigned inactive = release_sweeper (&
sweeper);
1706 if (!
solver->inconsistent) {
1714 solver->active -= inactive;
1716 solver->active += inactive;
1720 if (kissat_average (
eliminated, swept) < 0.001)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START void kissat_assign_unit(kissat *solver, unsigned lit, const char *reason)
#define RESIZE_STACK(S, NEW_SIZE)
#define all_stack(T, E, S)
#define SET_END_OF_STACK(S, P)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define all_scheduled(IDX)
#define CHECK_AND_ADD_UNIT(...)
#define REMOVE_CHECKER_CLAUSE(...)
#define CHECK_AND_ADD_STACK(...)
#define CHECK_AND_ADD_LITS(...)
#define CHECK_AND_ADD_EMPTY(...)
#define CHECK_AND_ADD_BINARY(...)
#define REMOVE_CHECKER_LITS(...)
#define REMOVE_CHECKER_BINARY(...)
void kissat_mark_clause_as_garbage(kissat *solver, clause *c)
void kissat_new_binary_clause(kissat *solver, unsigned first, unsigned second)
void kissat_enter_dense_mode(kissat *solver, litpairs *irredundant)
void kissat_resume_sparse_mode(kissat *solver, bool flush_eliminated, litpairs *irredundant)
void kissat_mark_added_literals(kissat *solver, unsigned size, unsigned *lits)
#define all_variables(IDX)
#define all_literals(LIT)
#define REDUCE_DELAY(NAME)
#define all_literals_in_clause(LIT, C)
#define KISSAT_assert(ignore)
int kitten_solve(kitten *kitten)
kitten * kitten_embedded(struct kissat *kissat)
void kitten_traverse_core_clauses(kitten *kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
bool kitten_flip_literal(kitten *kitten, unsigned elit)
void kitten_release(kitten *kitten)
void kitten_assume(kitten *kitten, unsigned elit)
void kitten_track_antecedents(kitten *kitten)
void kitten_clause(kitten *kitten, size_t size, unsigned *elits)
signed char kitten_fixed(kitten *kitten, unsigned elit)
int kitten_status(kitten *kitten)
void kitten_set_ticks_limit(kitten *kitten, uint64_t delta)
unsigned kitten_compute_clausal_core(kitten *kitten, uint64_t *learned_ptr)
void kitten_randomize_phases(kitten *kitten)
void kitten_clear(kitten *kitten)
signed char kitten_value(kitten *kitten, unsigned elit)
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD)
#define kissat_extremely_verbose(...)
#define kissat_very_verbose(...)
#define kissat_phase(...)
#define ADD_EMPTY_TO_PROOF(...)
#define ADD_UNIT_TO_PROOF(...)
#define ADD_BINARY_TO_PROOF(...)
#define DELETE_CLAUSE_FROM_PROOF(...)
#define DELETE_LITS_FROM_PROOF(...)
#define ADD_LITS_TO_PROOF(...)
#define DELETE_BINARY_FROM_PROOF(...)
#define ADD_STACK_TO_PROOF(...)
bool kissat_dense_propagate(kissat *solver)
clause * kissat_probing_propagate(kissat *solver, clause *ignore, bool flush)
#define RADIX_STACK(VTYPE, RTYPE, S, RANK)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
#define VALID_INTERNAL_INDEX(IDX)
struct sweeper::@220272220222261246232307276064033320167134062222 limit
#define LOGPARTITION(MESSAGE)
bool kissat_sweep(kissat *solver)
#define LOGBACKBONE(MESSAGE)
#define RANK_SWEEP_CANDIDATE(CAND)
#define sweep_terminated_5
#define sweep_terminated_2
#define sweep_terminated_6
#define sweep_terminated_4
#define sweep_terminated_1
#define sweep_terminated_7
#define sweep_terminated_3
#define sweep_terminated_8
void kissat_connect_irredundant_large_clauses(kissat *solver)
void kissat_substitute_large_watch(kissat *solver, watches *watches, watch src, watch dst)
#define BEGIN_WATCHES(WS)
#define PUSH_WATCHES(W, E)
#define SET_END_OF_WATCHES(WS, P)
#define all_binary_large_watches(WATCH, WATCHES)