9#define INVALID_LIT UINT_MAX
26static void traverse_definition_core (
void *state,
unsigned id) {
32 const size_t size_clauses0 = clauses0.
size ();
33 const size_t size_clauses1 = clauses1.
size ();
37 if (
id < size_clauses0) {
41 unsigned tmp =
id - size_clauses0;
61static void traverse_one_sided_core_lemma (
void *state,
bool learned,
63 const unsigned *lits) {
67 Eliminator *eliminator = extractor->eliminator;
68 Internal *internal = extractor->internal;
69 Proof *proof = internal->proof;
70 const int unit = extractor->unit;
74 pc.id = ++(internal->clause_id);
75 pc.literals.push_back (unit);
76 const unsigned *end = lits + size;
77 for (
const unsigned *
p = lits;
p != end;
p++)
78 pc.literals.push_back (internal->citten2lit (*
p));
79 proof_clauses.push_back (pc);
81 proof->add_derived_clause (pc.id,
true, pc.literals, pc.chain);
83 internal->assign_unit (unit);
84 for (
const auto &pc : proof_clauses) {
85 proof->delete_clause (pc.id,
true, pc.literals);
87 proof_clauses.clear ();
93static void traverse_one_sided_core_lemma_with_lrat (
94 void *state,
unsigned cid,
unsigned id,
bool learned,
size_t size,
95 const unsigned *lits,
size_t chain_size,
const unsigned *chain) {
97 Eliminator *eliminator = extractor->eliminator;
98 Internal *internal = extractor->internal;
99 Proof *proof = internal->proof;
100 const int unit = extractor->unit;
101 const vector<Clause *> &clauses0 = extractor->clauses[0];
102 const vector<Clause *> &clauses1 = extractor->clauses[1];
110 const size_t size_clauses0 = clauses0.
size ();
112 if (
id < size_clauses0) {
113 pc.id = clauses0[id]->id;
115 unsigned tmp =
id - size_clauses0;
116#ifndef CADICAL_NDEBUG
117 const size_t size_clauses1 = clauses1.
size ();
121 pc.id = clauses1[tmp]->id;
123 proof_clauses.push_back (pc);
128 pc.
id = ++(internal->clause_id);
131 pc.literals.push_back (unit);
132 const unsigned *end = lits +
size;
133 for (
const unsigned *
p = lits;
p != end;
p++)
134 pc.literals.push_back (internal->citten2lit (*
p));
135 for (
const unsigned *
p = chain + chain_size;
p != chain;
p--) {
137 for (
const auto &cpc : proof_clauses) {
138 if (cpc.cid == *(
p - 1)) {
144 pc.chain.push_back (
id);
146 proof_clauses.push_back (pc);
148 proof->add_derived_clause (pc.id,
true, pc.literals, pc.chain);
151 for (
const unsigned *
p = chain + chain_size;
p != chain;
p--) {
153 for (
const auto &cpc : proof_clauses) {
154 if (cpc.cid == *(
p - 1)) {
160 internal->lrat_chain.push_back (
id);
162 internal->assign_unit (unit);
164 for (
const auto &pc : proof_clauses) {
166 proof->delete_clause (pc.id,
true, pc.literals);
168 proof_clauses.clear ();
189 if (!eliminator.
gates.empty ())
194 const int not_lit = -
lit;
202 unsigned exported = 0;
209 LOG (c,
"adding to cadical_kitten");
211 c->literals, except);
216 stats.definitions_checked++;
223 LOG (
"sub-solver result UNSAT shows definition exists");
226 LOG (
"1st sub-solver core of size %u original clauses out of %u",
228 for (
int i = 2; i <=
opts.elimdefcores; i++) {
235 LOG (
"aborting core extraction");
238#ifndef CADICAL_NDEBUG
239 unsigned previous = reduced;
242 LOG (
"%d sub-solver core of size %u original clauses out of %u", i,
245#if not defined(LOGGING) && defined(CADICAL_NDEBUG)
249 stats.definitions_extracted++;
261 stats.definition_units++;
263 "definition extraction yields "
267 extractor.
unit = unit;
269 traverse_one_sided_core_lemma_with_lrat);
271 extractor.
unit = unit;
273 traverse_one_sided_core_lemma);
281 LOG (
"sub-solver failed to show that definition exists");
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
void cadical_kitten_shuffle_clauses(cadical_kitten *cadical_kitten)
unsigned cadical_kitten_compute_clausal_core(cadical_kitten *cadical_kitten, uint64_t *learned_ptr)
uint64_t cadical_kitten_current_ticks(cadical_kitten *cadical_kitten)
void cadical_kitten_set_ticks_limit(cadical_kitten *cadical_kitten, uint64_t delta)
void cadical_kitten_traverse_core_clauses(cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
int cadical_kitten_solve(cadical_kitten *cadical_kitten)
void cadical_kitten_trace_core(cadical_kitten *cadical_kitten, void *state, void(*trace)(void *, unsigned, unsigned, bool, size_t, const unsigned *, size_t, const unsigned *))
void citten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned except)
void cadical_kitten_shrink_to_clausal_core(cadical_kitten *cadical_kitten)
void cadical_kitten_traverse_core_ids(cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *, unsigned))
void citten_clear_track_log_terminate()
void assign_unit(int lit)
signed char val(int lit) const
bool limit(const char *name, int)
unsigned lit2citten(int lit)
void elim_propagate(Eliminator &, int unit)
void find_definition(Eliminator &, int)