解析cnf文件流程图

 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         }

 

posted on 2020-10-10 11:00  QzZq  阅读(557)  评论(0)    收藏  举报

导航