ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kucky.c
Go to the documentation of this file.
1#include "lucky.h"
2#include "analyze.h"
3#include "backtrack.h"
4#include "decide.h"
5#include "inline.h"
6#include "internal.h"
7#include "print.h"
8#include "proprobe.h"
9#include "report.h"
10
12
13static bool no_all_negative_clauses (struct kissat *solver) {
14 clause *last_irredundant = kissat_last_irredundant_clause (solver);
15 for (all_clauses (c)) {
16 if (last_irredundant && last_irredundant < c)
17 break;
18 if (c->redundant)
19 continue;
20 if (c->garbage)
21 continue;
23 if (!NEGATED (lit) && VALUE (lit) >= 0)
24 goto CONTINUE_WITH_NEXT_CLAUSE;
25 kissat_verbose (solver, "found all negative large clause");
26 return false;
27 CONTINUE_WITH_NEXT_CLAUSE:;
28 }
29 KISSAT_assert (solver->watching);
30 for (all_variables (idx)) {
31 if (!ACTIVE (idx))
32 continue;
33 const unsigned lit = LIT (idx);
34 const unsigned not_lit = NOT (lit);
35 for (all_binary_blocking_watches (watch, WATCHES (not_lit))) {
36 if (!watch.type.binary)
37 continue;
38 const unsigned other = watch.binary.lit;
39 if (NEGATED (other) && ACTIVE (IDX (other))) {
40 kissat_verbose (solver, "found all negative binary clause");
41 return false;
42 }
43 }
44 }
45 kissat_message (solver, "lucky no all-negative clause");
46 return true;
47}
48
49static bool no_all_positive_clauses (struct kissat *solver) {
50 clause *last_irredundant = kissat_last_irredundant_clause (solver);
51 for (all_clauses (c)) {
52 if (last_irredundant && last_irredundant < c)
53 break;
54 if (c->redundant)
55 continue;
56 if (c->garbage)
57 continue;
59 if (NEGATED (lit) && VALUE (lit) >= 0)
60 goto CONTINUE_WITH_NEXT_CLAUSE;
61 kissat_verbose (solver, "found all positive large clause");
62 return false;
63 CONTINUE_WITH_NEXT_CLAUSE:;
64 }
65 KISSAT_assert (solver->watching);
66 for (all_variables (idx)) {
67 if (!ACTIVE (idx))
68 continue;
69 const unsigned lit = LIT (idx);
71 if (!watch.type.binary)
72 continue;
73 const unsigned other = watch.binary.lit;
74 if (!NEGATED (other) && ACTIVE (IDX (other))) {
75 kissat_verbose (solver, "found all positive binary clause");
76 return false;
77 }
78 }
79 }
80 kissat_message (solver, "lucky no all-positive clause");
81 return true;
82}
83
84static int forward_false_satisfiable (struct kissat *solver) {
85 KISSAT_assert (!solver->level);
86#ifndef KISSAT_QUIET
87 unsigned conflicts = 0;
88#endif
89 for (all_stack (import, import, solver->import)) {
90 if (!import.imported)
91 continue;
92 if (import.eliminated)
93 continue;
94 const unsigned lit = import.lit;
95 const unsigned idx = IDX (lit);
96 if (!ACTIVE (idx))
97 continue;
98 if (VALUE (lit))
99 continue;
100 const unsigned not_lit = NOT (lit);
102 clause *c = kissat_probing_propagate (solver, 0, true);
103 if (!c)
104 continue;
105#ifndef KISSAT_QUIET
106 conflicts++;
107#endif
108 if (solver->level > 1) {
111 clause *d = kissat_probing_propagate (solver, 0, true);
112 if (!d)
113 continue;
115 "inconsistency after %u conflicts "
116 "forward assigning %u variables to false",
117 conflicts, solver->level);
119 return 0;
120 } else {
121 LOG ("failed literal %s", LOGLIT (not_lit));
123 KISSAT_assert (!solver->level);
124 clause *d = kissat_probing_propagate (solver, 0, true);
125 if (d) {
127 KISSAT_assert (solver->inconsistent);
129 "lucky inconsistency forward assigning to false");
130 return 20;
131 }
132 }
133 }
134
135 kissat_message (solver, "lucky in forward setting literals to false");
136 return 10;
137}
138
139static int forward_true_satisfiable (struct kissat *solver) {
140 KISSAT_assert (!solver->level);
141#ifndef KISSAT_QUIET
142 unsigned conflicts = 0;
143#endif
144 for (all_stack (import, import, solver->import)) {
145 if (!import.imported)
146 continue;
147 if (import.eliminated)
148 continue;
149 const unsigned lit = import.lit;
150 const unsigned idx = IDX (lit);
151 if (!ACTIVE (idx))
152 continue;
153 if (VALUE (lit))
154 continue;
156 clause *c = kissat_probing_propagate (solver, 0, true);
157 if (!c)
158 continue;
159#ifndef KISSAT_QUIET
160 conflicts++;
161#endif
162 if (solver->level > 1) {
164 const unsigned not_lit = NOT (lit);
166 clause *d = kissat_probing_propagate (solver, 0, true);
167 if (!d)
168 continue;
170 "inconsistency after %u conflicts "
171 "forward assigning %u variables to true",
172 conflicts, solver->level);
174 return 0;
175 } else {
176 LOG ("failed literal %s", LOGLIT (lit));
178 KISSAT_assert (!solver->level);
179 clause *d = kissat_probing_propagate (solver, 0, true);
180 if (d) {
182 KISSAT_assert (solver->inconsistent);
184 "lucky inconsistency forward assigning to true");
185 return 20;
186 }
187 }
188 }
189 kissat_message (solver, "lucky in forward setting literals to true");
190 return 10;
191}
192
193static int backward_false_satisfiable (struct kissat *solver) {
194 KISSAT_assert (!solver->level);
195#ifndef KISSAT_QUIET
196 unsigned conflicts = 0;
197#endif
198 import *begin = BEGIN_STACK (solver->import);
199 import *end = END_STACK (solver->import);
200 import *p = end;
201 while (p != begin) {
202 const import import = *--p;
203 if (!import.imported)
204 continue;
205 if (import.eliminated)
206 continue;
207 const unsigned lit = import.lit;
208 const unsigned idx = IDX (lit);
209 if (!ACTIVE (idx))
210 continue;
211 if (VALUE (lit))
212 continue;
213 const unsigned not_lit = NOT (lit);
215 clause *c = kissat_probing_propagate (solver, 0, true);
216 if (!c)
217 continue;
218#ifndef KISSAT_QUIET
219 conflicts++;
220#endif
221 if (solver->level > 1) {
224 clause *d = kissat_probing_propagate (solver, 0, true);
225 if (!d)
226 continue;
228 "inconsistency after %u conflicts "
229 "backward assigning %u variables to false",
230 conflicts, solver->level);
232 return 0;
233 } else {
234 LOG ("failed literal %s", LOGLIT (not_lit));
236 KISSAT_assert (!solver->level);
237 clause *d = kissat_probing_propagate (solver, 0, true);
238 if (d) {
240 KISSAT_assert (solver->inconsistent);
242 "lucky inconsistency backward assigning to false");
243 return 20;
244 }
245 }
246 }
247 kissat_message (solver, "lucky in backward setting literals to false");
248 return 10;
249}
250
251static int backward_true_satisfiable (struct kissat *solver) {
252 KISSAT_assert (!solver->level);
253#ifndef KISSAT_QUIET
254 unsigned conflicts = 0;
255#endif
256 import *begin = BEGIN_STACK (solver->import);
257 import *end = END_STACK (solver->import);
258 import *p = end;
259 while (p != begin) {
260 const import import = *--p;
261 if (!import.imported)
262 continue;
263 if (import.eliminated)
264 continue;
265 const unsigned lit = import.lit;
266 const unsigned idx = IDX (lit);
267 if (!ACTIVE (idx))
268 continue;
269 if (VALUE (lit))
270 continue;
272 clause *c = kissat_probing_propagate (solver, 0, true);
273 if (!c)
274 continue;
275#ifndef KISSAT_QUIET
276 conflicts++;
277#endif
278 if (solver->level > 1) {
280 const unsigned not_lit = NOT (lit);
282 clause *d = kissat_probing_propagate (solver, 0, true);
283 if (!d)
284 continue;
286 "inconsistency after %u conflicts "
287 "backward assigning %u variables to true",
288 conflicts, solver->level);
290 return 0;
291 } else {
292 LOG ("failed literal %s", LOGLIT (lit));
294 KISSAT_assert (!solver->level);
295 clause *d = kissat_probing_propagate (solver, 0, true);
296 if (d) {
298 KISSAT_assert (solver->inconsistent);
300 "lucky inconsistency backward assigning to true");
301 return 20;
302 }
303 }
304 }
305 kissat_message (solver, "lucky in backward setting literals to true");
306 return 10;
307}
308
310
311 if (solver->inconsistent)
312 return 0;
313
314 if (!GET_OPTION (lucky))
315 return 0;
316
317 START (lucky);
318 KISSAT_assert (!solver->level);
319 KISSAT_assert (!solver->probing);
320 solver->probing = true;
321 KISSAT_assert (kissat_propagated (solver));
322
323 int res = 0;
324
325 if (no_all_negative_clauses (solver)) {
326 for (all_variables (idx)) {
327 if (!ACTIVE (idx))
328 continue;
329 const unsigned lit = LIT (idx);
330 if (VALUE (lit))
331 continue;
333#ifndef KISSAT_NDEBUG
334 clause *c =
335#endif
337 KISSAT_assert (!c);
338 }
339 kissat_verbose (solver, "set all variables to true");
340 KISSAT_assert (kissat_propagated (solver));
341 KISSAT_assert (!solver->unassigned);
342 res = 10;
343 }
344
345 if (!res && no_all_positive_clauses (solver)) {
346 for (all_variables (idx)) {
347 if (!ACTIVE (idx))
348 continue;
349 const unsigned lit = LIT (idx);
350 if (VALUE (lit))
351 continue;
352 const unsigned not_lit = NOT (lit);
354#ifndef KISSAT_NDEBUG
355 clause *c =
356#endif
358 KISSAT_assert (!c);
359 }
360 kissat_verbose (solver, "set all variables to false");
361 KISSAT_assert (kissat_propagated (solver));
362 KISSAT_assert (!solver->unassigned);
363 res = 10;
364 }
365
366 const unsigned active_before = solver->active;
367
368 if (!res)
369 res = forward_false_satisfiable (solver);
370
371 if (!res)
372 res = forward_true_satisfiable (solver);
373
374 if (!res)
375 res = backward_false_satisfiable (solver);
376
377 if (!res)
378 res = backward_true_satisfiable (solver);
379
380 const unsigned active_after = solver->active;
381 const unsigned units = active_before - active_after;
382
383 if (!res && units)
384 kissat_message (solver, "lucky %u units", units);
385
386#ifndef KISSAT_QUIET
387 bool success = res || units;
388#endif
389 KISSAT_assert (solver->probing);
390 solver->probing = false;
391 REPORT (!success, 'l');
392 STOP (lucky);
393
394 return res;
395}
396
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int kissat_analyze(kissat *solver, clause *conflict)
Definition analyze.c:529
void kissat_backtrack_without_updating_phases(kissat *solver, unsigned new_level)
Definition backtrack.c:74
#define all_stack(T, E, S)
Definition stack.h:94
#define LOG(...)
void kissat_internal_assume(kissat *solver, unsigned lit)
Definition decide.c:237
#define ACTIVE
Definition espresso.h:129
Cube * p
Definition exorList.c:222
#define all_variables(IDX)
Definition internal.h:269
#define all_clauses(C)
Definition internal.h:279
#define all_literals_in_clause(LIT, C)
Definition clause.h:47
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
int kissat_lucky(struct kissat *solver)
Definition kucky.c:309
#define LOGLIT(...)
Definition logging.hpp:99
#define GET_OPTION(N)
Definition options.h:295
#define kissat_message(...)
Definition print.h:47
#define kissat_verbose(...)
Definition print.h:51
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
clause * kissat_probing_propagate(kissat *solver, clause *ignore, bool flush)
Definition proprobe.c:37
#define REPORT(...)
Definition report.h:10
int lit
Definition satVec.h:130
#define LIT(IDX)
Definition literal.h:31
#define NEGATED(LIT)
Definition literal.h:35
#define IDX(LIT)
Definition literal.h:28
#define NOT(LIT)
Definition literal.h:33
Definition watch.h:41
watch_type type
Definition watch.h:42
binary_watch binary
Definition watch.h:43
#define VALUE(LIT)
Definition value.h:10
#define all_binary_blocking_watches(WATCH, WATCHES)
Definition watch.h:151
#define WATCHES(LIT)
Definition watch.h:137