コード例 #1
0
ファイル: clingo.cpp プロジェクト: potassco/clasp
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;
}
コード例 #2
0
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);
}
コード例 #3
0
ファイル: cb_enumerator.cpp プロジェクト: klusark/sat
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);
}