forked from myxxxsquared/NLocalSAT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsatfuncs.py
77 lines (62 loc) · 1.68 KB
/
satfuncs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
__all__ = [
"lit_var",
"lit_sign",
"lit_pair",
"pair_lit",
"read_cnf_file",
"read_solution",
]
def lit_var(l):
assert l != 0
return l - 1 if l > 0 else -l - 1
def lit_sign(l):
assert l != 0
return l > 0
def lit_pair(l):
assert l != 0
return (l - 1, True) if l > 0 else (-l - 1, False)
def pair_lit(p):
return p[0] + 1 if p[1] else -p[0] - 1
def read_cnf_file(f):
num_vars, num_clauses = -1, -1
clauses = []
for line in f:
line = line.strip()
if not line:
continue
if line.startswith("c"):
continue
if line.startswith("p cnf"):
assert num_vars == -1
assert num_clauses == -1
line = line.split()
num_vars = int(line[2])
num_clauses = int(line[3])
assert num_vars >= 0
assert num_clauses >= 0
continue
line = line.split()
new_clause = list(map(int, line))
assert new_clause[-1] == 0
new_clause = new_clause[:-1]
for lit in new_clause:
assert lit_var(lit) < num_vars
clauses.append(new_clause)
assert len(clauses) == num_clauses
return num_vars, num_clauses, clauses
def read_solution(f):
results = []
for line in f:
line = line.strip()
if not line:
continue
if line[0] == "v":
line = line.split()
assert line[0] == "v"
line = map(int, line[1:])
for val in line:
if val == 0:
break
results.append(val > 0)
assert abs(val) == len(results)
return results or None