Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/sat/solvers/satsolver.pyx
8820 views
1
"""
2
Abstract SAT Solver.
3
4
All SAT solvers must inherit from this class.
5
6
.. note::
7
8
Our SAT solver interfaces are 1-based, i.e., literals start at
9
1. This is consistent with the popular DIMACS format for SAT
10
solving but not with Pythion's 0-based convention. However, this
11
also allows to construct clauses using simple integers.
12
13
AUTHORS:
14
15
- Martin Albrecht (2012): first version
16
"""
17
18
cdef class SatSolver:
19
def __cinit__(self, *args, **kwds):
20
"""
21
Constuct a new SATSolver.
22
23
EXAMPLE::
24
25
sage: from sage.sat.solvers.satsolver import SatSolver
26
sage: solver = SatSolver()
27
"""
28
pass
29
30
def var(self, decision=None):
31
"""
32
Return a *new* variable.
33
34
INPUT:
35
36
- ``decision`` - is this variable a deicison variable?
37
38
EXAMPLE::
39
40
sage: from sage.sat.solvers.satsolver import SatSolver
41
sage: solver = SatSolver()
42
sage: solver.var()
43
Traceback (most recent call last):
44
...
45
NotImplementedError
46
"""
47
raise NotImplementedError
48
49
def nvars(self):
50
"""
51
Return the number of variables.
52
53
EXAMPLE::
54
55
sage: from sage.sat.solvers.satsolver import SatSolver
56
sage: solver = SatSolver()
57
sage: solver.nvars()
58
Traceback (most recent call last):
59
...
60
NotImplementedError
61
"""
62
raise NotImplementedError
63
64
def add_clause(self, lits):
65
"""
66
Add a new clause to set of clauses.
67
68
INPUT:
69
70
- ``lits`` - a tuple of integers != 0
71
72
.. note::
73
74
If any element ``e`` in ``lits`` has ``abs(e)`` greater
75
than the number of variables generated so far, then new
76
variables are created automatically.
77
78
EXAMPLE::
79
80
sage: from sage.sat.solvers.satsolver import SatSolver
81
sage: solver = SatSolver()
82
sage: solver.add_clause( (1, -2 , 3) )
83
Traceback (most recent call last):
84
...
85
NotImplementedError
86
"""
87
raise NotImplementedError
88
89
def __call__(self, assumptions=None):
90
"""
91
Solve this instance.
92
93
INPUT:
94
95
- ``assumptions`` - assumed variable assignments (default: ``None``)
96
97
OUTPUT:
98
99
- If this instance is SAT: A tuple of length ``nvars()+1``
100
where the ``i``-th entry holds an assignment for the
101
``i``-th variables (the ``0``-th entry is always ``None``).
102
103
- If this instance is UNSAT: ``False``
104
105
- If the solver was interrupted before deciding satisfiability
106
``None``.
107
108
EXAMPLE::
109
110
sage: from sage.sat.solvers.satsolver import SatSolver
111
sage: solver = SatSolver()
112
sage: solver()
113
Traceback (most recent call last):
114
...
115
NotImplementedError
116
"""
117
raise NotImplementedError
118
119
def conflict_clause(self):
120
"""
121
Return conflict clause if this instance is UNSAT and the last
122
call used assumptions.
123
124
EXAMPLE::
125
126
sage: from sage.sat.solvers.satsolver import SatSolver
127
sage: solver = SatSolver()
128
sage: solver.conflict_clause()
129
Traceback (most recent call last):
130
...
131
NotImplementedError
132
"""
133
raise NotImplementedError
134
135
def learnt_clauses(self, unitary_only=False):
136
"""
137
Return learnt clauses.
138
139
INPUT:
140
141
- ``unitary_only`` - return only unitary learnt clauses (default: ``False``)
142
143
EXAMPLE::
144
145
sage: from sage.sat.solvers.satsolver import SatSolver
146
sage: solver = SatSolver()
147
sage: solver.learnt_clauses()
148
Traceback (most recent call last):
149
...
150
NotImplementedError
151
152
sage: solver.learnt_clauses(unitary_only=True)
153
Traceback (most recent call last):
154
...
155
NotImplementedError
156
"""
157
raise NotImplementedError
158
159
def __repr__(self):
160
"""
161
TESTS::
162
163
sage: from sage.sat.solvers.satsolver import SatSolver
164
sage: solver = SatSolver()
165
sage: solver
166
a generic SAT solver (don't use me, inherit from me)
167
"""
168
return "a generic SAT solver (don't use me, inherit from me)"
169
170
def clauses(self, filename=None):
171
"""
172
Return original clauses.
173
174
INPUT:
175
176
- ``filename'' - if not ``None`` clauses are written to ``filename`` in
177
DIMACS format (default: ``None``)
178
179
OUTPUT:
180
181
If ``filename`` is ``None`` then a list of ``lits, is_xor, rhs``
182
tuples is returned, where ``lits`` is a tuple of literals,
183
``is_xor`` is always ``False`` and ``rhs`` is always ``None``.
184
185
If ``filename`` points to a writable file, then the list of original
186
clauses is written to that file in DIMACS format.
187
188
189
EXAMPLE::
190
191
sage: from sage.sat.solvers.satsolver import SatSolver
192
sage: solver = SatSolver()
193
sage: solver.clauses()
194
Traceback (most recent call last):
195
...
196
NotImplementedError
197
"""
198
raise NotImplementedError
199
200
def __getattr__(self, name):
201
"""
202
EXAMPLE::
203
204
sage: from sage.sat.solvers.satsolver import SatSolver
205
sage: solver = SatSolver()
206
sage: solver.gens() # __getattr__ points this to clauses
207
Traceback (most recent call last):
208
...
209
NotImplementedError
210
"""
211
if name == "gens":
212
return self.clauses
213
else:
214
raise AttributeError("'%s' object has no attribute '%s'"%(self.__class__.__name__,name))
215
216
def trait_names(self):
217
"""
218
Allow alias to appear in tab completion.
219
220
EXAMPLE::
221
222
sage: from sage.sat.solvers.satsolver import SatSolver
223
sage: solver = SatSolver()
224
sage: solver.trait_names()
225
['gens']
226
"""
227
return ["gens"]
228
229
230