19 if (!
solver->statistics_.clauses_redundant)
33#define RANK_REDUCIBLE(RED) (RED).rank
39static bool collect_reducibles (
kissat *
solver, reducibles *reds,
48 start = kissat_next_clause (start);
51 LOG (
"no reducible clause candidate left");
56 if (redundant < solver->first_reducible)
57 LOG (
"updating start of redundant clauses from %zu to %zu",
58 (
size_t)
solver->first_reducible, (
size_t) redundant);
60 LOG (
"no update to start of redundant clauses %zu",
61 (
size_t)
solver->first_reducible);
63 solver->first_reducible = redundant;
64 const unsigned tier1 =
TIER1;
65 const unsigned tier2 =
MAX (tier1,
TIER2);
67 for (
clause *c = start; c != end; c = kissat_next_clause (c)) {
72 const unsigned used = c->used;
77 const unsigned glue = c->glue;
78 if (glue <= tier1 && used)
80 if (glue <= tier2 && used >=
MAX_USED - 1)
84 const uint64_t negative_size = ~c->size;
85 const uint64_t negative_glue = ~c->glue;
86 red.
rank = negative_size | (negative_glue << 32);
92 "did not find any reducible redundant clause");
98#define USEFULNESS RANK_REDUCIBLE
100static void sort_reducibles (
kissat *
solver, reducibles *reds) {
104static void mark_less_useful_clauses_as_garbage (
kissat *
solver,
107 const double high =
GET_OPTION (reducehigh) * 0.1;
108 const double low =
GET_OPTION (reducelow) * 0.1;
111 const double delta = high - low;
115 const double fraction =
percent / 100.0;
117 size_t target =
size * fraction;
119 const size_t clauses =
122 "reducing %zu (%.0f%%) out of %zu (%.0f%%) "
124 target, kissat_percent (target, size), size,
125 kissat_percent (size, clauses));
127 unsigned reduced = 0, reduced1 = 0, reduced2 = 0, reduced3 = 0;
131 const unsigned tier1 =
TIER1;
132 const unsigned tier2 =
TIER2;
133 for (
const reducible *
p = begin;
p != end && target--;
p++) {
142 if (c->
glue <= tier1)
144 else if (c->
glue <= tier2)
149 ADD (clauses_reduced_tier1, reduced1);
150 ADD (clauses_reduced_tier2, reduced2);
151 ADD (clauses_reduced_tier3, reduced3);
152 ADD (clauses_reduced, reduced);
159 "reduce limit %" PRIu64
" hit after %" PRIu64
" conflicts",
167 size_t words_to_sweep = arena_size - start;
168 size_t bytes_to_sweep =
sizeof (
word) * words_to_sweep;
174 "reducing %zu words %s %.0f%%", words_to_sweep,
176 kissat_percent (words_to_sweep, arena_size));
181 if (collect_reducibles (
solver, &reds, start)) {
182 sort_reducibles (
solver, &reds);
183 mark_less_useful_clauses_as_garbage (
solver, &reds);
199 return solver->inconsistent ? 20 : 0;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_HEADER_START typedef word ward
ABC_NAMESPACE_IMPL_START void kissat_classify(struct kissat *solver)
void kissat_mark_clause_as_garbage(kissat *solver, clause *c)
bool kissat_compacting(kissat *solver)
void kissat_sparse_collect(kissat *solver, bool compact, reference start)
#define UPDATE_CONFLICT_LIMIT(NAME, COUNT, SCALE_COUNT_FUNCTION, SCALE_DELTA)
#define KISSAT_assert(ignore)
unsigned __int64 word
DECLARATIONS ///.
double percent(double a, double b)
#define kissat_phase(...)
#define RADIX_STACK(VTYPE, RTYPE, S, RANK)
ABC_NAMESPACE_HEADER_START typedef unsigned reference
int kissat_reduce(kissat *solver)
ABC_NAMESPACE_IMPL_START bool kissat_reducing(kissat *solver)
struct limits::@317277023072347355124305102271146250361353123031 reduce
void kissat_compute_and_set_tier_limits(struct kissat *solver)
void kissat_unmark_reason_clauses(kissat *solver, reference start)
bool kissat_flush_and_mark_reason_clauses(kissat *solver, reference start)