21 LOG (
"resetting %zu shrinkable variables", reset);
24static void mark_shrinkable_as_removable (
kissat *
solver) {
26 size_t marked = 0, reset = 0;
45 LOG (
"resetting %zu shrinkable variables", reset);
46 LOG (
"marked %zu removable variables", marked);
54 const unsigned idx =
IDX (
lit);
62 LOG2 (
"skipping already shrinkable literal %s",
LOGLIT (
lit));
70 const bool always_minimize_on_lower_level = (
GET_OPTION (shrink) > 2);
71 if (always_minimize_on_lower_level &&
76 LOG (
"literal %s on lower level %u < %u not removable/shrinkable",
87 unsigned *begin_block,
88 unsigned *end_block,
unsigned uip) {
90 const unsigned not_uip =
NOT (uip);
91 LOG (
"found unique implication point %s on level %u",
LOGLIT (uip),
95#if defined(LOGGING) || !defined(KISSAT_NDEBUG)
96 const size_t tmp = end_block - begin_block;
97 LOG (
"shrinking %zu literals on level %u to single literal %s", tmp,
103 bool not_uip_was_in_clause =
false;
105 unsigned block_shrunken = 0;
107 for (
unsigned *
p = begin_block;
p != end_block;
p++) {
108 const unsigned lit = *
p;
113 not_uip_was_in_clause =
true;
120 *begin_block = not_uip;
124 if (not_uip_was_in_clause)
125 LOG (
"keeping single literal %s on level %u",
LOGLIT (not_uip),
level);
127 LOG (
"shrunken all literals on level %u and added %s instead",
level,
130 const unsigned uip_idx =
IDX (uip);
136 mark_shrinkable_as_removable (
solver);
140 return block_shrunken;
143static inline void push_literals_of_block (
kissat *
solver,
145 unsigned *begin_block,
150 for (
const unsigned *
p = begin_block;
p != end_block;
p++) {
151 const unsigned lit = *
p;
162static inline unsigned shrink_along_binary (
kissat *
solver,
164 unsigned level,
unsigned uip,
175static inline unsigned
177 unsigned uip,
reference ref,
bool *failed_ptr) {
198static inline unsigned shrink_along_reason (
kissat *
solver,
200 unsigned level,
unsigned uip,
201 bool resolve_large_clauses,
204 const unsigned uip_idx =
IDX (uip);
210 const unsigned other = a->
reason;
214 if (resolve_large_clauses)
225static inline unsigned shrink_block (
kissat *
solver,
unsigned *begin_block,
226 unsigned *end_block,
unsigned level,
227 unsigned max_trail) {
230 unsigned open = end_block - begin_block;
232 LOG (
"trying to shrink %u literals on level %u", open,
level);
233 LOG (
"maximum trail position %u on level %u", max_trail,
level);
243 const bool resolve_large_clauses = (
GET_OPTION (shrink) > 1);
247 const unsigned *t = begin_trail + max_trail;
258 resolve_large_clauses, &failed);
263 unsigned block_shrunken = 0;
265 reset_shrinkable (
solver);
268 shrunken_block (
solver,
level, begin_block, end_block, uip);
270 return block_shrunken;
273static unsigned *next_block (
kissat *
solver,
unsigned *begin_lits,
274 unsigned *end_block,
unsigned *level_ptr,
275 unsigned *max_trail_ptr) {
279 unsigned max_trail = 0;
281 unsigned *begin_block = end_block;
283 while (begin_lits < begin_block) {
284 const unsigned lit = begin_block[-1];
286 const unsigned idx =
IDX (
lit);
288 unsigned lit_level = a->
level;
291 LOG (
"starting to shrink level %u",
level);
294 if (lit_level >
level)
299 if (
trail > max_trail)
304 *max_trail_ptr = max_trail;
309static unsigned minimize_block (
kissat *
solver,
unsigned *begin_block,
310 unsigned *end_block) {
311 unsigned minimized = 0;
313 for (
unsigned *
p = begin_block;
p != end_block;
p++) {
314 const unsigned lit = *
p;
326static inline unsigned *
327minimize_and_shrink_block (
kissat *
solver,
unsigned *begin_lits,
328 unsigned *end_block,
unsigned *total_shrunken,
329 unsigned *total_minimized) {
332 unsigned level, max_trail;
334 unsigned *begin_block =
335 next_block (
solver, begin_lits, end_block, &
level, &max_trail);
337 unsigned open = end_block - begin_block;
340 unsigned block_shrunken = 0;
341 unsigned block_minimized = 0;
344 LOG (
"only one literal on level %u",
level);
347 shrink_block (
solver, begin_block, end_block,
level, max_trail);
349 block_minimized = minimize_block (
solver, begin_block, end_block);
352 block_shrunken += block_minimized;
353 LOG (
"shrunken %u literals on level %u (including %u minimized)",
354 block_shrunken,
level, block_minimized);
356 *total_minimized += block_minimized;
357 *total_shrunken += block_shrunken;
369 unsigned total_shrunken = 0;
370 unsigned total_minimized = 0;
377 while (end_block != begin_lits)
378 end_block = minimize_and_shrink_block (
379 solver, begin_lits, end_block, &total_shrunken, &total_minimized);
380 unsigned *q = begin_lits;
381 for (
const unsigned *
p = q;
p != end_lits;
p++) {
382 const unsigned lit = *
p;
386 LOG (
"clause shrunken by %u literals (including %u minimized)",
387 total_shrunken, total_minimized);
390 ADD (literals_shrunken, total_shrunken);
391 ADD (literals_minshrunken, total_minimized);
393 LOGTMP (
"shrunken learned");
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define SET_END_OF_STACK(S, P)
#define all_literals_in_clause(LIT, C)
#define KISSAT_assert(ignore)
void kissat_reset_poisoned(kissat *solver)
bool kissat_minimize_literal(kissat *solver, unsigned lit, bool lit_in_clause)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
void kissat_shrink_clause(kissat *solver)