ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kucky.c File Reference
#include "lucky.h"
#include "analyze.h"
#include "backtrack.h"
#include "decide.h"
#include "inline.h"
#include "internal.h"
#include "print.h"
#include "proprobe.h"
#include "report.h"
Include dependency graph for kucky.c:

Go to the source code of this file.

Functions

int kissat_lucky (struct kissat *solver)
 

Function Documentation

◆ kissat_lucky()

int kissat_lucky ( struct kissat * solver)

Definition at line 309 of file kucky.c.

309 {
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}
void kissat_internal_assume(kissat *solver, unsigned lit)
Definition decide.c:237
#define ACTIVE
Definition espresso.h:129
#define all_variables(IDX)
Definition internal.h:269
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#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 NOT(LIT)
Definition literal.h:33
#define VALUE(LIT)
Definition value.h:10
Here is the call graph for this function:
Here is the caller graph for this function: