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