Ejemplo n.º 1
0
void ReduceDB::remove_cl_from_array_and_count_stats(
    CleaningStats& tmpStats
    , uint64_t sumConfl
) {
    size_t i, j;
    for (i = j = 0
        ; i < solver->longRedCls[1].size()
        ; i++
    ) {
        ClOffset offset = solver->longRedCls[1][i];
        Clause* cl = solver->cl_alloc.ptr(offset);
        assert(cl->size() > 3);

        if (cl->stats.locked) {
            cl_locked++;
        } else if (cl->stats.marked_clause) {
            cl_marked++;
        } else if (cl->stats.ttl != 0) {
            cl_ttl++;
        } else if (solver->clause_locked(*cl, offset)) {
            cl_locked_solver++;
        }

        if (cl->stats.glue <= solver->conf.glue_must_keep_clause_if_below_or_eq) {
            solver->longRedCls[0].push_back(offset);
            continue;
        }

        if (!cl_needs_removal(cl, offset)) {
            cl->stats.ttl = 0;
            solver->longRedCls[1][j++] = offset;
            tmpStats.remain.incorporate(cl, sumConfl);
            cl->stats.marked_clause = 0;
            continue;
        }

        //Stats Update
        cl->setRemoved();
        solver->watches.smudge((*cl)[0]);
        solver->watches.smudge((*cl)[1]);
        tmpStats.removed.incorporate(cl, sumConfl);
        solver->litStats.redLits -= cl->size();

        *solver->drat << del << *cl << fin;
        delayed_clause_free.push_back(offset);
    }
    solver->longRedCls[1].resize(j);
}