2022-08-30 15:42:35 +08:00

85 lines
1.6 KiB
C

#include "internal.h"
#include "logging.h"
void
kissat_enable_reluctant (reluctant * reluctant,
uint64_t period, uint64_t limit)
{
if (limit && period > limit)
period = limit;
reluctant->limited = (limit > 0);
reluctant->trigger = false;
reluctant->period = period;
reluctant->wait = period;
reluctant->u = reluctant->v = 1;
reluctant->limit = limit;
}
void
kissat_disable_reluctant (reluctant * reluctant)
{
reluctant->period = 0;
}
void
kissat_tick_reluctant (reluctant * reluctant)
{
if (!reluctant->period)
return;
if (reluctant->trigger)
return;
assert (reluctant->wait > 0);
if (--reluctant->wait)
return;
uint64_t u = reluctant->u;
uint64_t v = reluctant->v;
if ((u & -u) == v)
{
u++;
v = 1;
}
else
{
assert (UINT64_MAX / 2 >= v);
v *= 2;
}
assert (v);
assert (UINT64_MAX / v >= reluctant->period);
uint64_t wait = v * reluctant->period;
if (reluctant->limited && wait > reluctant->limit)
{
u = v = 1;
wait = reluctant->period;
}
reluctant->trigger = true;
reluctant->wait = wait;
reluctant->u = u;
reluctant->v = v;
}
void
kissat_init_reluctant (kissat * solver)
{
if (GET_OPTION (reluctant))
{
LOG ("enable reluctant doubling with period %d limit %d",
GET_OPTION (reluctantint), GET_OPTION (reluctantlim));
kissat_enable_reluctant (&solver->reluctant,
GET_OPTION (reluctantint),
GET_OPTION (reluctantlim));
}
else
{
LOG ("reluctant doubling disabled and thus no stable restarts");
kissat_disable_reluctant (&solver->reluctant);
}
}