Example #1
0
void SAT::addClause(Clause& c, bool one_watch) {
	assert(c.size() > 0);
	if (c.size() == 1) {
		assert(decisionLevel() == 0);
		if (DEBUG) fprintf(stderr, "warning: adding length 1 clause!\n");
		if (value(c[0]) == l_False) TL_FAIL();
		if (value(c[0]) == l_Undef) enqueue(c[0]);
		free(&c);
		return;
	}
	if (!c.learnt) {
		if (c.size() == 2) bin_clauses++;
		else if (c.size() == 3) tern_clauses++;
		else long_clauses++;
	}

	// Mark lazy lits which are used
	if (c.learnt) for (int i = 0; i < c.size(); i++) incVarUse(var(c[i]));

	if (c.size() == 2) {
		if (!one_watch) watches[toInt(~c[0])].push(c[1]);
		watches[toInt(~c[1])].push(c[0]);
		if (!c.learnt) free(&c);
		return;
	}
	if (!one_watch) watches[toInt(~c[0])].push(&c);
	watches[toInt(~c[1])].push(&c);
	if (c.learnt) learnts_literals += c.size();
	else            clauses_literals += c.size();
        
	if (c.received) receiveds.push(&c);
        else if (c.learnt) learnts.push(&c);
	else            clauses.push(&c);
}
Example #2
0
File: sat.c Project: cmears/chuffed
void SAT::addClause(Clause& c, bool one_watch) {
	assert(c.size() > 0);
	if (c.size() == 1) {
		assert(decisionLevel() == 0);
		if (DEBUG) fprintf(stderr, "warning: adding length 1 clause!\n");
		if (value(c[0]) == l_False) TL_FAIL();
		if (value(c[0]) == l_Undef) enqueue(c[0]);
		free(&c);
		return;
	}
	if (!c.learnt) {
		if (c.size() == 2) bin_clauses++;
		else if (c.size() == 3) tern_clauses++;
		else long_clauses++;
	}

	// Mark lazy lits which are used
	if (c.learnt) for (int i = 0; i < c.size(); i++) incVarUse(var(c[i]));

	if (c.size() == 2 && ((!c.learnt) || (so.bin_clause_opt))) {
		if (!one_watch) watches[toInt(~c[0])].push(c[1]);
		watches[toInt(~c[1])].push(c[0]);
		if (!c.learnt) free(&c);
		return;
	}
	if (!one_watch) watches[toInt(~c[0])].push(&c);
	watches[toInt(~c[1])].push(&c);
	if (c.learnt) learnts_literals += c.size();
	else            clauses_literals += c.size();
	if (c.learnt) {
          learnts.push(&c);
          if (so.learnt_stats) {
            std::set<int> levels;
            for (int i = 0 ; i < c.size() ; i++) {
              levels.insert(out_learnt_level[i]);
            }
            std::stringstream s;
            //            s << "learntclause,";
            s << c.clauseID() << "," << c.size() << "," << levels.size();
            if (so.learnt_stats_nogood) {
                s << ",";
                for (int i = 0 ; i < c.size() ; i++) {
                    s << (i == 0 ? "" : " ") << getLitString(toInt(c[i]));
              //              s << " (" << out_learnt_level[i] << ")";
                }
            }
            //std::cerr << "\n";
            learntClauseString[c.clauseID()] = s.str();
          }
        } else {
          clauses.push(&c);
        }
}
Example #3
0
File: sat.c Project: cmears/chuffed
void SAT::addClause(vec<Lit>& ps, bool one_watch) {
	int i, j;
	for (i = j = 0; i < ps.size(); i++) {
		if (value(ps[i]) == l_True) return;
		if (value(ps[i]) == l_Undef) ps[j++] = ps[i];
	}
	ps.resize(j);
	if (ps.size() == 0) {
		assert(false);
		TL_FAIL();
	}
	addClause(*Clause_new(ps), one_watch);
}
Example #4
0
	AllDiffValue(vec<IntView<U> > _x, int _range) : sz(_x.size()), x(_x.release()), range(_range)
	{
		priority = 2; 
		new_fixed.reserve(sz);
		for (int i = 0; i < sz; i++) x[i].attach(this, i, EVENT_F);
		if (range < sz) TL_FAIL();
		if (range == sz && so.alldiff_cheat) {
			for (int i = 0; i < sz; i++) x[i].getVar()->specialiseToEL();
			// Add clauses [a_1 = i] \/ [a_2 = i] \/ ... \/ [a_n = i]
			for (int i = 0; i < range; i++) {
				vec<Lit> ps(sz);
				for (int j = 0; j < sz; j++) ps[j] = x[j].getLit(i, 1);
				sat.addClause(ps);
			}
		}
	}
Example #5
0
File: sat.c Project: cmears/chuffed
void SAT::addClause(Lit p, Lit q) {
	if (value(p) == l_True || value(q) == l_True) return;
	if (value(p) == l_False && value(q) == l_False) {
		assert(false);
		TL_FAIL();
	}
	if (value(p) == l_False) {
		assert(decisionLevel() == 0);
		enqueue(q);
		return;
	}
	if (value(q) == l_False) {
		assert(decisionLevel() == 0);
		enqueue(p);
		return;
	}
	bin_clauses++;
	watches[toInt(~p)].push(q);
	watches[toInt(~q)].push(p);
}
Example #6
0
	void FlatZincSpace::newIntVar(IntVarSpec* vs) {
		if (vs->alias) {
			iv[intVarCount++] = iv[vs->i];
		} else {
			IntVar* v = NULL;
			if (vs->assigned) v = getConstant(vs->i);
			else if (vs->domain()) {
				AST::SetLit* sl = vs->domain.some();
				if (sl->interval) v = ::newIntVar(sl->min, sl->max);
				else {
					vec<int> d;
					for (unsigned int i = 0; i < sl->s.size(); i++) d.push(sl->s[i]);
					sort((int*) d, (int*) d + d.size());
					v = ::newIntVar(d[0], d.last());
					if (!v->allowSet(d)) TL_FAIL();
				}
			} else {
				v = ::newIntVar();
			}
			iv[intVarCount++] = v;
		}
		iv_introduced[intVarCount-1] = vs->introduced;
	}