ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
eliminate.c
Go to the documentation of this file.
1#include "eliminate.h"
2#include "allocate.h"
3#include "backtrack.h"
4#include "collect.h"
5#include "dense.h"
6#include "forward.h"
7#include "inline.h"
8#include "inlineheap.h"
9#include "kitten.h"
10#include "print.h"
11#include "propdense.h"
12#include "report.h"
13#include "resolve.h"
14#include "terminate.h"
15#include "trail.h"
16#include "weaken.h"
17
18#include <inttypes.h>
19#include <math.h>
20
22
24 if (!solver->enabled.eliminate)
25 return false;
26 statistics *statistics = &solver->statistics_;
27 if (!statistics->clauses_irredundant)
28 return false;
29 const uint64_t conflicts = statistics->conflicts;
30 if (solver->last.conflicts.reduce == conflicts)
31 return false;
32 limits *limits = &solver->limits;
33 if (limits->eliminate.conflicts > conflicts)
34 return false;
35 if (limits->eliminate.variables.eliminate <
36 statistics->variables_eliminate)
37 return true;
38 if (limits->eliminate.variables.subsume < statistics->variables_subsume)
39 return true;
40 return false;
41}
42
43static inline double variable_score (kissat *solver, unsigned idx) {
44 const unsigned lit = LIT (idx);
45 const unsigned not_lit = NOT (lit);
46 size_t occlim = GET_OPTION (eliminateocclim);
47 size_t pos = SIZE_WATCHES (WATCHES (lit));
48 size_t neg = SIZE_WATCHES (WATCHES (not_lit));
49 if (pos > occlim)
50 pos = occlim;
51 if (neg > occlim)
52 neg = occlim;
53 double prod = pos * neg;
54 double sum = pos + neg;
55 double occlim2 = occlim * (double) occlim;
56 KISSAT_assert (prod <= occlim2);
57 double score = prod - sum;
58 KISSAT_assert (score <= occlim2);
59 double relevancy;
60 if (solver->stable)
61 relevancy = kissat_get_heap_score (&solver->scores, idx);
62 else
63 relevancy = LINK (idx).stamp;
64 double res = relevancy + score - occlim2;
65 LOG ("variable score of %s computed as "
66 "%g = %g + (%zu*%zu - %zu - %zu) - %g"
67 " = %g + %g - %g",
68 LOGVAR (idx), res, relevancy, pos, neg, pos, neg, occlim2, relevancy,
69 score, occlim2);
70 return res;
71}
72
73static inline void update_variable_score (kissat *solver, heap *schedule,
74 unsigned idx) {
75 KISSAT_assert (schedule->size);
76 KISSAT_assert (schedule == &solver->schedule);
77 double new_score = variable_score (solver, idx);
78 LOG ("new score %g for variable %s", new_score, LOGVAR (idx));
79 kissat_update_heap (solver, schedule, idx, -new_score);
80}
81
83 update_variable_score (solver, &solver->schedule, idx);
84}
85
86static inline void update_after_adding_stack (kissat *solver,
87 unsigneds *stack) {
88 KISSAT_assert (!solver->probing);
89 heap *schedule = &solver->schedule;
90 if (!schedule->size)
91 return;
92 for (all_stack (unsigned, lit, *stack))
93 update_variable_score (solver, schedule, IDX (lit));
94}
95
96static inline void update_after_removing_variable (kissat *solver,
97 unsigned idx) {
98 heap *schedule = &solver->schedule;
99 if (!schedule->size)
100 return;
101 KISSAT_assert (!solver->probing);
102 flags *f = solver->flags + idx;
103 if (f->fixed)
104 return;
106 update_variable_score (solver, schedule, idx);
107 if (!kissat_heap_contains (schedule, idx))
108 kissat_push_heap (solver, schedule, idx);
109}
110
111static inline void update_after_removing_clause (kissat *solver, clause *c,
112 unsigned except) {
113 if (!solver->schedule.size)
114 return;
116 for (all_literals_in_clause (lit, c))
117 if (lit != except)
118 update_after_removing_variable (solver, IDX (lit));
119}
120
122 unsigned other) {
123 kissat_disconnect_binary (solver, other, lit);
125 update_after_removing_variable (solver, IDX (other));
126}
127
130 update_after_removing_clause (solver, c, lit);
131}
132
133static unsigned schedule_variables (kissat *solver) {
134 LOG ("initializing variable schedule");
135 KISSAT_assert (!solver->schedule.size);
136
137 kissat_resize_heap (solver, &solver->schedule, solver->vars);
138
139 flags *all_flags = solver->flags;
140
141 size_t scheduled = 0;
142 for (all_variables (idx)) {
143 flags *flags = all_flags + idx;
144 if (!flags->active)
145 continue;
146 if (!flags->eliminate)
147 continue;
148 LOG ("scheduling %s", LOGVAR (idx));
149 scheduled++;
150 update_after_removing_variable (solver, idx);
151 }
152 KISSAT_assert (scheduled == kissat_size_heap (&solver->schedule));
153#ifndef KISSAT_QUIET
154 size_t active = solver->active;
155 kissat_phase (solver, "eliminate", GET (eliminations),
156 "scheduled %zu variables %.0f%%", scheduled,
157 kissat_percent (scheduled, active));
158#endif
159 return scheduled;
160}
161
163 const unsigned *propagate = solver->propagate;
164 const unsigned *end_trail = END_ARRAY (solver->trail);
165 KISSAT_assert (propagate <= end_trail);
166 const size_t units = end_trail - propagate;
167 if (!units)
168 return;
169#ifdef LOGGING
170 LOG ("propagating and flushing %zu units", units);
171#endif
173 return;
174 LOG ("marking and flushing unit satisfied clauses");
175
176 end_trail = END_ARRAY (solver->trail);
177 while (propagate != end_trail) {
178 const unsigned unit = *propagate++;
179 watches *unit_watches = &WATCHES (unit);
180 watch *begin = BEGIN_WATCHES (*unit_watches), *q = begin;
181 const watch *const end = END_WATCHES (*unit_watches), *p = q;
182 if (begin == end)
183 continue;
184 LOG ("marking %s satisfied clauses as garbage", LOGLIT (unit));
185 while (p != end) {
186 const watch watch = *q++ = *p++;
187 if (watch.type.binary) {
188 const unsigned other = watch.binary.lit;
189 if (!solver->values[other])
190 update_after_removing_variable (solver, IDX (other));
191 } else {
192 const reference ref = watch.large.ref;
193 clause *c = kissat_dereference_clause (solver, ref);
194 if (!c->garbage)
197 q--;
198 }
199 }
200 KISSAT_assert (q <= end);
201 size_t flushed = end - q;
202 if (!flushed)
203 continue;
204 LOG ("flushing %zu references satisfied by %s", flushed, LOGLIT (unit));
205 SET_END_OF_WATCHES (*unit_watches, q);
206 }
207}
208
209static void connect_resolvents (kissat *solver) {
210 const value *const values = solver->values;
211 KISSAT_assert (EMPTY_STACK (solver->clause));
212 bool satisfied = false;
213#ifdef LOGGING
214 uint64_t added = 0;
215#endif
216 for (all_stack (unsigned, other, solver->resolvents)) {
217 if (other == INVALID_LIT) {
218 if (satisfied)
219 satisfied = false;
220 else {
221 LOGTMP ("temporary resolvent");
222 const size_t size = SIZE_STACK (solver->clause);
223 if (!size) {
224 KISSAT_assert (!solver->inconsistent);
225 LOG ("resolved empty clause");
228 solver->inconsistent = true;
229 break;
230 } else if (size == 1) {
231 const unsigned unit = PEEK_STACK (solver->clause, 0);
232 LOG ("resolved unit clause %s", LOGLIT (unit));
234 } else {
235 KISSAT_assert (size > 1);
237 update_after_adding_stack (solver, &solver->clause);
238#ifdef LOGGING
239 added++;
240#endif
241 }
242 }
243 CLEAR_STACK (solver->clause);
244 } else if (!satisfied) {
245 const value value = values[other];
246 if (value > 0) {
247 LOGTMP ("now %s satisfied resolvent", LOGLIT (other));
248 satisfied = true;
249 } else if (value < 0)
250 LOG2 ("dropping now falsified literal %s", LOGLIT (other));
251 else
252 PUSH_STACK (solver->clause, other);
253 }
254 }
255 LOG ("added %" PRIu64 " new clauses", added);
256 CLEAR_STACK (solver->resolvents);
257}
258
259static void weaken_clauses (kissat *solver, unsigned lit) {
260 const unsigned not_lit = NOT (lit);
261
262 const value *const values = solver->values;
263 KISSAT_assert (!values[lit]);
264
265 watches *pos_watches = &WATCHES (lit);
266
267 for (all_binary_large_watches (watch, *pos_watches)) {
268 if (watch.type.binary) {
269 const unsigned other = watch.binary.lit;
270 const value value = values[other];
271 if (value <= 0)
274 } else {
275 const reference ref = watch.large.ref;
276 clause *c = kissat_dereference_clause (solver, ref);
277 if (c->garbage)
278 continue;
279 bool satisfied = false;
280 for (all_literals_in_clause (other, c)) {
281 const value value = values[other];
282 if (value <= 0)
283 continue;
284 satisfied = true;
285 break;
286 }
287 if (!satisfied)
289 LOGCLS (c, "removing %s", LOGLIT (lit));
291 }
292 }
293 RELEASE_WATCHES (*pos_watches);
294
295 watches *neg_watches = &WATCHES (not_lit);
296
297 bool optimize = !GET_OPTION (incremental);
298 for (all_binary_large_watches (watch, *neg_watches)) {
299 if (watch.type.binary) {
300 const unsigned other = watch.binary.lit;
301 const value value = values[other];
302 if (!optimize && value <= 0)
303 kissat_weaken_binary (solver, not_lit, other);
304 kissat_eliminate_binary (solver, not_lit, other);
305 } else {
306 const reference ref = watch.large.ref;
307 clause *d = kissat_dereference_clause (solver, ref);
308 if (d->garbage)
309 continue;
310 bool satisfied = false;
311 for (all_literals_in_clause (other, d)) {
312 const value value = values[other];
313 if (value <= 0)
314 continue;
315 satisfied = true;
316 break;
317 }
318 if (!optimize && !satisfied)
319 kissat_weaken_clause (solver, not_lit, d);
320 LOGCLS (d, "removing %s", LOGLIT (not_lit));
321 kissat_eliminate_clause (solver, d, not_lit);
322 }
323 }
324 if (optimize && !EMPTY_WATCHES (*neg_watches))
325 kissat_weaken_unit (solver, not_lit);
326 RELEASE_WATCHES (*neg_watches);
327
329}
330
331static void try_to_eliminate_all_variables_again (kissat *solver) {
332 LOG ("trying to elimination all variables again");
333 flags *all_flags = solver->flags;
334 for (all_variables (idx)) {
335 flags *flags = all_flags + idx;
336 flags->eliminate = true;
337 }
338 solver->limits.eliminate.variables.eliminate = 0;
339}
340
341static void set_next_elimination_bound (kissat *solver, bool complete) {
342 const unsigned max_bound = GET_OPTION (eliminatebound);
343 const unsigned current_bound =
344 solver->bounds.eliminate.additional_clauses;
345 KISSAT_assert (current_bound <= max_bound);
346
347 if (complete) {
348 if (current_bound == max_bound) {
349 kissat_phase (solver, "eliminate", GET (eliminations),
350 "completed maximum elimination bound %u",
351 current_bound);
352 limits *limits = &solver->limits;
353 statistics *statistics = &solver->statistics_;
354 limits->eliminate.variables.eliminate =
355 statistics->variables_eliminate;
356 limits->eliminate.variables.subsume = statistics->variables_subsume;
357#ifndef KISSAT_QUIET
358 bool first = !solver->bounds.eliminate.max_bound_completed++;
359 REPORT (!first, first ? '!' : ':');
360#endif
361 } else {
362 const unsigned next_bound =
363 !current_bound ? 1 : MIN (2 * current_bound, max_bound);
364 kissat_phase (solver, "eliminate", GET (eliminations),
365 "completed elimination bound %u next %u", current_bound,
366 next_bound);
367 solver->bounds.eliminate.additional_clauses = next_bound;
368 try_to_eliminate_all_variables_again (solver);
369 REPORT (0, '^');
370 }
371 } else
372 kissat_phase (solver, "eliminate", GET (eliminations),
373 "incomplete elimination bound %u", current_bound);
374}
375
376static bool can_eliminate_variable (kissat *solver, unsigned idx) {
377 flags *flags = FLAGS (idx);
378
379 if (!flags->active)
380 return false;
381 if (!flags->eliminate)
382 return false;
383
384 return true;
385}
386
387static bool eliminate_variable (kissat *solver, unsigned idx) {
388 LOG ("next elimination candidate %s", LOGVAR (idx));
389#ifdef LOGGING
390 if (GET_OPTION (log))
391 (void) variable_score (solver, idx);
392#endif
393
394 KISSAT_assert (!solver->inconsistent);
395 KISSAT_assert (can_eliminate_variable (solver, idx));
396
397 LOG ("marking %s as not removed", LOGVAR (idx));
398 FLAGS (idx)->eliminate = false;
399
400 unsigned lit;
402 return false;
403 connect_resolvents (solver);
404 if (!solver->inconsistent)
405 weaken_clauses (solver, lit);
406 INC (eliminated);
408 if (solver->gate_eliminated) {
409 INC (gates_eliminated);
410#ifdef METRICS
411 KISSAT_assert (*solver->gate_eliminated < UINT64_MAX);
412 *solver->gate_eliminated += 1;
413#endif
414 }
415 return true;
416}
417
418static void eliminate_variables (kissat *solver) {
420 "trying to eliminate variables with bound %u",
421 solver->bounds.eliminate.additional_clauses);
422 KISSAT_assert (!solver->inconsistent);
423#ifndef KISSAT_QUIET
424 unsigned before = solver->active;
425 unsigned eliminated = 0;
426 uint64_t tried = 0;
427#endif
428 unsigned last_round_eliminated = 0;
429
430 SET_EFFORT_LIMIT (resolution_limit, eliminate, eliminate_resolutions);
431
432 bool complete;
433 int round = 0;
434
435 const bool forward = GET_OPTION (forward);
436
437 for (;;) {
438 round++;
439 LOG ("starting new elimination round %d", round);
440
441 if (forward) {
442 unsigned *propagate = solver->propagate;
444 if (solver->inconsistent)
445 break;
448 solver->propagate = propagate;
450 if (solver->inconsistent)
451 break;
452 } else {
454 complete = true;
455 }
456
457#ifndef KISSAT_QUIET
458 const unsigned last_round_scheduled =
459#endif
460 schedule_variables (solver);
462 solver,
463 "scheduled %u variables %.0f%% to eliminate "
464 "in round %d",
465 last_round_scheduled,
466 kissat_percent (last_round_scheduled, solver->active), round);
467
468 unsigned last_round_eliminated = 0;
469
470 while (!solver->inconsistent &&
471 !kissat_empty_heap (&solver->schedule)) {
473 complete = false;
474 break;
475 }
476 unsigned idx = kissat_pop_max_heap (solver, &solver->schedule);
477 if (!can_eliminate_variable (solver, idx))
478 continue;
479 statistics *s = &solver->statistics_;
480 if (s->eliminate_resolutions > resolution_limit) {
482 solver,
483 "eliminate round %u hits "
484 "resolution limit %" PRIu64 " at %" PRIu64 " resolutions",
485 round, resolution_limit, s->eliminate_resolutions);
486 complete = false;
487 break;
488 }
489#ifndef KISSAT_QUIET
490 tried++;
491#endif
492 if (eliminate_variable (solver, idx))
493 last_round_eliminated++;
494 if (solver->inconsistent)
495 break;
497 }
498
499 if (last_round_eliminated) {
500 complete = false;
501#ifndef KISSAT_QUIET
502 eliminated += last_round_eliminated;
503#endif
504 }
505
506 if (!solver->inconsistent) {
509 }
510
512 solver, "eliminate", GET (eliminations),
513 "eliminated %u variables %.0f%% in round %u", last_round_eliminated,
514 kissat_percent (last_round_eliminated, last_round_scheduled),
515 round);
516 REPORT (!last_round_eliminated, 'e');
517
518 if (solver->inconsistent)
519 break;
520 kissat_release_heap (solver, &solver->schedule);
521 if (complete)
522 break;
523 if (round == GET_OPTION (eliminaterounds))
524 break;
525 if (solver->statistics_.eliminate_resolutions > resolution_limit)
526 break;
528 break;
529 }
530
531 const unsigned remain = kissat_size_heap (&solver->schedule);
532 kissat_release_heap (solver, &solver->schedule);
533#ifndef KISSAT_QUIET
535 "eliminated %u variables %.0f%% of %" PRIu64 " tried"
536 " (%u remain %.0f%%)",
537 eliminated, kissat_percent (eliminated, tried),
538 tried, remain,
539 kissat_percent (remain, solver->active));
540 kissat_phase (solver, "eliminate", GET (eliminations),
541 "eliminated %u variables %.0f%% out of %u in %d rounds",
542 eliminated, kissat_percent (eliminated, before), before,
543 round);
544#endif
545 if (!solver->inconsistent) {
546 const bool complete = !remain && !last_round_eliminated;
547 set_next_elimination_bound (solver, complete);
548 if (!complete) {
549 const flags *end = solver->flags + VARS;
550#ifndef KISSAT_QUIET
551 unsigned dropped = 0;
552#endif
553 for (struct flags *f = solver->flags; f != end; f++)
554 if (f->eliminate) {
555 f->eliminate = false;
556#ifndef KISSAT_QUIET
557 dropped++;
558#endif
559 }
560
561 kissat_very_verbose (solver, "dropping %u eliminate candidates",
562 dropped);
563 }
564 }
565}
566
567static void init_map_and_kitten (kissat *solver) {
568 if (!GET_OPTION (definitions))
569 return;
570 KISSAT_assert (!solver->kitten);
571 solver->kitten = kitten_embedded (solver);
572}
573
574static void reset_map_and_kitten (kissat *solver) {
575 if (solver->kitten) {
576 kitten_release (solver->kitten);
577 solver->kitten = 0;
578 }
579}
580
581static void eliminate (kissat *solver) {
583 KISSAT_assert (!solver->inconsistent);
585 kissat_phase (solver, "eliminate", GET (eliminations),
586 "elimination limit of %" PRIu64 " conflicts hit",
587 solver->limits.eliminate.conflicts);
588 init_map_and_kitten (solver);
590 eliminate_variables (solver);
592 reset_map_and_kitten (solver);
595}
596
598 KISSAT_assert (!solver->inconsistent);
599 INC (eliminations);
600 eliminate (solver);
602 UPDATE_CONFLICT_LIMIT (eliminate, eliminations, NLOG2N, true);
603 solver->last.ticks.eliminate = solver->statistics_.search_ticks;
604 return solver->inconsistent ? 20 : 0;
605}
606
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define END_ARRAY
Definition array.h:51
void kissat_learned_unit(kissat *solver, unsigned lit)
Definition assign.c:18
void kissat_backtrack_propagate_and_flush_trail(kissat *solver)
Definition backtrack.c:165
#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 PEEK_STACK(S, N)
Definition stack.h:29
#define INVALID_LIT
#define INC(NAME)
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define FLAGS
#define CHECK_AND_ADD_EMPTY(...)
Definition check.h:146
ABC_NAMESPACE_IMPL_START void kissat_classify(struct kissat *solver)
Definition classify.c:7
reference kissat_new_irredundant_clause(kissat *solver)
Definition clause.c:140
void kissat_mark_clause_as_garbage(kissat *solver, clause *c)
Definition clause.c:164
void kissat_delete_binary(kissat *solver, unsigned a, unsigned b)
Definition clause.c:181
void kissat_dense_collect(kissat *solver)
Definition collect.c:730
void kissat_enter_dense_mode(kissat *solver, litpairs *irredundant)
Definition dense.c:101
void kissat_resume_sparse_mode(kissat *solver, bool flush_eliminated, litpairs *irredundant)
Definition dense.c:201
void kissat_flush_units_while_connected(kissat *solver)
Definition eliminate.c:162
void kissat_eliminate_clause(kissat *solver, clause *c, unsigned lit)
Definition eliminate.c:128
ABC_NAMESPACE_IMPL_START bool kissat_eliminating(kissat *solver)
Definition eliminate.c:23
void kissat_update_variable_score(kissat *solver, unsigned idx)
Definition eliminate.c:82
void kissat_eliminate_binary(kissat *solver, unsigned lit, unsigned other)
Definition eliminate.c:121
int kissat_eliminate(kissat *solver)
Definition eliminate.c:597
bool pos
Definition globals.c:30
Cube * p
Definition exorList.c:222
void kissat_mark_eliminated_variable(kissat *solver, unsigned idx)
Definition flags.c:79
bool kissat_forward_subsume_during_elimination(kissat *solver)
Definition forward.c:680
ABC_NAMESPACE_IMPL_START void kissat_release_heap(kissat *solver, heap *heap)
Definition heap.c:10
void kissat_resize_heap(kissat *solver, heap *heap, unsigned new_size)
Definition heap.c:46
#define VARS
Definition internal.h:250
#define all_variables(IDX)
Definition internal.h:269
#define NLOG2N(COUNT)
Definition kimits.h:110
#define UPDATE_CONFLICT_LIMIT(NAME, COUNT, SCALE_COUNT_FUNCTION, SCALE_DELTA)
Definition kimits.h:115
#define all_literals_in_clause(LIT, C)
Definition clause.h:47
#define KISSAT_assert(ignore)
Definition global.h:13
kitten * kitten_embedded(struct kissat *kissat)
Definition kitten.c:664
#define solver
Definition kitten.c:211
void kitten_release(kitten *kitten)
Definition kitten.c:1028
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD)
Definition limit.hpp:131
#define LOGCLS(...)
Definition logging.h:415
#define LOG2(...)
Definition logging.h:352
#define LOGTMP(...)
Definition logging.h:463
#define LOGLIT(...)
Definition logging.hpp:99
unsigned long long size
Definition giaNewBdd.h:39
unsigned short ref
Definition giaNewBdd.h:38
#define GET_OPTION(N)
Definition options.h:295
#define kissat_extremely_verbose(...)
Definition print.h:53
#define kissat_very_verbose(...)
Definition print.h:52
#define kissat_phase(...)
Definition print.h:48
#define STOP_SEARCH_AND_START_SIMPLIFIER(...)
Definition profile.h:133
#define STOP_SIMPLIFIER_AND_RESUME_SEARCH(...)
Definition profile.h:136
#define ADD_EMPTY_TO_PROOF(...)
Definition proof.h:135
bool kissat_dense_propagate(kissat *solver)
Definition propdense.c:88
#define LINK(IDX)
Definition queue.h:31
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
#define REPORT(...)
Definition report.h:10
bool kissat_generate_resolvents(kissat *solver, unsigned idx, unsigned *lit_ptr)
Definition resolve.c:266
int lit
Definition satVec.h:130
#define LIT(IDX)
Definition literal.h:31
#define IDX(LIT)
Definition literal.h:28
#define NOT(LIT)
Definition literal.h:33
#define kissat_check_statistics(...)
Definition statistics.h:464
#define GET(NAME)
Definition statistics.h:416
bool garbage
Definition clause.h:25
Definition flags.h:11
bool eliminate
Definition flags.h:15
bool active
Definition flags.h:12
bool fixed
Definition flags.h:18
bool eliminated
Definition flags.h:16
Definition heap.h:19
unsigned size
Definition heap.h:22
uint64_t eliminate
Definition kimits.h:39
#define TERMINATED(BIT)
Definition terminate.h:42
#define eliminate_terminated_2
Definition terminate.h:61
#define eliminate_terminated_1
Definition terminate.h:60
Definition watch.h:41
large_watch large
Definition watch.h:45
watch_type type
Definition watch.h:42
binary_watch binary
Definition watch.h:43
#define MIN(a, b)
Definition util_old.h:256
void kissat_connect_irredundant_large_clauses(kissat *solver)
Definition watch.c:171
void kissat_flush_large_connected(kissat *solver)
Definition watch.c:206
#define SIZE_WATCHES(W)
Definition watch.h:104
#define BEGIN_WATCHES(WS)
Definition watch.h:115
#define END_WATCHES(WS)
Definition watch.h:118
#define RELEASE_WATCHES(WS)
Definition watch.h:126
#define EMPTY_WATCHES(W)
Definition watch.h:103
#define SET_END_OF_WATCHES(WS, P)
Definition watch.h:128
vector watches
Definition watch.h:49
#define all_binary_large_watches(WATCH, WATCHES)
Definition watch.h:158
#define WATCHES(LIT)
Definition watch.h:137
void kissat_weaken_binary(kissat *solver, unsigned lit, unsigned other)
Definition weaken.c:48
void kissat_weaken_clause(kissat *solver, unsigned lit, clause *c)
Definition weaken.c:38
void kissat_weaken_unit(kissat *solver, unsigned lit)
Definition weaken.c:56