19 unsigneds *candidates) {
21 unsigned not_rescheduled = 0;
26 const unsigned lit =
LIT (idx);
29 LOG (
"rescheduling backbone literal candidate %s",
LOGLIT (
lit));
33 const unsigned not_lit =
NOT (
lit);
35 LOG (
"rescheduling backbone literal candidate %s",
LOGLIT (not_lit));
40 const size_t rescheduled =
SIZE_STACK (*candidates);
41 const unsigned active_literals = 2u *
solver->active;
43 solver,
"rescheduled %zu backbone candidate literals %.0f%%",
44 rescheduled, kissat_percent (rescheduled, active_literals));
46 if (not_rescheduled) {
51 const unsigned lit =
LIT (idx);
53 LOG (
"scheduling backbone literal candidate %s",
LOGLIT (
lit));
57 const unsigned not_lit =
NOT (
lit);
58 LOG (
"scheduling backbone literal candidate %s",
LOGLIT (not_lit));
66 "scheduled %zu backbone candidate literals %.0f%%"
68 total, kissat_percent (total, active_literals));
73 unsigneds *candidates) {
75 size_t prioritized = 0;
78 const unsigned idx =
IDX (
lit);
103 const size_t active_literals = 2u *
solver->active;
105 if (prioritized == remain)
107 "keeping all remaining %zu backbone "
108 "candidates %.0f%% prioritized (all were)",
109 remain, kissat_percent (remain, active_literals));
110 else if (!prioritized) {
112 const unsigned idx =
IDX (
lit);
125 "keeping all remaining %zu backbone "
126 "candidates %.0f%% prioritized (none was)",
127 remain, kissat_percent (remain, active_literals));
130 "keeping %zu backbone candidates %.0f%% "
131 "prioritized (%.0f%% of remaining %zu)",
133 kissat_percent (prioritized, active_literals),
134 kissat_percent (prioritized, remain), remain);
138static inline void backbone_assign (
kissat *
solver, unsigned_array *trail,
140 unsigned lit,
unsigned reason) {
141 const unsigned not_lit =
NOT (
lit);
145 values[not_lit] = -1;
147 const unsigned idx =
IDX (
lit);
154backbone_propagate_literal (
kissat *
solver,
const bool stop_early,
155 const watches *
const all_watches,
162 const unsigned not_lit =
NOT (
lit);
170 const watch *
p = begin_watches;
172 while (
p != end_watches) {
181 return kissat_binary_conflict (
solver, not_lit, other);
184 LOG (
"backbone assign %s reason binary clause %s %s",
LOGLIT (other),
189 for (
const union watch *q =
p + 1; q != end_watches; q++) {
201 const size_t touched =
p - begin_watches;
202 solver->ticks += 1 + kissat_cache_lines (touched,
sizeof (
watch));
208 unsigned_array *trail,
211 const bool stop_early =
212 solver->large_clauses_watched_after_binary_clauses;
218 unsigned *propagate =
solver->propagate;
220 while (!conflict && propagate !=
END_ARRAY (*trail))
221 conflict = backbone_propagate_literal (
225 const unsigned propagated = propagate -
solver->propagate;
226 solver->propagate = propagate;
228 ADD (backbone_propagations, propagated);
229 ADD (probing_propagations, propagated);
230 ADD (propagations, propagated);
232 const uint64_t ticks =
solver->ticks;
234 ADD (backbone_ticks, ticks);
235 ADD (probing_ticks, ticks);
242 unsigned_array *trail,
value *values,
244 unsigned decision_level) {
246 unsigned *end_trail =
END_ARRAY (*trail);
248 LOG (
"backbone backtracking to trail level %zu and decision level %u",
249 (
size_t) (saved -
BEGIN_ARRAY (*trail)), decision_level);
250 while (saved != end_trail) {
251 const unsigned lit = *--end_trail;
252 const unsigned not_lit =
NOT (
lit);
256 values[
lit] = values[not_lit] = 0;
259 solver->level = decision_level;
260 solver->propagate = saved;
265 LOGCLS (conflict,
"backbone analyzing");
280 const unsigned lit_idx =
IDX (
lit);
289 const unsigned reason_idx =
IDX (
reason);
306check_large_clauses_watched_after_binary_clauses (
kissat *
solver) {
321 if (
solver->large_clauses_watched_after_binary_clauses)
322 check_large_clauses_watched_after_binary_clauses (
solver);
326 unsigneds candidates;
329 schedule_backbone_candidates (
solver, &candidates);
331 const size_t scheduled =
SIZE_STACK (candidates);
333#if defined(METRICS) && (!defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG))
334 const uint64_t implied_before =
solver->statistics_.backbone_implied;
347 size_t round_limit =
GET_OPTION (backbonerounds);
349 round_limit *=
solver->statistics_.backbone_computations;
350 const size_t max_rounds =
GET_OPTION (backbonemaxrounds);
351 if (round_limit > max_rounds)
352 round_limit = max_rounds;
357 if (round >= round_limit) {
361 const uint64_t ticks =
solver->statistics_.backbone_ticks;
362 if (ticks > ticks_limit) {
364 "backbone ticks limit %" PRIu64
" hit "
365 "after %" PRIu64
" ticks",
369 size_t previous = failed;
374 INC (backbone_rounds);
375 LOG (
"starting backbone round %zu", round);
376 unsigned *
const begin_candidates =
BEGIN_STACK (candidates);
378#if !defined(KISSAT_QUIET) && defined(METRICS)
379 size_t decisions = 0;
380 uint64_t propagated =
solver->statistics_.backbone_propagations;
382 unsigned active_before =
solver->active;
384 unsigned *q = begin_candidates;
385 const unsigned *
p = begin_candidates;
386 const unsigned *
const end_candidates =
END_STACK (candidates);
387 while (
p != end_candidates) {
389 const unsigned probe = *q++ = *
p++;
393 LOG (
"removing satisfied backbone probe %s",
LOGLIT (probe));
394 const unsigned idx =
IDX (probe);
403 const unsigned idx =
IDX (probe);
406 LOG (
"skipping falsified backbone probe %s",
LOGLIT (probe));
408 LOG (
"removing root-level falsified backbone probe %s",
414 if (
solver->statistics_.backbone_ticks > ticks_limit)
421#if !defined(KISSAT_QUIET) && defined(METRICS)
425 INC (backbone_probes);
428 LOG (
"backbone assume %s",
LOGLIT (probe));
432 LOG (
"propagating backbone probe %s successful",
LOGLIT (probe));
437 INC (backbone_units);
440 LOG (
"propagating backbone probe %s failed",
LOGLIT (probe));
441 unsigned uip = backbone_analyze (
solver, conflict);
442 unsigned not_uip =
NOT (uip);
448 LOG (
"backbone forced assign %s",
LOGLIT (not_uip));
453 LOG (
"propagating backbone forced %s failed",
LOGLIT (not_uip));
454 inconsistent = not_uip;
458 LOG (
"propagating backbone forced %s successful",
LOGLIT (not_uip));
461 size_t remain = end_candidates -
p;
464 "backbone round %zu aborted with "
465 "%zu candidates %.0f%% remaining",
467 kissat_percent (remain, scheduled));
470 "backbone round %zu completed with "
471 "all %zu scheduled candidates tried",
474 while (
p != end_candidates)
480 LOG (
"flushing satisfied probe candidates");
481 unsigned *q = begin_candidates;
482 const unsigned *
p = begin_candidates;
483 const unsigned *
const end_candidates =
END_STACK (candidates);
484 while (
p != end_candidates) {
485 const unsigned probe = *q++ = *
p++;
489 LOG (
"removing satisfied backbone probe %s",
LOGLIT (probe));
490 const unsigned idx =
IDX (probe);
499 LOG (
"keeping falsified probe %s",
LOGLIT (probe));
503 LOG (
"keeping unassigned probe %s",
LOGLIT (probe));
505 LOG (
"flushed %zu probe candidates",
511 if (inconsistent ==
INVALID_LIT && previous < failed) {
512 for (
size_t i = previous; i < failed; i++) {
514 LOG (
"assigning backbone unit %s",
LOGLIT (unit));
521 unsigned implied = active_before -
solver->active;
523 ADD (backbone_implied, implied);
526 propagated =
solver->statistics_.backbone_propagations - propagated;
528 "backbone round %zu with %zu decisions "
529 "(%.2f propagations per decision)",
531 kissat_average (propagated, decisions));
535 "backbone round %zu produced %zu failed literals"
536 " %u implied (%zu candidates left %.0f%%)",
537 round, failed - previous, implied, left,
538 kissat_percent (left, scheduled));
547 LOG (
"assuming forced unit %s",
LOGLIT (inconsistent));
555 "inconsistent binary clauses");
557 keep_backbone_candidates (
solver, &candidates);
558#if defined(METRICS) && (!defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG))
559 KISSAT_assert (implied_before <= solver->statistics_.backbone_implied);
561#if defined(METRICS) && !defined(KISSAT_QUIET)
562 const uint64_t total_implied =
563 solver->statistics_.backbone_implied - implied_before;
565 "found %zu backbone literals %" PRIu64
566 " implied in %zu rounds",
567 failed, total_implied, round);
585 INC (backbone_computations);
586#if !defined(KISSAT_NDEBUG) || defined(METRICS)
588 solver->backbone_computing =
true;
591 const unsigned failed =
593 compute_backbone (
solver);
595#if !defined(KISSAT_NDEBUG) || defined(METRICS)
597 solver->backbone_computing =
false;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void kissat_reset_only_analyzed_literals(kissat *solver)
void kissat_learned_unit(kissat *solver, unsigned lit)
void kissat_binary_clauses_backbone(kissat *solver)
#define all_stack(T, E, S)
#define SET_END_OF_STACK(S, P)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define all_variables(IDX)
#define all_literals(LIT)
#define KISSAT_assert(ignore)
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD)
#define kissat_extremely_verbose(...)
#define kissat_very_verbose(...)
#define kissat_phase(...)
clause * kissat_probing_propagate(kissat *solver, clause *ignore, bool flush)
#define VALID_INTERNAL_LITERAL(LIT)
#define backbone_terminated_2
#define backbone_terminated_1
#define backbone_terminated_3
#define all_binary_blocking_watches(WATCH, WATCHES)
#define END_CONST_WATCHES(WS)
#define BEGIN_CONST_WATCHES(WS)