View Javadoc

1   /*******************************************************************************
2    * SAT4J: a SATisfiability library for Java Copyright (C) 2004, 2012 Artois University and CNRS
3    *
4    * All rights reserved. This program and the accompanying materials
5    * are made available under the terms of the Eclipse Public License v1.0
6    * which accompanies this distribution, and is available at
7    *  http://www.eclipse.org/legal/epl-v10.html
8    *
9    * Alternatively, the contents of this file may be used under the terms of
10   * either the GNU Lesser General Public License Version 2.1 or later (the
11   * "LGPL"), in which case the provisions of the LGPL are applicable instead
12   * of those above. If you wish to allow use of your version of this file only
13   * under the terms of the LGPL, and not to allow others to use your version of
14   * this file under the terms of the EPL, indicate your decision by deleting
15   * the provisions above and replace them with the notice and other provisions
16   * required by the LGPL. If you do not delete the provisions above, a recipient
17   * may use your version of this file under the terms of the EPL or the LGPL.
18   *
19   * Based on the original MiniSat specification from:
20   *
21   * An extensible SAT solver. Niklas Een and Niklas Sorensson. Proceedings of the
22   * Sixth International Conference on Theory and Applications of Satisfiability
23   * Testing, LNCS 2919, pp 502-518, 2003.
24   *
25   * See www.minisat.se for the original solver in C++.
26   *
27   * Contributors:
28   *   CRIL - initial API and implementation
29   *******************************************************************************/
30  package org.sat4j.specs;
31  
32  import java.io.PrintStream;
33  import java.io.PrintWriter;
34  import java.io.Serializable;
35  import java.util.Map;
36  
37  import org.sat4j.tools.ModelIterator;
38  
39  /**
40   * This interface contains all services provided by a SAT solver.
41   * 
42   * @author leberre
43   */
44  public interface ISolver extends IProblem, Serializable {
45  
46      /**
47       * Create a new variable in the solver (and thus in the vocabulary).
48       * 
49       * WE STRONGLY ENCOURAGE TO PRECOMPUTE THE NUMBER OF VARIABLES NEEDED AND TO
50       * USE newVar(howmany) INSTEAD. IF YOU EXPERIENCE A PROBLEM OF EFFICIENCY
51       * WHEN READING/BUILDING YOUR SAT INSTANCE, PLEASE CHECK THAT YOU ARE NOT
52       * USING THAT METHOD.
53       * 
54       * @return the number of variables available in the vocabulary, which is the
55       *         identifier of the new variable.
56       */
57      @Deprecated
58      int newVar();
59  
60      /**
61       * Ask the solver for a free variable identifier, in Dimacs format (i.e. a
62       * positive number). Note that a previous call to newVar(max) will reserve
63       * in the solver the variable identifier from 1 to max, so nextFreeVarId()
64       * would return max+1, even if some variable identifiers smaller than max
65       * are not used. By default, the method will always answer by the maximum
66       * variable identifier used so far + 1.
67       * 
68       * The number of variables reserved in the solver is accessible through the
69       * {@link #realNumberOfVariables()} method.
70       * 
71       * @param reserve
72       *            if true, the maxVarId is updated in the solver, i.e.
73       *            successive calls to nextFreeVarId(true) will return increasing
74       *            variable id while successive calls to nextFreeVarId(false)
75       *            will always answer the same.
76       * @return a variable identifier not in use in the constraints already
77       *         inside the solver.
78       * @see #realNumberOfVariables()
79       * @since 2.1
80       */
81      int nextFreeVarId(boolean reserve);
82  
83      /**
84       * Tell the solver to consider that the literal is in the CNF.
85       * 
86       * Since model() only return the truth value of the literals that appear in
87       * the solver, it is sometimes required that the solver provides a default
88       * truth value for a given literal. This happens for instance for MaxSat.
89       * 
90       * @param p
91       *            the literal in Dimacs format that should appear in the model.
92       */
93      void registerLiteral(int p);
94  
95      /**
96       * To inform the solver of the expected number of clauses to read. This is
97       * an optional method, that is called when the <code>p cnf</code> line is
98       * read in dimacs formatted input file.
99       * 
100      * Note that this method is supposed to be called AFTER a call to
101      * newVar(int)
102      * 
103      * @param nb
104      *            the expected number of clauses.
105      * @see #newVar(int)
106      * @since 1.6
107      */
108     void setExpectedNumberOfClauses(int nb);
109 
110     /**
111      * Create a clause from a set of literals The literals are represented by
112      * non null integers such that opposite literals a represented by opposite
113      * values. (classical Dimacs way of representing literals).
114      * 
115      * @param literals
116      *            a set of literals
117      * @return a reference to the constraint added in the solver, to use in
118      *         removeConstr().
119      * @throws ContradictionException
120      *             iff the vector of literals is empty or if it contains only
121      *             falsified literals after unit propagation
122      * @see #removeConstr(IConstr)
123      */
124     IConstr addClause(IVecInt literals) throws ContradictionException;
125 
126     /**
127      * Add a clause in order to prevent an assignment to occur. This happens
128      * usually when iterating over models for instance.
129      * 
130      * @param literals
131      * @return
132      * @throws ContradictionException
133      * @since 2.1
134      */
135     IConstr addBlockingClause(IVecInt literals) throws ContradictionException;
136 
137     /**
138      * Remove a constraint returned by one of the add method from the solver.
139      * All learned clauses will be cleared.
140      * 
141      * Current implementation does not handle properly the case of unit clauses.
142      * 
143      * @param c
144      *            a constraint returned by one of the add method.
145      * @return true if the constraint was successfully removed.
146      */
147     boolean removeConstr(IConstr c);
148 
149     /**
150      * Remove a constraint returned by one of the add method from the solver
151      * that is subsumed by a constraint already in the solver or to be added to
152      * the solver.
153      * 
154      * Unlike the removeConstr() method, learned clauses will NOT be cleared.
155      * 
156      * That method is expected to be used to remove constraints used in the
157      * optimization process.
158      * 
159      * In order to prevent a wrong from the user, the method will only work if
160      * the argument is the last constraint added to the solver. An illegal
161      * argument exception will be thrown in other cases.
162      * 
163      * @param c
164      *            a constraint returned by one of the add method. It must be the
165      *            latest constr added to the solver.
166      * @return true if the constraint was successfully removed.
167      * @since 2.1
168      */
169     boolean removeSubsumedConstr(IConstr c);
170 
171     /**
172      * Create clauses from a set of set of literals. This is convenient to
173      * create in a single call all the clauses (mandatory for the distributed
174      * version of the solver). It is mainly a loop to addClause().
175      * 
176      * @param clauses
177      *            a vector of set (VecInt) of literals in the dimacs format. The
178      *            vector can be reused since the solver is not supposed to keep
179      *            a reference to that vector.
180      * @throws ContradictionException
181      *             iff the vector of literals is empty or if it contains only
182      *             falsified literals after unit propagation
183      * @see #addClause(IVecInt)
184      */
185     void addAllClauses(IVec<IVecInt> clauses) throws ContradictionException;
186 
187     /**
188      * Create a cardinality constraint of the type "at most n of those literals
189      * must be satisfied"
190      * 
191      * @param literals
192      *            a set of literals The vector can be reused since the solver is
193      *            not supposed to keep a reference to that vector.
194      * @param degree
195      *            the degree (n) of the cardinality constraint
196      * @return a reference to the constraint added in the solver, to use in
197      *         removeConstr().
198      * @throws ContradictionException
199      *             iff the vector of literals is empty or if it contains more
200      *             than degree satisfied literals after unit propagation
201      * @see #removeConstr(IConstr)
202      */
203 
204     IConstr addAtMost(IVecInt literals, int degree)
205             throws ContradictionException;
206 
207     /**
208      * Create a cardinality constraint of the type "at least n of those literals
209      * must be satisfied"
210      * 
211      * @param literals
212      *            a set of literals. The vector can be reused since the solver
213      *            is not supposed to keep a reference to that vector.
214      * @param degree
215      *            the degree (n) of the cardinality constraint
216      * @return a reference to the constraint added in the solver, to use in
217      *         removeConstr().
218      * @throws ContradictionException
219      *             iff the vector of literals is empty or if degree literals are
220      *             not remaining unfalsified after unit propagation
221      * @see #removeConstr(IConstr)
222      */
223     IConstr addAtLeast(IVecInt literals, int degree)
224             throws ContradictionException;
225 
226     /**
227      * Create a cardinality constraint of the type
228      * "exactly n of those literals must be satisfied".
229      * 
230      * @param literals
231      *            a set of literals. The vector can be reused since the solver
232      *            is not supposed to keep a reference to that vector.
233      * @param n
234      *            the number of literals that must be satisfied
235      * @return a reference to the constraint added to the solver. It might
236      *         return an object representing a group of constraints.
237      * @throws ContradictionException
238      *             iff the constraint is trivially unsatisfiable.
239      * @since 2.3.1
240      */
241     IConstr addExactly(IVecInt literals, int n) throws ContradictionException;
242 
243     /**
244      * To set the internal timeout of the solver. When the timeout is reached, a
245      * timeout exception is launched by the solver.
246      * 
247      * @param t
248      *            the timeout (in s)
249      */
250     void setTimeout(int t);
251 
252     /**
253      * To set the internal timeout of the solver. When the timeout is reached, a
254      * timeout exception is launched by the solver.
255      * 
256      * Here the timeout is given in number of conflicts. That way, the behavior
257      * of the solver should be the same across different architecture.
258      * 
259      * @param count
260      *            the timeout (in number of counflicts)
261      */
262     void setTimeoutOnConflicts(int count);
263 
264     /**
265      * To set the internal timeout of the solver. When the timeout is reached, a
266      * timeout exception is launched by the solver.
267      * 
268      * @param t
269      *            the timeout (in milliseconds)
270      */
271     void setTimeoutMs(long t);
272 
273     /**
274      * Useful to check the internal timeout of the solver.
275      * 
276      * @return the internal timeout of the solver (in seconds)
277      */
278     int getTimeout();
279 
280     /**
281      * Useful to check the internal timeout of the solver.
282      * 
283      * @return the internal timeout of the solver (in milliseconds)
284      * @since 2.1
285      */
286     long getTimeoutMs();
287 
288     /**
289      * Expire the timeout of the solver.
290      */
291     void expireTimeout();
292 
293     /**
294      * Clean up the internal state of the solver.
295      */
296     void reset();
297 
298     /**
299      * Display statistics to the given output stream Please use writers instead
300      * of stream.
301      * 
302      * @param out
303      * @param prefix
304      *            the prefix to put in front of each line
305      * @see #printStat(PrintWriter, String)
306      */
307     @Deprecated
308     void printStat(PrintStream out, String prefix);
309 
310     /**
311      * Display statistics to the given output writer
312      * 
313      * @param out
314      * @param prefix
315      *            the prefix to put in front of each line
316      * @since 1.6
317      */
318     void printStat(PrintWriter out, String prefix);
319 
320     /**
321      * To obtain a map of the available statistics from the solver. Note that
322      * some keys might be specific to some solvers.
323      * 
324      * @return a Map with the name of the statistics as key.
325      */
326     Map<String, Number> getStat();
327 
328     /**
329      * Display a textual representation of the solver configuration.
330      * 
331      * @param prefix
332      *            the prefix to use on each line.
333      * @return a textual description of the solver internals.
334      */
335     String toString(String prefix);
336 
337     /**
338      * Remove clauses learned during the solving process.
339      */
340     void clearLearntClauses();
341 
342     /**
343      * Set whether the solver is allowed to simplify the formula by propagating
344      * the truth value of top level satisfied variables.
345      * 
346      * Note that the solver should not be allowed to perform such simplification
347      * when constraint removal is planned.
348      */
349     void setDBSimplificationAllowed(boolean status);
350 
351     /**
352      * Indicate whether the solver is allowed to simplify the formula by
353      * propagating the truth value of top level satisfied variables.
354      * 
355      * Note that the solver should not be allowed to perform such simplification
356      * when constraint removal is planned.
357      */
358     boolean isDBSimplificationAllowed();
359 
360     /**
361      * Allow the user to hook a listener to the solver to be notified of the
362      * main steps of the search process.
363      * 
364      * @param sl
365      *            a Search Listener.
366      * @since 2.1
367      */
368     <S extends ISolverService> void setSearchListener(SearchListener<S> sl);
369 
370     /**
371      * Get the current SearchListener.
372      * 
373      * @return a Search Listener.
374      * @since 2.2
375      */
376     <S extends ISolverService> SearchListener<S> getSearchListener();
377 
378     /**
379      * To know if the solver is in verbose mode (output allowed) or not.
380      * 
381      * @return true if the solver is verbose.
382      * @since 2.2
383      */
384     boolean isVerbose();
385 
386     /**
387      * Set the verbosity of the solver
388      * 
389      * @param value
390      *            true to allow the solver to output messages on the console,
391      *            false either.
392      * @since 2.2
393      */
394     void setVerbose(boolean value);
395 
396     /**
397      * Set the prefix used to display information.
398      * 
399      * @param prefix
400      *            the prefix to be in front of each line of text
401      * @since 2.2
402      */
403     void setLogPrefix(String prefix);
404 
405     /**
406      * 
407      * @return the string used to prefix the output.
408      * @since 2.2
409      */
410     String getLogPrefix();
411 
412     /**
413      * 
414      * Retrieve an explanation of the inconsistency in terms of assumption
415      * literals. This is only application when isSatisfiable(assumps) is used.
416      * Note that !isSatisfiable(assumps)&&assumps.contains(unsatExplanation())
417      * should hold.
418      * 
419      * @return a subset of the assumptions used when calling
420      *         isSatisfiable(assumps). Will return null if not applicable (i.e.
421      *         no assumptions used).
422      * @see #isSatisfiable(IVecInt)
423      * @see #isSatisfiable(IVecInt, boolean)
424      * @since 2.2
425      */
426     IVecInt unsatExplanation();
427 
428     /**
429      * That method is designed to be used to retrieve the real model of the
430      * current set of constraints, i.e. to provide the truth value of boolean
431      * variables used internally in the solver (for encoding purposes for
432      * instance).
433      * 
434      * If no variables are added in the solver, then
435      * Arrays.equals(model(),modelWithInternalVariables()).
436      * 
437      * In case new variables are added to the solver, then the number of models
438      * returned by that method is greater of equal to the number of models
439      * returned by model() when using a ModelIterator.
440      * 
441      * @return an array of literals, in Dimacs format, corresponding to a model
442      *         of the formula over all the variables declared in the solver.
443      * @see #model()
444      * @see ModelIterator
445      * @since 2.3.1
446      */
447     int[] modelWithInternalVariables();
448 
449     /**
450      * Retrieve the real number of variables used in the solver.
451      * 
452      * In many cases, realNumberOfVariables()==nVars(). However, when working
453      * with SAT encodings or translation from MAXSAT to PMS, one can have
454      * realNumberOfVariables()>nVars().
455      * 
456      * Those additional variables are supposed to be created using the
457      * {@link #nextFreeVarId(boolean)} method.
458      * 
459      * @return the number of variables reserved in the solver.
460      * @see #nextFreeVarId(boolean)
461      * @since 2.3.1
462      */
463     int realNumberOfVariables();
464 
465     /**
466      * Ask to the solver if it is in "hot" mode, meaning that the heuristics is
467      * not reset after call is isSatisfiable(). This is only useful in case of
468      * repeated calls to the solver with same set of variables.
469      * 
470      * @return true iff the solver keep the heuristics value unchanged across
471      *         calls.
472      * @since 2.3.2
473      */
474     boolean isSolverKeptHot();
475 
476     /**
477      * Changed the behavior of the SAT solver heuristics between successive
478      * calls. If the value is true, then the solver will be "hot" on reuse, i.e.
479      * the heuristics will not be reset. Else the heuristics will be reset.
480      * 
481      * @param keepHot
482      *            true to keep the heuristics values across calls, false either.
483      * @since 2.3.2
484      */
485     void setKeepSolverHot(boolean keepHot);
486 }