77 lines
2.0 KiB
C
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
|
|
}
|