19 unsigned *conflict_level_ptr) {
25 unsigned literals_on_conflict_level = 0;
30 unsigned *lits = conflict->
lits;
31 const unsigned conflict_size = conflict->
size;
32 const unsigned *
const end_of_lits = lits + conflict_size;
34 for (
const unsigned *
p = lits;
p != end_of_lits;
p++) {
35 const unsigned lit = *
p;
37 const unsigned idx =
IDX (
lit);
38 const unsigned lit_level = all_assigned[idx].
level;
39 if (conflict_level ==
INVALID_LEVEL || conflict_level < lit_level) {
40 literals_on_conflict_level = 1;
41 jump_level = conflict_level;
42 conflict_level = lit_level;
46 jump_level = lit_level;
47 if (conflict_level == lit_level)
48 literals_on_conflict_level++;
50 if (literals_on_conflict_level > 1 && conflict_level ==
solver->level)
56 LOG (
"found %u literals on conflict level %u", literals_on_conflict_level,
58 *conflict_level_ptr = conflict_level;
60 if (!conflict_level) {
61 solver->inconsistent =
true;
62 LOG (
"learned empty clause from conflict at conflict level zero");
68 if (conflict_level < solver->level) {
69 LOG (
"forced backtracking due to conflict level %u < level %u",
70 conflict_level,
solver->level);
74 if (conflict_size > 2) {
75 for (
unsigned i = 0; i < 2; i++) {
76 const unsigned lit = lits[i];
77 const unsigned lit_idx =
IDX (
lit);
78 unsigned highest_position = i;
79 unsigned highest_literal =
lit;
80 unsigned highest_level = all_assigned[lit_idx].
level;
81 for (
unsigned j = i + 1; j < conflict_size; j++) {
82 const unsigned other = lits[j];
83 const unsigned other_idx =
IDX (other);
84 const unsigned level = all_assigned[other_idx].
level;
85 if (highest_level >= level)
87 highest_literal = other;
89 highest_level = level;
90 if (highest_level == conflict_level)
93 if (highest_position == i)
96 if (highest_position > 1) {
97 ref = kissat_reference_clause (
solver, conflict);
98 kissat_unwatch_blocking (
solver,
lit, ref);
100 lits[highest_position] =
lit;
101 lits[i] = highest_literal;
102 if (highest_position > 1)
103 kissat_watch_blocking (
solver, lits[i], lits[!i], ref);
107 if (literals_on_conflict_level > 1)
115 LOG (
"reusing conflict as driving clause of %s",
LOGLIT (forced_lit));
120 if (conflict_size == 2) {
122 const unsigned other = lits[0] ^ lits[1] ^ forced_lit;
132static inline void mark_reason_side_literal (
kissat *
solver,
135 const unsigned idx =
IDX (
lit);
136 const assigned *a = all_assigned + idx;
138 kissat_push_analyzed (
solver, all_assigned, idx);
141static inline void analyze_reason_side_literal (
kissat *
solver,
142 size_t limit,
ward *arena,
145 const unsigned idx =
IDX (
lit);
146 const assigned *a = all_assigned + idx;
153 const unsigned other = a->
reason;
154 mark_reason_side_literal (
solver, all_assigned, other);
159 const unsigned not_lit =
NOT (
lit);
162 if (other != not_lit) {
164 mark_reason_side_literal (
solver, all_assigned, other);
171static void analyze_reason_side_literals (
kissat *
solver) {
180 const double decision_rate =
AVERAGE (decision_rate);
181 const int decision_rate_limit =
GET_OPTION (bumpreasonsrate);
182 if (decision_rate >= decision_rate_limit) {
183 LOG (
"decision rate %g >= limit %d", decision_rate,
184 decision_rate_limit);
192 LOG (
"trying to bump reason side literals too");
194 const size_t limit =
GET_OPTION (bumpreasonslimit) * saved;
195 LOG (
"analyzed already %zu literals thus limit %zu", saved, limit);
198 analyze_reason_side_literal (
solver, limit, arena, all_assigned,
lit);
203 LOG (
"too many additional reason side literals");
206 struct assigned *a = all_assigned + idx;
207 LOG (
"marking %s as not analyzed", LOGVAR (idx));
216#define RADIX_SORT_LEVELS_LIMIT 32
218#define RANK_LEVEL(A) (A)
219#define SMALLER_LEVEL(A, B) (RANK_LEVEL (A) < RANK_LEVEL (B))
222 unsigneds *levels = &
solver->levels;
228 LOG (
"sorted %zu levels", glue);
240 unsigned const *
p = end_levels;
241 while (
p != begin_levels) {
242 const unsigned level = *--
p;
245 const unsigned used = f->
used;
263 unsigneds *shadow = &
solver->shadow;
267 const unsigned not_uip = *begin_clause++;
272 for (
const unsigned *
p = begin_clause;
p != end_clause;
p++) {
273 const unsigned lit = *
p;
274 const unsigned idx =
IDX (
lit);
279 const unsigned pos = f->
used++;
288 while (
p != begin_levels) {
289 const unsigned level = *--
p;
292 const unsigned end = f->
used;
300 LOGTMP (
"level sorted deduced");
303 unsigned prev_level =
solver->level;
305 const unsigned idx =
IDX (
lit);
308 prev_level = lit_level;
346 unsigned not_removable = 0;
357static void reset_analysis_but_not_analyzed_literals (
kissat *
solver) {
366#if defined(LOGGING) || !defined(KISSAT_QUIET)
369 const unsigned active =
solver->active;
370 const double filled = kissat_percent (
assigned, active);
374 LOG (
"trail filled %.0f%% (size %u, unflushed %u, active %u)", filled,
375 size,
solver->unflushed, active);
381static void update_decision_rate_average (
kissat *
solver) {
384 const uint64_t previous =
387 const uint64_t decisions = current - previous;
388 solver->averages[
solver->stable].saved_decisions = current;
394 const unsigned failed =
FRAME (1).decision;
396 LOGCLS (conflict,
"analyzing failed literal %s conflict",
399 unsigneds *units = &
solver->clause;
403 const unsigned not_failed =
NOT (failed);
409 unsigned unresolved = 0;
414 if (
lit == not_failed) {
415 LOG (
"negation %s of failed literal %s occurs in conflict",
420 const unsigned idx =
IDX (
lit);
426 kissat_push_analyzed (
solver, all_assigned, idx);
437 const unsigned idx =
IDX (
lit);
438 a = all_assigned + idx;
440 if (unresolved == 1) {
442 LOG (
"learning additional unit %s",
LOGLIT (unit));
446 const unsigned other = a->
reason;
451 if (other == not_failed) {
452 LOG (
"negation %s of failed literal %s in reason",
456 const unsigned idx =
IDX (other);
460 LOG (
"analyzing reason literal %s",
LOGLIT (other));
461 kissat_push_analyzed (
solver, all_assigned, idx);
477 if (other == not_failed) {
478 LOG (
"negation %s of failed literal %s occurs in reason",
483 const unsigned idx =
IDX (other);
490 LOG (
"analyzing reason literal %s",
LOGLIT (other));
491 kissat_push_analyzed (
solver, all_assigned, idx);
497 LOG (
"after resolving %s there are %u unresolved literals",
501 LOG (
"learning negated failed literal %s",
LOGLIT (not_failed));
507 LOG (
"failed literal %s produced %zu units",
LOGLIT (failed),
524 if (
solver->limits.glue.interval < (1u << 16))
525 solver->limits.glue.interval *= 2;
530 if (
solver->inconsistent) {
537 update_trail_average (
solver);
538 update_decision_rate_average (
solver);
546 unsigned conflict_level;
547 if (one_literal_on_conflict_level (
solver, conflict, &conflict_level))
549 else if (!conflict_level)
551 else if (conflict_level == 1) {
552 analyze_failed_literal (
solver, conflict);
554 }
else if ((conflict =
556 reset_analysis_but_not_analyzed_literals (
solver);
559 update_tier_limits (
solver);
563 sort_deduced_clause (
solver);
568 analyze_reason_side_literals (
solver);
570 reset_analysis_but_not_analyzed_literals (
solver);
580 return res > 0 ? 0 : 20;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define RADIX_SORT_LEVELS_LIMIT
#define SMALLER_LEVEL(A, B)
void kissat_reset_only_analyzed_literals(kissat *solver)
int kissat_analyze(kissat *solver, clause *conflict)
ABC_NAMESPACE_HEADER_START typedef word ward
void kissat_learned_unit(kissat *solver, unsigned lit)
void kissat_assign_binary(kissat *solver, unsigned lit, unsigned other)
void kissat_assign_reference(kissat *solver, unsigned lit, reference ref, clause *reason)
void kissat_backtrack_without_updating_phases(kissat *solver, unsigned new_level)
void kissat_backtrack_after_conflict(kissat *solver, unsigned new_level)
void kissat_bump_analyzed(kissat *solver)
#define POKE_STACK(S, N, E)
#define all_stack(T, E, S)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define CHECK_AND_ADD_EMPTY(...)
clause * kissat_deduce_first_uip_clause(kissat *solver, clause *conflict)
#define UPDATE_AVERAGE(A, Y)
#define REDUCE_DELAY(NAME)
#define all_literals_in_clause(LIT, C)
#define KISSAT_assert(ignore)
#define SORT_STACK(TYPE, S, LESS)
void kissat_learn_clause(kissat *solver)
unsigned kissat_determine_new_level(kissat *solver, unsigned jump)
void kissat_update_learned(kissat *solver, unsigned glue, unsigned size)
void kissat_minimize_clause(kissat *solver)
#define ADD_EMPTY_TO_PROOF(...)
#define RADIX_STACK(VTYPE, RTYPE, S, RANK)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
void kissat_shrink_clause(kissat *solver)
void kissat_compute_and_set_tier_limits(struct kissat *solver)