![]()
1 IntOption verb("MAIN", "verb", "Verbosity level (0=silent, 1=some, 2=more).", 1, IntRange(0, 2));
2 BoolOption mod("MAIN", "model", "show model.", false);
3 IntOption vv("MAIN", "vv", "Verbosity every vv conflicts", 10000, IntRange(1, INT32_MAX));
4 IntOption cpu_lim("MAIN", "cpu-lim", "Limit on CPU time allowed in seconds.\n", INT32_MAX,
5 IntRange(0, INT32_MAX));
6 IntOption mem_lim("MAIN", "mem-lim", "Limit on memory usage in megabytes.\n", INT32_MAX,
7 IntRange(0, INT32_MAX));
8
9 parseOptions(argc, argv, true);
10
11 Solver S;
12
13 S.verbosity = verb;
14 S.verbEveryConflicts = vv;
15 S.showModel = mod;
16
17 solver = &S;
18
19 parse_DIMACS(in, S);
20
21 gzclose(in);
1 static void parse_DIMACS(gzFile input_stream, Solver& S) {
2 StreamBuffer in(input_stream);
3 parse_DIMACS_main(in, S); }
1 static void parse_DIMACS_main(B& in, Solver& S) {
2 vec<Lit> lits;
3 int vars = 0;
4 int clauses = 0;
5 int cnt = 0;
6 //读取cnf
7 for (;;){
8 skipWhitespace(in);
9 if (*in == EOF) break;
10 else if (*in == 'p'){
11 if (eagerMatch(in, "p cnf")){
12 vars = parseInt(in);
13 clauses = parseInt(in);
14 // SATRACE'06 hack
15 // if (clauses > 4000000)
16 // S.eliminate(true);
17 }else{
18 printf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3);
19 }
20 }
21 else if (*in == 'c' || *in == 'p')
22 skipLine(in);
23 else{
24 cnt++;
25 readClause(in, S, lits);
26 S.addClause_(lits); }
27 }
28 if (vars != S.nVars())
29 fprintf(stderr, "WARNING! DIMACS header mismatch: wrong number of variables.\n");
30 if (cnt != clauses)
31 fprintf(stderr, "WARNING! DIMACS header mismatch: wrong number of clauses.\n");
32 }
1 bool Solver::addClause_(vec <Lit> &ps) {
2 //决策层为0添加
3 assert(decisionLevel() == 0);
4 if (!ok) return false;
5
6 // Check if clause is satisfied and remove false/duplicate literals:
7 sort(ps);
8
9 vec <Lit> oc;
10 oc.clear();
11
12 Lit p;
13 int i, j, flag = 0;
14 if (certifiedUNSAT) {
15 for (i = j = 0, p = lit_Undef; i < ps.size(); i++) {
16 oc.push(ps[i]);
17 // 如果找到与条款集一致的部分分配,则为“ l_True”。
18 // 如果所有变量都是决策变量,则这意味着子句集是可满足的。
19 // 如果子句集不令人满意,则为“ l_False”。
20 // 如果达到冲突数量的界限,则为“ l_Undef”。
21 // Lit p = lit_Undef (-2) -2 ^ 1 = -1
22 if (value(ps[i]) == l_True || ps[i] == ~p || value(ps[i]) == l_False)
23 flag = 1;
24 }
25 }
26
27 for (i = j = 0, p = lit_Undef; i < ps.size(); i++)
28 // 如果找到与条款集一致的部分分配,则为“ l_True”。
29 // 如果所有变量都是决策变量,则这意味着子句集是可满足的。
30 // 如果子句集不令人满意,则为“ l_False”。
31 // 如果达到冲突数量的界限,则为“ l_Undef”。
32 // Lit p = lit_Undef (-2) -2 ^ 1 = -1
33 if (value(ps[i]) == l_True || ps[i] == ~p)
34 return true;
35 else if (value(ps[i]) != l_False && ps[i] != p)
36 ps[j++] = p = ps[i];
37 ps.shrink(i - j);
38
39 if (flag && (certifiedUNSAT)) {
40 for (i = j = 0, p = lit_Undef; i < ps.size(); i++)
41 fprintf(certifiedOutput, "%i ", (var(ps[i]) + 1) * (-2 * sign(ps[i]) + 1));
42 fprintf(certifiedOutput, "0\n");
43
44 fprintf(certifiedOutput, "d ");
45 for (i = j = 0, p = lit_Undef; i < oc.size(); i++)
46 fprintf(certifiedOutput, "%i ", (var(oc[i]) + 1) * (-2 * sign(oc[i]) + 1));
47 fprintf(certifiedOutput, "0\n");
48 }
49
50 if (ps.size() == 0)
51 return ok = false;
52 else if (ps.size() == 1) {
53 uncheckedEnqueue(ps[0]);
54 return ok = (propagate() == CRef_Undef);
55 } else {
56 CRef cr = ca.alloc(ps, false);
57 clauses.push(cr);
58 attachClause(cr);
59 }
60
61 return true;
62 }
1 void Solver::attachClause(CRef cr) {
2 const Clause &c = ca[cr];
3
4 assert(c.size() > 1);
5 if (c.size() == 2) {
6 watchesBin[~c[0]].push(Watcher(cr, c[1]));
7 watchesBin[~c[1]].push(Watcher(cr, c[0]));
8 } else {
9 watches[~c[0]].push(Watcher(cr, c[1]));
10 watches[~c[1]].push(Watcher(cr, c[0]));
11 }
12 if (c.learnt()) learnts_literals += c.size();
13 else clauses_literals += c.size();
14 }
1 template<class Lits>
2 CRef alloc(const Lits &ps, bool learnt = false) {
3 assert(sizeof(Lit) == sizeof(uint32_t));
4 assert(sizeof(float) == sizeof(uint32_t));
5 bool use_extra = learnt | extra_clause_field;
6
7 CRef cid = RegionAllocator<uint32_t>::alloc(clauseWord32Size(ps.size(), use_extra));
8 new(lea(cid)) Clause(ps, use_extra, learnt);
9
10 return cid;
11 }