2023-03-26 19:15:17 +08:00

77 lines
2.0 KiB
C

#include "internal.h"
#include "logging.h"
#include "promote.h"
unsigned
kissat_recompute_glue (kissat * solver, clause * c)
{
assert (EMPTY_STACK (solver->promote));
for (all_literals_in_clause (lit, c))
{
assert (VALUE (lit));
const unsigned level = LEVEL (lit);
frame *frame = &FRAME (level);
if (frame->promote)
continue;
frame->promote = true;
PUSH_STACK (solver->promote, level);
}
for (all_stack (unsigned, level, solver->promote))
{
frame *frame = &FRAME (level);
assert (frame->promote);
frame->promote = false;
}
unsigned res = SIZE_STACK (solver->promote);
CLEAR_STACK (solver->promote);
return res;
}
void
kissat_promote_clause (kissat * solver, clause * c, unsigned new_glue)
{
assert (!c->keep);
assert (c->redundant);
const unsigned old_glue = c->glue;
assert (new_glue < old_glue);
const unsigned tier1 = GET_OPTION (tier1);
const unsigned tier2 = MAX (GET_OPTION (tier2), GET_OPTION (tier1));
if (c->hyper)
LOGCLS (c, "promoting to new glue %u", new_glue);
else if (new_glue <= tier1)
{
assert (tier1 < old_glue);
assert (new_glue <= tier1);
LOGCLS (c, "promoting to new glue %u to tier1", new_glue);
INC (clauses_promoted1);
c->keep = true;
}
else if (old_glue > tier2 && new_glue <= tier2)
{
assert (tier2 < old_glue);
assert (tier1 < new_glue && new_glue <= tier2);
LOGCLS (c, "promoting to new glue %u to tier2", new_glue);
INC (clauses_promoted2);
c->used = 2;
}
else if (old_glue <= tier2)
{
INC (clauses_kept2);
assert (tier1 < old_glue && old_glue <= tier2);
assert (tier1 < new_glue && new_glue <= tier2);
LOGCLS (c, "keeping to new glue %u in tier2", new_glue);
}
else
{
INC (clauses_kept3);
assert (tier2 < old_glue);
assert (tier2 < new_glue);
LOGCLS (c, "keeping to new glue %u in tier3", new_glue);
}
INC (clauses_improved);
c->glue = new_glue;
#ifndef LOGGING
(void) solver;
#endif
}