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); }