18static void traverse_definition_core (
void *state,
unsigned id) {
27 if (
id < size_watches0) {
32 unsigned tmp =
id - size_watches0;
45#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
47typedef struct lemma_extractor lemma_extractor;
49struct lemma_extractor {
55static void traverse_one_sided_core_lemma (
void *state,
bool learned,
57 const unsigned *lits) {
60 lemma_extractor *extractor = (lemma_extractor*)state;
62 const unsigned unit = extractor->unit;
63 unsigneds *added = &
solver->added;
69 const unsigned *end = lits +
size;
70 for (
const unsigned *
p = lits;
p != end;
p++)
72 unsigned *extended = &
PEEK_STACK (*added, offset);
80 for (
unsigned *
p = begin, size;
p != end;
p +=
size) {
100 const unsigned not_lit =
NOT (
lit);
107 unsigned exported = 0;
108#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
109 size_t occs[2] = {0, 0};
111 for (
unsigned sign = 0; sign < 2; sign++) {
112 const unsigned except = sign ? not_lit :
lit;
124#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
131 LOG (
"exported %u = %zu + %zu environment clauses to sub-solver",
132 exported, occs[0], occs[1]);
133 INC (definitions_checked);
134 const size_t limit =
GET_OPTION (definitionticks);
138 LOG (
"sub-solver result UNSAT shows definition exists");
141 LOG (
"1st sub-solver core of size %u original clauses out of %u",
143 for (
int i = 2; i <=
GET_OPTION (definitioncores); i++) {
150 LOG (
"aborting core extraction");
154 unsigned previous = reduced;
157 LOG (
"%s sub-solver core of size %u original clauses out of %u",
160#if defined(KISSAT_QUIET) && defined(KISSAT_NDEBUG)
164 INC (definitions_extracted);
169#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
174 "definition extracted[%" PRIu64
"] "
175 "size %u = %zu + %zu clauses %.0f%% "
176 "of %u = %zu + %zu (checked %" PRIu64
")",
177 solver->statistics.definitions_extracted, reduced,
size[0],
size[1],
178 kissat_percent (reduced, exported), exported, occs[0], occs[1],
179 solver->statistics.definitions_checked);
182 "definition extracted with core "
183 "size %u = %zu + %zu clauses %.0f%% "
186 kissat_percent (reduced, exported), exported,
198 INC (definition_units);
201 "definition extraction yields "
203#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
212 lemma_extractor extractor;
213 extractor.solver =
solver;
214 extractor.unit = unit;
215 extractor.lemmas = 0;
217 traverse_one_sided_core_lemma);
223 solver->resolve_gate =
true;
227 LOG (
"sub-solver failed to show that definition exists");
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void kissat_learned_unit(kissat *solver, unsigned lit)
#define CHECK_AND_ADD_LITS(...)
#define REMOVE_CHECKER_LITS(...)
bool kissat_find_definition(kissat *solver, unsigned lit)
#define GATE_ELIMINATED(...)
#define KISSAT_assert(ignore)
typedefABC_NAMESPACE_HEADER_START struct kissat kissat
int kitten_solve(kitten *kitten)
void kitten_shrink_to_clausal_core(kitten *kitten)
void kitten_traverse_core_clauses(kitten *kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
void kitten_traverse_core_ids(kitten *kitten, void *state, void(*traverse)(void *, unsigned))
void kitten_track_antecedents(kitten *kitten)
void kitten_clause_with_id_and_exception(kitten *kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
void kitten_set_ticks_limit(kitten *kitten, uint64_t delta)
unsigned kitten_compute_clausal_core(kitten *kitten, uint64_t *learned_ptr)
void kitten_shuffle_clauses(kitten *kitten)
void kitten_clear(kitten *kitten)
#define kissat_extremely_verbose(...)
#define DELETE_LITS_FROM_PROOF(...)
#define ADD_LITS_TO_PROOF(...)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
#define BEGIN_WATCHES(WS)
#define all_binary_large_watches(WATCH, WATCHES)