void SolutionExtender::addClause(const vector<Lit>& lits, const Lit blockedOn) { const uint32_t blocked_on_inter = solver->map_outer_to_inter(blockedOn.var()); assert(solver->varData[blocked_on_inter].removed == Removed::elimed); assert(contains_lit(lits, blockedOn)); if (satisfied(lits)) return; #ifdef VERBOSE_DEBUG_SOLUTIONEXTENDER for(Lit lit: lits) { Lit lit_inter = solver->map_outer_to_inter(lit); cout << lit << ": " << solver->model_value(lit) << "(elim: " << removed_type_to_string(solver->varData[lit_inter.var()].removed) << ")" << ", "; } cout << "blocked on: " << blockedOn << endl; #endif if (solver->model_value(blockedOn) != l_Undef) { cout << "ERROR: Model value for var " << blockedOn.unsign() << " is " << solver->model_value(blockedOn) << " but that doesn't satisfy a v-elim clause on the stack!" << endl; } assert(solver->model_value(blockedOn) == l_Undef); solver->model[blockedOn.var()] = blockedOn.sign() ? l_False : l_True; if (solver->conf.verbosity >= 10) { cout << "Extending VELIM cls. -- setting model for var " << blockedOn.unsign() << " to " << solver->model[blockedOn.var()] << endl; } assert(satisfied(lits)); solver->varReplacer->extend_model(blockedOn.var()); }
void XorSubsumer::unlinkClause(XorClauseSimp c, const Var elim) { XorClause& cl = *c.clause; for (uint32_t i = 0; i < cl.size(); i++) { removeW(occur[cl[i].var()], &cl); } if (elim != var_Undef) { XorElimedClause data; for (Lit *it = cl.getData(), *end = cl.getDataEnd(); it != end; it++) { data.lits.push_back(it->unsign()); } data.xorEqualFalse = cl.xorEqualFalse(); elimedOutVar[elim].push_back(data); } solver.detachClause(cl); solver.clauseAllocator.clauseFree(c.clause); clauses[c.index].clause = NULL; }