bool ClingoPropagator::simplify(Solver& s, bool) { if (!s.validVar(aux_.var())) { ClauseDB::size_type i, j, end = db_.size(); LitVec cc; Var last = s.numVars(); aux_ = lit_true(); for (i = j = 0; i != end; ++i) { db_[j++] = db_[i]; ClauseHead* c = db_[i]->clause(); if (c && c->aux()) { cc.clear(); c->toLits(cc); Literal x = *std::max_element(cc.begin(), cc.end()); if (x.var() > last) { c->destroy(&s, true); --j; } else if (aux_ < x) { aux_ = x; } } } db_.erase(db_.begin()+j, db_.end()); } simplifyDB(s, db_, false); return false; }
Constraint::PropResult ModelEnumerator::BacktrackFinder::propagate(Solver& s, Literal, uint32& pos) { assert(pos < nogoods.size() && nogoods[pos] != 0); ClauseHead* c = static_cast<ClauseHead*>(nogoods[pos]); if (!c->locked(s)) { c->destroy(&s, true); nogoods[pos] = (c = 0); while (!nogoods.empty() && !nogoods.back()) { nogoods.pop_back(); } } return PropResult(true, c != 0); }
void CBConsequences::LocalConstraint::add(Solver& s, Constraint* c) { if (!locked.empty()) { static_cast<ClauseHead*>(locked.back())->detach(s); ConstraintDB::size_type j = 0; for (ConstraintDB::size_type i = 0; i != locked.size(); ++i) { ClauseHead* h = (ClauseHead*)locked[i]; if (h->locked(s)) locked[j++] = h; else h->destroy(&s, false); } locked.erase(locked.begin()+j, locked.end()); } locked.push_back(c); }