cloud-sat/kissat-inc/src/propsearch.c
2023-03-26 19:15:17 +08:00

106 lines
2.6 KiB
C

#define INLINE_ASSIGN
#include "inline.h"
#include "propsearch.h"
#include "bump.h"
// Keep this 'inlined' file separate:
#include "assign.c"
#define PROPAGATE_LITERAL search_propagate_literal
#define PROPAGATION_TYPE "search"
#include "proplit.h"
static inline void
update_search_propagation_statistics (kissat * solver,
unsigned previous_propagated_level)
{
assert (previous_propagated_level <= solver->propagated);
const unsigned propagated = solver->propagated - previous_propagated_level;
LOG ("propagation took %" PRIu64 " propagations", propagated);
LOG ("propagation took %" PRIu64 " ticks", solver->ticks);
ADD (propagations, propagated);
ADD (ticks, solver->ticks);
ADD (search_propagations, propagated);
ADD (search_ticks, solver->ticks);
if (solver->stable)
{
ADD (stable_propagations, propagated);
ADD (stable_ticks, solver->ticks);
}
else
{
ADD (focused_propagations, propagated);
ADD (focused_ticks, solver->ticks);
}
}
static inline void
update_consistently_assigned (kissat * solver)
{
const unsigned assigned = kissat_assigned (solver);
if (assigned != solver->consistently_assigned)
{
LOG ("updating consistently assigned from %u to %u",
solver->consistently_assigned, assigned);
solver->consistently_assigned = assigned;
}
else
LOG ("keeping consistently assigned %u", assigned);
}
static clause *
search_propagate (kissat * solver)
{
clause *res = 0;
while (!res && solver->propagated < SIZE_STACK (solver->trail))
{
const unsigned lit = PEEK_STACK (solver->trail, solver->propagated);
res = search_propagate_literal (solver, lit);
solver->propagated++;
}
return res;
}
clause *
kissat_search_propagate (kissat * solver)
{
assert (!solver->probing);
assert (solver->watching);
assert (!solver->inconsistent);
START (propagate);
solver->ticks = 0;
const unsigned propagated = solver->propagated;
clause *conflict = search_propagate (solver);
update_search_propagation_statistics (solver, propagated);
update_consistently_assigned (solver);
if (conflict)
INC (conflicts);
STOP (propagate);
// CHB
if(solver->stable && solver->heuristic==1){
int i = SIZE_STACK (solver->trail) - 1;
unsigned lit = i>=0?PEEK_STACK (solver->trail, i):0;
while(i>=0 && LEVEL(lit)==solver->level){
lit = PEEK_STACK (solver->trail, i);
kissat_bump_chb(solver,IDX(lit), conflict? 1.0 : 0.9);
i--;
}
}
if(solver->stable && solver->heuristic==1 && conflict) kissat_decay_chb(solver);
return conflict;
}