ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
analyze.c
Go to the documentation of this file.
1#include "analyze.h"
2#include "backtrack.h"
3#include "bump.h"
4#include "deduce.h"
5#include "inline.h"
6#include "learn.h"
7#include "minimize.h"
8#include "print.h"
9#include "rank.h"
10#include "shrink.h"
11#include "sort.h"
12#include "tiers.h"
13
14#include <inttypes.h>
15
17
18static bool one_literal_on_conflict_level (kissat *solver, clause *conflict,
19 unsigned *conflict_level_ptr) {
20 KISSAT_assert (conflict);
21 KISSAT_assert (conflict->size > 1);
22
23 unsigned jump_level = INVALID_LEVEL;
24 unsigned conflict_level = INVALID_LEVEL;
25 unsigned literals_on_conflict_level = 0;
26 unsigned forced_lit = INVALID_LIT;
27
28 assigned *all_assigned = solver->assigned;
29
30 unsigned *lits = conflict->lits;
31 const unsigned conflict_size = conflict->size;
32 const unsigned *const end_of_lits = lits + conflict_size;
33
34 for (const unsigned *p = lits; p != end_of_lits; p++) {
35 const unsigned lit = *p;
36 KISSAT_assert (VALUE (lit) < 0);
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;
43 forced_lit = lit;
44 } else {
45 if (jump_level == INVALID_LEVEL || jump_level < lit_level)
46 jump_level = lit_level;
47 if (conflict_level == lit_level)
48 literals_on_conflict_level++;
49 }
50 if (literals_on_conflict_level > 1 && conflict_level == solver->level)
51 break;
52 }
53 KISSAT_assert (conflict_level != INVALID_LEVEL);
54 KISSAT_assert (literals_on_conflict_level);
55
56 LOG ("found %u literals on conflict level %u", literals_on_conflict_level,
57 conflict_level);
58 *conflict_level_ptr = conflict_level;
59
60 if (!conflict_level) {
61 solver->inconsistent = true;
62 LOG ("learned empty clause from conflict at conflict level zero");
65 return false;
66 }
67
68 if (conflict_level < solver->level) {
69 LOG ("forced backtracking due to conflict level %u < level %u",
70 conflict_level, solver->level);
72 }
73
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)
86 continue;
87 highest_literal = other;
88 highest_position = j;
89 highest_level = level;
90 if (highest_level == conflict_level)
91 break;
92 }
93 if (highest_position == i)
94 continue;
96 if (highest_position > 1) {
97 ref = kissat_reference_clause (solver, conflict);
98 kissat_unwatch_blocking (solver, lit, ref);
99 }
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);
104 }
105 }
106
107 if (literals_on_conflict_level > 1)
108 return false;
109
110 KISSAT_assert (literals_on_conflict_level == 1);
111 KISSAT_assert (forced_lit != INVALID_LIT);
112 KISSAT_assert (jump_level != INVALID_LEVEL);
113 KISSAT_assert (jump_level < conflict_level);
114
115 LOG ("reusing conflict as driving clause of %s", LOGLIT (forced_lit));
116
117 unsigned new_level = kissat_determine_new_level (solver, jump_level);
119
120 if (conflict_size == 2) {
121 KISSAT_assert (conflict == &solver->conflict);
122 const unsigned other = lits[0] ^ lits[1] ^ forced_lit;
123 kissat_assign_binary (solver, forced_lit, other);
124 } else {
125 const reference ref = kissat_reference_clause (solver, conflict);
126 kissat_assign_reference (solver, forced_lit, ref, conflict);
127 }
128
129 return true;
130}
131
132static inline void mark_reason_side_literal (kissat *solver,
133 assigned *all_assigned,
134 unsigned lit) {
135 const unsigned idx = IDX (lit);
136 const assigned *a = all_assigned + idx;
137 if (a->level && !a->analyzed)
138 kissat_push_analyzed (solver, all_assigned, idx);
139}
140
141static inline void analyze_reason_side_literal (kissat *solver,
142 size_t limit, ward *arena,
143 assigned *all_assigned,
144 unsigned lit) {
145 const unsigned idx = IDX (lit);
146 const assigned *a = all_assigned + idx;
147 KISSAT_assert (a->level);
150 if (a->reason == DECISION_REASON)
151 return;
152 if (a->binary) {
153 const unsigned other = a->reason;
154 mark_reason_side_literal (solver, all_assigned, other);
155 } else {
156 const reference ref = a->reason;
157 KISSAT_assert (ref < SIZE_STACK (solver->arena));
158 clause *c = (clause *) (arena + ref);
159 const unsigned not_lit = NOT (lit);
160 INC (search_ticks);
161 for (all_literals_in_clause (other, c))
162 if (other != not_lit) {
163 KISSAT_assert (other != lit);
164 mark_reason_side_literal (solver, all_assigned, other);
165 if (SIZE_STACK (solver->analyzed) > limit)
166 break;
167 }
168 }
169}
170
171static void analyze_reason_side_literals (kissat *solver) {
172 if (!GET_OPTION (bump))
173 return;
174 if (!GET_OPTION (bumpreasons))
175 return;
176 if (solver->probing)
177 return;
178 if (DELAYING (bumpreasons))
179 return;
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);
185 return;
186 }
187 assigned *all_assigned = solver->assigned;
188#ifndef KISSAT_NDEBUG
189 for (all_stack (unsigned, lit, solver->clause))
190 KISSAT_assert (all_assigned[IDX (lit)].analyzed);
191#endif
192 LOG ("trying to bump reason side literals too");
193 const size_t saved = SIZE_STACK (solver->analyzed);
194 const size_t limit = GET_OPTION (bumpreasonslimit) * saved;
195 LOG ("analyzed already %zu literals thus limit %zu", saved, limit);
196 ward *arena = BEGIN_STACK (solver->arena);
197 for (all_stack (unsigned, lit, solver->clause)) {
198 analyze_reason_side_literal (solver, limit, arena, all_assigned, lit);
199 if (SIZE_STACK (solver->analyzed) > limit)
200 break;
201 }
202 if (SIZE_STACK (solver->analyzed) > limit) {
203 LOG ("too many additional reason side literals");
204 while (SIZE_STACK (solver->analyzed) > saved) {
205 const unsigned idx = POP_STACK (solver->analyzed);
206 struct assigned *a = all_assigned + idx;
207 LOG ("marking %s as not analyzed", LOGVAR (idx));
209 a->analyzed = false;
210 }
211 BUMP_DELAY (bumpreasons);
212 } else
213 REDUCE_DELAY (bumpreasons);
214}
215
216#define RADIX_SORT_LEVELS_LIMIT 32
217
218#define RANK_LEVEL(A) (A)
219#define SMALLER_LEVEL(A, B) (RANK_LEVEL (A) < RANK_LEVEL (B))
220
221static void sort_levels (kissat *solver) {
222 unsigneds *levels = &solver->levels;
223 size_t glue = SIZE_STACK (*levels);
224 if (glue < RADIX_SORT_LEVELS_LIMIT)
225 SORT_STACK (unsigned, *levels, SMALLER_LEVEL);
226 else
227 RADIX_STACK (unsigned, unsigned, *levels, RANK_LEVEL);
228 LOG ("sorted %zu levels", glue);
229}
230
231static void sort_deduced_clause (kissat *solver) {
232 sort_levels (solver);
233#ifndef KISSAT_NDEBUG
234 const size_t size_frames = SIZE_STACK (solver->frames);
235#endif
236 frame *frames = BEGIN_STACK (solver->frames);
237 unsigned pos = 1;
238 const unsigned *const begin_levels = BEGIN_STACK (solver->levels);
239 const unsigned *const end_levels = END_STACK (solver->levels);
240 unsigned const *p = end_levels;
241 while (p != begin_levels) {
242 const unsigned level = *--p;
243 KISSAT_assert (level < size_frames);
244 frame *f = frames + level;
245 const unsigned used = f->used;
246#ifndef KISSAT_NDEBUG
247 f->saved = used;
248#endif
249 KISSAT_assert (used > 0);
250 KISSAT_assert (UINT_MAX - used >= pos);
251 f->used = pos;
252 pos += used;
253 }
254 unsigneds *clause = &solver->clause;
255 const size_t size_clause = SIZE_STACK (*clause);
256#ifndef KISSAT_NDEBUG
257 KISSAT_assert (pos == size_clause);
258#endif
259 unsigned const *begin_clause = BEGIN_STACK (*clause);
260 const unsigned *const end_clause = END_STACK (*clause);
261 KISSAT_assert (begin_clause < end_clause);
262
263 unsigneds *shadow = &solver->shadow;
264 while (SIZE_STACK (*shadow) < size_clause)
265 PUSH_STACK (*shadow, INVALID_LIT);
266
267 const unsigned not_uip = *begin_clause++;
268 POKE_STACK (*shadow, 0, not_uip);
269
270 const assigned *const assigned = solver->assigned;
271
272 for (const unsigned *p = begin_clause; p != end_clause; p++) {
273 const unsigned lit = *p;
274 const unsigned idx = IDX (lit);
275 const struct assigned *a = assigned + idx;
276 const unsigned level = a->level;
277 KISSAT_assert (level < size_frames);
278 frame *f = frames + level;
279 const unsigned pos = f->used++;
280 POKE_STACK (*shadow, pos, lit);
281 }
282
283 KISSAT_assert (size_clause == SIZE_STACK (*shadow));
284 SWAP (unsigneds, *clause, *shadow);
285
286 pos = 1;
287 p = end_levels;
288 while (p != begin_levels) {
289 const unsigned level = *--p;
290 KISSAT_assert (level < size_frames);
291 frame *f = frames + level;
292 const unsigned end = f->used;
293 KISSAT_assert (pos < end);
294 f->used = end - pos;
295 KISSAT_assert (f->used == f->saved);
296 pos = end;
297 }
298
299 CLEAR_STACK (*shadow);
300 LOGTMP ("level sorted deduced");
301
302#ifndef KISSAT_NDEBUG
303 unsigned prev_level = solver->level;
304 for (all_stack (unsigned, lit, solver->clause)) {
305 const unsigned idx = IDX (lit);
306 const unsigned lit_level = assigned[idx].level;
307 KISSAT_assert (prev_level >= lit_level);
308 prev_level = lit_level;
309 }
310#endif
311}
312
313static void reset_levels (kissat *solver) {
314 LOG ("reset %zu marked levels", SIZE_STACK (solver->levels));
315 frame *frames = BEGIN_STACK (solver->frames);
316#ifndef KISSAT_NDEBUG
317 const size_t size_frames = SIZE_STACK (solver->frames);
318#endif
319 for (all_stack (unsigned, level, solver->levels)) {
320 KISSAT_assert (level < size_frames);
321 frame *f = frames + level;
322 KISSAT_assert (f->used > 0);
323 f->used = 0;
324 }
325 CLEAR_STACK (solver->levels);
326}
327
329 LOG ("reset %zu analyzed variables", SIZE_STACK (solver->analyzed));
330 assigned *assigned = solver->assigned;
331 for (all_stack (unsigned, idx, solver->analyzed)) {
332 KISSAT_assert (idx < VARS);
333 struct assigned *a = assigned + idx;
337 a->analyzed = false;
338 }
339 CLEAR_STACK (solver->analyzed);
340}
341
342static void reset_removable (kissat *solver) {
343 LOG ("reset %zu removable variables", SIZE_STACK (solver->removable));
344 assigned *assigned = solver->assigned;
345#ifndef KISSAT_NDEBUG
346 unsigned not_removable = 0;
347#endif
348 for (all_stack (unsigned, idx, solver->removable)) {
349 KISSAT_assert (idx < VARS);
350 struct assigned *a = assigned + idx;
351 KISSAT_assert (a->removable || !not_removable++);
352 a->removable = false;
353 }
354 CLEAR_STACK (solver->removable);
355}
356
357static void reset_analysis_but_not_analyzed_literals (kissat *solver) {
358 reset_removable (solver);
359 reset_levels (solver);
360 LOG ("reset %zu learned literals", SIZE_STACK (solver->clause));
361 CLEAR_STACK (solver->clause);
362}
363
364static void update_trail_average (kissat *solver) {
365 KISSAT_assert (!solver->probing);
366#if defined(LOGGING) || !defined(KISSAT_QUIET)
367 const unsigned size = SIZE_ARRAY (solver->trail);
368 const unsigned assigned = size - solver->unflushed;
369 const unsigned active = solver->active;
370 const double filled = kissat_percent (assigned, active);
371#else
372 (void) solver;
373#endif
374 LOG ("trail filled %.0f%% (size %u, unflushed %u, active %u)", filled,
375 size, solver->unflushed, active);
376#ifndef KISSAT_QUIET
377 UPDATE_AVERAGE (trail, filled);
378#endif
379}
380
381static void update_decision_rate_average (kissat *solver) {
382 KISSAT_assert (!solver->probing);
383 const uint64_t current = DECISIONS;
384 const uint64_t previous =
385 solver->averages[solver->stable].saved_decisions;
386 KISSAT_assert (previous <= current);
387 const uint64_t decisions = current - previous;
388 solver->averages[solver->stable].saved_decisions = current;
389 UPDATE_AVERAGE (decision_rate, decisions);
390}
391
392static void analyze_failed_literal (kissat *solver, clause *conflict) {
393 KISSAT_assert (solver->level == 1);
394 const unsigned failed = FRAME (1).decision;
395
396 LOGCLS (conflict, "analyzing failed literal %s conflict",
397 LOGLIT (failed));
398
399 unsigneds *units = &solver->clause;
400 KISSAT_assert (EMPTY_STACK (*units));
401 KISSAT_assert (EMPTY_STACK (solver->analyzed));
402
403 const unsigned not_failed = NOT (failed);
404 assigned *all_assigned = solver->assigned;
405#ifndef KISSAT_NDEBUG
406 const value *const values = solver->values;
407#endif
408 unsigned const *t = END_ARRAY (solver->trail);
409 unsigned unresolved = 0;
410 unsigned unit = INVALID_LIT;
411
412 for (all_literals_in_clause (lit, conflict)) {
413 KISSAT_assert (lit != failed);
414 if (lit == not_failed) {
415 LOG ("negation %s of failed literal %s occurs in conflict",
416 LOGLIT (not_failed), LOGLIT (failed));
417 goto DONE;
418 }
419 KISSAT_assert (values[lit] < 0);
420 const unsigned idx = IDX (lit);
421 assigned *a = all_assigned + idx;
422 if (!a->level)
423 continue;
424 KISSAT_assert (a->level == 1);
425 LOG ("analyzing conflict literal %s", LOGLIT (lit));
426 kissat_push_analyzed (solver, all_assigned, idx);
427 unresolved++;
428 }
429
430 for (;;) {
431 unsigned lit;
432 assigned *a;
433 do {
434 KISSAT_assert (t > BEGIN_ARRAY (solver->trail));
435 lit = *--t;
436 KISSAT_assert (values[lit] > 0);
437 const unsigned idx = IDX (lit);
438 a = all_assigned + idx;
439 } while (!a->analyzed);
440 if (unresolved == 1) {
441 unit = NOT (lit);
442 LOG ("learning additional unit %s", LOGLIT (unit));
443 PUSH_STACK (*units, unit);
444 }
445 if (a->binary) {
446 const unsigned other = a->reason;
447 LOGBINARY (lit, other, "resolving %s reason", LOGLIT (lit));
448 KISSAT_assert (other != failed);
449 KISSAT_assert (other != unit);
450 KISSAT_assert (values[other] < 0);
451 if (other == not_failed) {
452 LOG ("negation %s of failed literal %s in reason",
453 LOGLIT (not_failed), LOGLIT (failed));
454 goto DONE;
455 }
456 const unsigned idx = IDX (other);
457 assigned *b = all_assigned + idx;
458 KISSAT_assert (b->level == 1);
459 if (!b->analyzed) {
460 LOG ("analyzing reason literal %s", LOGLIT (other));
461 kissat_push_analyzed (solver, all_assigned, idx);
462 unresolved++;
463 }
464 } else {
467 const reference ref = a->reason;
468 LOGREF (ref, "resolving %s reason", LOGLIT (lit));
469 clause *reason = kissat_dereference_clause (solver, ref);
470 for (all_literals_in_clause (other, reason)) {
471 KISSAT_assert (other != NOT (lit));
472 KISSAT_assert (other != failed);
473 if (other == lit)
474 continue;
475 if (other == unit)
476 continue;
477 if (other == not_failed) {
478 LOG ("negation %s of failed literal %s occurs in reason",
479 LOGLIT (not_failed), LOGLIT (failed));
480 goto DONE;
481 }
482 KISSAT_assert (values[other] < 0);
483 const unsigned idx = IDX (other);
484 assigned *b = all_assigned + idx;
485 if (!b->level)
486 continue;
487 KISSAT_assert (b->level == 1);
488 if (b->analyzed)
489 continue;
490 LOG ("analyzing reason literal %s", LOGLIT (other));
491 kissat_push_analyzed (solver, all_assigned, idx);
492 unresolved++;
493 }
494 }
495 KISSAT_assert (unresolved > 0);
496 unresolved--;
497 LOG ("after resolving %s there are %u unresolved literals",
498 LOGLIT (lit), unresolved);
499 }
500DONE:
501 LOG ("learning negated failed literal %s", LOGLIT (not_failed));
502 PUSH_STACK (*units, not_failed);
503
504 if (!solver->probing)
506
507 LOG ("failed literal %s produced %zu units", LOGLIT (failed),
508 SIZE_STACK (*units));
509
511
512 for (all_stack (unsigned, lit, *units))
514 CLEAR_STACK (*units);
515 if (!solver->probing) {
516 solver->iterating = true;
517 INC (iterations);
518 }
519}
520
521static void update_tier_limits (kissat *solver) {
522 INC (retiered);
524 if (solver->limits.glue.interval < (1u << 16))
525 solver->limits.glue.interval *= 2;
526 solver->limits.glue.conflicts = CONFLICTS + solver->limits.glue.interval;
527}
528
530 if (solver->inconsistent) {
531 KISSAT_assert (!solver->level);
532 return 20;
533 }
534
535 START (analyze);
536 if (!solver->probing) {
537 update_trail_average (solver);
538 update_decision_rate_average (solver);
539#ifndef KISSAT_QUIET
540 UPDATE_AVERAGE (level, solver->level);
541#endif
542 }
543 int res;
544 do {
545 LOGCLS (conflict, "analyzing conflict %" PRIu64, CONFLICTS);
546 unsigned conflict_level;
547 if (one_literal_on_conflict_level (solver, conflict, &conflict_level))
548 res = 1;
549 else if (!conflict_level)
550 res = -1;
551 else if (conflict_level == 1) {
552 analyze_failed_literal (solver, conflict);
553 res = 1;
554 } else if ((conflict =
556 reset_analysis_but_not_analyzed_literals (solver);
557 INC (conflicts);
558 if (CONFLICTS > solver->limits.glue.conflicts)
559 update_tier_limits (solver);
560 res = 0; // And continue with new conflict analysis.
561 } else {
562 if (GET_OPTION (minimize)) {
563 sort_deduced_clause (solver);
565 if (GET_OPTION (shrink))
567 }
568 analyze_reason_side_literals (solver);
570 reset_analysis_but_not_analyzed_literals (solver);
571 res = 1;
572 }
573 if (!EMPTY_STACK (solver->analyzed)) {
574 if (!solver->probing && GET_OPTION (bump))
577 }
578 } while (!res);
579 STOP (analyze);
580 return res > 0 ? 0 : 20;
581}
582
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define RADIX_SORT_LEVELS_LIMIT
Definition analyze.c:216
#define SMALLER_LEVEL(A, B)
Definition analyze.c:219
void kissat_reset_only_analyzed_literals(kissat *solver)
Definition analyze.c:328
int kissat_analyze(kissat *solver, clause *conflict)
Definition analyze.c:529
#define RANK_LEVEL(A)
Definition analyze.c:218
ABC_NAMESPACE_HEADER_START typedef word ward
Definition arena.h:12
#define SIZE_ARRAY
Definition array.h:24
#define BEGIN_ARRAY
Definition array.h:50
#define END_ARRAY
Definition array.h:51
void kissat_learned_unit(kissat *solver, unsigned lit)
Definition assign.c:18
void kissat_assign_binary(kissat *solver, unsigned lit, unsigned other)
Definition assign.c:34
void kissat_assign_reference(kissat *solver, unsigned lit, reference ref, clause *reason)
Definition assign.c:49
#define DECISION_REASON
Definition assign.h:9
#define INVALID_LEVEL
Definition assign.h:12
#define UNIT_REASON
Definition assign.h:10
#define AVERAGE(NAME)
Definition averages.h:31
void kissat_backtrack_without_updating_phases(kissat *solver, unsigned new_level)
Definition backtrack.c:74
void kissat_backtrack_after_conflict(kissat *solver, unsigned new_level)
Definition backtrack.c:158
void kissat_bump_analyzed(kissat *solver)
Definition bump.c:105
#define BEGIN_STACK(S)
Definition stack.h:46
#define POP_STACK(S)
Definition stack.h:37
#define POKE_STACK(S, N, E)
Definition stack.h:32
#define all_stack(T, E, S)
Definition stack.h:94
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define CLEAR_STACK(S)
Definition stack.h:50
#define PUSH_STACK(S, E)
Definition stack.h:39
#define END_STACK(S)
Definition stack.h:48
#define INVALID_LIT
#define INC(NAME)
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define CHECK_AND_ADD_EMPTY(...)
Definition check.h:146
clause * kissat_deduce_first_uip_clause(kissat *solver, clause *conflict)
Definition deduce.c:72
#define UPDATE_AVERAGE(A, Y)
Definition ema.hpp:56
bool pos
Definition globals.c:30
Cube * p
Definition exorList.c:222
#define FRAME(LEVEL)
Definition frames.h:33
@ DONE
Definition inflate.h:51
#define VARS
Definition internal.h:250
#define BUMP_DELAY(NAME)
Definition kimits.h:183
#define REDUCE_DELAY(NAME)
Definition kimits.h:185
#define DELAYING(NAME)
Definition kimits.h:181
#define all_literals_in_clause(LIT, C)
Definition clause.h:47
#define KISSAT_assert(ignore)
Definition global.h:13
#define SORT_STACK(TYPE, S, LESS)
Definition sort.h:148
#define solver
Definition kitten.c:211
void kissat_learn_clause(kissat *solver)
Definition learn.c:192
unsigned kissat_determine_new_level(kissat *solver, unsigned jump)
Definition learn.c:18
void kissat_update_learned(kissat *solver, unsigned glue, unsigned size)
Definition learn.c:120
#define LOGREF(...)
Definition logging.h:433
#define LOGBINARY(...)
Definition logging.h:442
#define LOGCLS(...)
Definition logging.h:415
#define LOGTMP(...)
Definition logging.h:463
#define LOGLIT(...)
Definition logging.hpp:99
void kissat_minimize_clause(kissat *solver)
Definition minimize.c:157
unsigned long long size
Definition giaNewBdd.h:39
unsigned short ref
Definition giaNewBdd.h:38
#define GET_OPTION(N)
Definition options.h:295
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define ADD_EMPTY_TO_PROOF(...)
Definition proof.h:135
#define RADIX_STACK(VTYPE, RTYPE, S, RANK)
Definition rank.h:136
#define INVALID_REF
Definition reference.h:16
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
int lit
Definition satVec.h:130
#define IDX(LIT)
Definition literal.h:28
#define NOT(LIT)
Definition literal.h:33
void kissat_shrink_clause(kissat *solver)
Definition shrink.c:362
#define CONFLICTS
Definition statistics.h:335
#define DECISIONS
Definition statistics.h:336
bool binary
Definition assign.h:23
bool analyzed
Definition assign.h:22
unsigned trail
Definition assign.h:20
bool removable
Definition assign.h:25
bool poisoned
Definition assign.h:24
unsigned reason
Definition assign.h:28
bool shrinkable
Definition assign.h:26
unsigned level
Definition assign.h:19
unsigned lits[3]
Definition clause.h:39
unsigned size
Definition clause.h:37
Definition frames.h:15
unsigned used
Definition frames.h:19
void kissat_compute_and_set_tier_limits(struct kissat *solver)
Definition tiers.c:53
#define SWAP(TYPE, A, B)
Definition utilities.h:151
#define VALUE(LIT)
Definition value.h:10