29#ifndef KISSAT_NOPTIONS
35 kissat_init_profiles (&
solver->profiles);
40 kissat_push_frame (
solver, UINT_MAX);
48 kissat_init_checker (
solver);
59#define DEALLOC_GENERIC(NAME, ELEMENTS_PER_BLOCK) \
61 const size_t block_size = ELEMENTS_PER_BLOCK * sizeof *solver->NAME; \
62 kissat_dealloc (solver, solver->NAME, solver->size, block_size); \
66#define DEALLOC_VARIABLE_INDEXED(NAME) DEALLOC_GENERIC (NAME, 1)
68#define DEALLOC_LITERAL_INDEXED(NAME) DEALLOC_GENERIC (NAME, 2)
70#define RELEASE_LITERAL_INDEXED_STACKS(NAME, ACCESS) \
72 for (all_stack (unsigned, IDX_RILIS, solver->active)) { \
73 const unsigned LIT_RILIS = LIT (IDX_RILIS); \
74 const unsigned NOT_LIT_RILIS = NOT (LIT_RILIS); \
75 RELEASE_STACK (ACCESS (LIT_RILIS)); \
76 RELEASE_STACK (ACCESS (NOT_LIT_RILIS)); \
78 DEALLOC_LITERAL_INDEXED (NAME); \
109#if defined(LOGGING) || !defined(KISSAT_NDEBUG)
141#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
146#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
157 kissat_release_checker (
solver);
159#if !defined(KISSAT_NDEBUG) && defined(METRICS)
160 uint64_t leaked =
solver->statistics_.allocated_current;
163 kissat_fatal (
"internally leaking %" PRIu64
" bytes", leaked);
171 kissat_require (0 <= max_var,
"negative maximum variable argument '%d'",
174 "invalid maximum variable argument '%d'", max_var);
177 for (
int idx = 1; idx <= max_var; idx++)
179 for (
unsigned idx = 0; idx != (unsigned) max_var; idx++)
187#ifndef KISSAT_NOPTIONS
196#ifndef KISSAT_NOPTIONS
199#ifndef KISSAT_NOPTIONS
200 return kissat_options_set (&
solver->options,
name, new_value);
202 return kissat_options_set (
name, new_value);
205 (void)
solver, (
void) new_value;
218 LOG (
"set decision limit to %" PRIu64
" after %u decisions",
230 LOG (
"set conflict limit to %" PRIu64
" after %u conflicts",
237 const int verbosity = kissat_verbosity (
solver);
242 kissat_profiles_print (
solver);
246 const bool verbose = (complete || verbosity > 0);
247 kissat_statistics_print (
solver, verbose);
248#ifndef KISSAT_NPROOFS
251 kissat_print_proof_statistics (
solver, verbose);
257 kissat_print_checker_statistics (
solver, verbose);
261 kissat_print_glue_usage (
solver);
263 kissat_print_resources (
solver);
271#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
272 const int checking = kissat_checking (
solver);
273 const bool logging = kissat_logging (
solver);
274 const bool proving = kissat_proving (
solver);
278#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
279 if (checking || logging || proving)
288 if (!
solver->clause_satisfied) {
289 LOG (
"adding root level satisfied literal %u(%d)@0=1", ilit,
291 solver->clause_satisfied =
true;
293 }
else if (
value < 0) {
294 LOG (
"adding root level falsified literal %u(%d)@0=-1", ilit, elit);
295 if (!
solver->clause_shrink) {
296 solver->clause_shrink =
true;
297 LOG (
"thus original clause needs shrinking");
305 }
else if (
mark < 0) {
307 if (!
solver->clause_trivial) {
308 LOG (
"adding dual literal %u(%d) and %u(%d)",
NOT (ilit), -elit,
310 solver->clause_trivial =
true;
314 LOG (
"adding duplicated literal %u(%d)", ilit, elit);
315 if (!
solver->clause_shrink) {
316 solver->clause_shrink =
true;
317 LOG (
"thus original clause needs shrinking");
321#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
322 const size_t offset =
solver->offset_of_last_original_clause;
333 LOG (
"inconsistent thus skipping original clause");
334 else if (
solver->clause_satisfied)
335 LOG (
"skipping satisfied original clause");
336 else if (
solver->clause_trivial)
337 LOG (
"skipping trivial original clause");
342 if (
solver->clause_shrink)
343 LOG (
"all original clause literals root level falsified");
345 LOG (
"found empty original clause");
347 if (!
solver->inconsistent) {
348 LOG (
"thus solver becomes inconsistent");
349 solver->inconsistent =
true;
353 }
else if (isize == 1) {
356 if (
solver->clause_shrink)
357 LOGUNARY (unit,
"original clause shrinks to");
369 const unsigned a = ilits[0];
370 const unsigned b = ilits[1];
375 const unsigned k = u ?
LEVEL (a) : UINT_MAX;
376 const unsigned l = v ?
LEVEL (b) : UINT_MAX;
381 LOG (
"original clause immediately forcing");
383 }
else if (u < 0 && k == l) {
384 LOG (
"both watches falsified at level @%u", k);
389 LOG (
"watches falsified at levels @%u and @%u", k, l);
394 }
else if (u > 0 && v < 0) {
395 LOG (
"first watch satisfied at level @%u "
396 "second falsified at level @%u",
399 }
else if (!u && v > 0) {
400 LOG (
"first watch unassigned "
401 "second falsified at level @%u",
424#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
425 if (
solver->clause_satisfied ||
solver->clause_trivial) {
428 kissat_remove_checker_external (
solver, esize, elits);
430#ifndef KISSAT_NPROOFS
433 LOG (
"skipping deleting unit from proof");
435 kissat_delete_external_from_proof (
solver, esize, elits);
438 }
else if (!
solver->inconsistent &&
solver->clause_shrink) {
441 kissat_check_and_add_internal (
solver, isize, ilits);
442 kissat_remove_checker_external (
solver, esize, elits);
445#ifndef KISSAT_NPROOFS
447 kissat_add_lits_to_proof (
solver, isize, ilits);
448 kissat_delete_external_from_proof (
solver, esize, elits);
454#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS) || defined(LOGGING)
456 LOGINTS (esize, elits,
"saved original");
458 solver->offset_of_last_original_clause =
460 }
else if (logging || proving) {
461 LOGINTS (esize, elits,
"reset original");
463 solver->offset_of_last_original_clause = 0;
471 solver->clause_satisfied =
false;
472 solver->clause_trivial =
false;
473 solver->clause_shrink =
false;
480 "incomplete clause (terminating zero not added)");
487 solver->termination.flagged = ~(unsigned) 0;
492 int (*terminate) (
void *)) {
493 solver->termination.terminate = 0;
494 solver->termination.state = state;
495 solver->termination.terminate = terminate;
501 const unsigned eidx =
ABS (elit);
504 const import *const import = &PEEK_STACK (solver->import, eidx);
511 const unsigned eliminated =
import->lit;
514 const unsigned ilit =
import->lit;
521 return tmp < 0 ? -elit : elit;
525 return solver->inconsistent;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void * kissat_calloc(kissat *solver, size_t n, size_t size)
void kissat_freestr(struct kissat *solver, char *str)
void kissat_free(kissat *solver, void *ptr, size_t bytes)
char * kissat_strdup(kissat *solver, const char *str)
#define RELEASE_ARRAY(A, N)
void kissat_original_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)
#define all_stack(T, E, S)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define CHECK_AND_ADD_EMPTY(...)
#define ADD_UNCHECKED_EXTERNAL(...)
reference kissat_new_original_clause(kissat *solver)
void kissat_fatal(const char *fmt,...)
void kissat_extend(kissat *solver)
void kissat_activate_literal(kissat *solver, unsigned lit)
void kissat_activate_literals(kissat *solver, unsigned size, unsigned *lits)
ABC_NAMESPACE_IMPL_START void kissat_release_heap(kissat *solver, heap *heap)
unsigned kissat_import_literal(kissat *solver, int elit)
int kissat_value(kissat *solver, int elit)
void kissat_terminate(kissat *solver)
int kissat_solve(kissat *solver)
void kissat_set_conflict_limit(kissat *solver, unsigned limit)
ABC_NAMESPACE_IMPL_START void kissat_reset_last_learned(kissat *solver)
int kissat_get_option(kissat *solver, const char *name)
kissat * kissat_init(void)
void kissat_add(kissat *solver, int elit)
void kissat_set_terminate(kissat *solver, void *state, int(*terminate)(void *))
#define DEALLOC_LITERAL_INDEXED(NAME)
int kissat_set_option(kissat *solver, const char *name, int new_value)
void kissat_set_prefix(kissat *solver, const char *prefix)
#define DEALLOC_VARIABLE_INDEXED(NAME)
void kissat_release(kissat *solver)
void kissat_reserve(kissat *solver, int max_var)
void kissat_print_statistics(kissat *solver)
void kissat_set_decision_limit(kissat *solver, unsigned limit)
int kissat_is_inconsistent(kissat *solver)
#define really_all_last_learned(REF_PTR)
#define KISSAT_assert(ignore)
void kissat_init_options(void)
int kissat_options_get(const char *name)
void kissat_release_phases(kissat *solver)
#define kissat_section(...)
#define ADD_EMPTY_TO_PROOF(...)
clause * kissat_search_propagate(kissat *solver)
ABC_NAMESPACE_IMPL_START void kissat_init_queue(kissat *solver)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
#define kissat_require(COND,...)
#define kissat_require_valid_external_internal(LIT)
#define kissat_require_initialized(SOLVER)
void kissat_increase_size(kissat *solver, unsigned new_size)
int kissat_search(kissat *solver)
void kissat_release_vectors(kissat *solver)