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.pb;
31  
32  import java.math.BigInteger;
33  
34  import org.sat4j.specs.ContradictionException;
35  import org.sat4j.specs.IConstr;
36  import org.sat4j.specs.ISolver;
37  import org.sat4j.specs.IVec;
38  import org.sat4j.specs.IVecInt;
39  
40  /**
41   * A solver able to deal with pseudo boolean constraints.
42   * 
43   * @author daniel
44   * 
45   */
46  public interface IPBSolver extends ISolver {
47  
48  	/**
49  	 * Create a Pseudo-Boolean constraint of the type "at least n or at most n
50  	 * of those literals must be satisfied"
51  	 * 
52  	 * @param lits
53  	 *            a set of literals. The vector can be reused since the solver
54  	 *            is not supposed to keep a reference to that vector.
55  	 * @param coeffs
56  	 *            the coefficients of the literals. The vector can be reused
57  	 *            since the solver is not supposed to keep a reference to that
58  	 *            vector.
59  	 * @param moreThan
60  	 *            true if it is a constraint >= degree, false if it is a
61  	 *            constraint <= degree
62  	 * @param d
63  	 *            the degree of the cardinality constraint
64  	 * @return a reference to the constraint added in the solver, to use in
65  	 *         removeConstr().
66  	 * @throws ContradictionException
67  	 *             iff the vector of literals is empty or if the constraint is
68  	 *             falsified after unit propagation
69  	 * @see #removeConstr(IConstr)
70  	 */
71  	IConstr addPseudoBoolean(IVecInt lits, IVec<BigInteger> coeffs,
72  			boolean moreThan, BigInteger d) throws ContradictionException;
73  
74  	/**
75  	 * Create a pseudo boolean constraint of the type "at most".
76  	 * 
77  	 * @param literals
78  	 *            a set of literals The vector can be reused since the solver is
79  	 *            not supposed to keep a reference to that vector.
80  	 * @param coeffs
81  	 *            the coefficients of the literals. The vector can be reused
82  	 *            since the solver is not supposed to keep a reference to that
83  	 *            vector.
84  	 * @param degree
85  	 *            the degree of the pseudo-boolean constraint
86  	 * @return a reference to the constraint added in the solver, to use in
87  	 *         removeConstr().
88  	 * @throws ContradictionException
89  	 *             iff the constraint is found trivially unsat.
90  	 * @see #removeConstr(IConstr)
91  	 * @since 2.3.1
92  	 */
93  
94  	IConstr addAtMost(IVecInt literals, IVecInt coeffs, int degree)
95  			throws ContradictionException;
96  
97  	/**
98  	 * Create a pseudo boolean constraint of the type "at most".
99  	 * 
100 	 * @param literals
101 	 *            a set of literals The vector can be reused since the solver is
102 	 *            not supposed to keep a reference to that vector.
103 	 * @param coeffs
104 	 *            the coefficients of the literals. The vector can be reused
105 	 *            since the solver is not supposed to keep a reference to that
106 	 *            vector.
107 	 * @param degree
108 	 *            the degree of the pseudo-boolean constraint
109 	 * @return a reference to the constraint added in the solver, to use in
110 	 *         removeConstr().
111 	 * @throws ContradictionException
112 	 *             iff the constraint is found trivially unsat.
113 	 * @see #removeConstr(IConstr)
114 	 * @since 2.3.1
115 	 */
116 
117 	IConstr addAtMost(IVecInt literals, IVec<BigInteger> coeffs,
118 			BigInteger degree) throws ContradictionException;
119 
120 	/**
121 	 * Create a pseudo-boolean constraint of the type "at least".
122 	 * 
123 	 * @param literals
124 	 *            a set of literals. The vector can be reused since the solver
125 	 *            is not supposed to keep a reference to that vector.
126 	 * @param coeffs
127 	 *            the coefficients of the literals. The vector can be reused
128 	 *            since the solver is not supposed to keep a reference to that
129 	 *            vector.
130 	 * @param degree
131 	 *            the degree of the pseudo-boolean constraint
132 	 * @return a reference to the constraint added in the solver, to use in
133 	 *         removeConstr().
134 	 * @throws ContradictionException
135 	 *             iff the constraint is found trivially unsat.
136 	 * @see #removeConstr(IConstr)
137 	 * @since 2.3.1
138 	 */
139 	IConstr addAtLeast(IVecInt literals, IVecInt coeffs, int degree)
140 			throws ContradictionException;
141 
142 	/**
143 	 * Create a pseudo-boolean constraint of the type "at least".
144 	 * 
145 	 * @param literals
146 	 *            a set of literals. The vector can be reused since the solver
147 	 *            is not supposed to keep a reference to that vector.
148 	 * @param coeffs
149 	 *            the coefficients of the literals. The vector can be reused
150 	 *            since the solver is not supposed to keep a reference to that
151 	 *            vector.
152 	 * @param degree
153 	 *            the degree of the pseudo-boolean constraint
154 	 * @return a reference to the constraint added in the solver, to use in
155 	 *         removeConstr().
156 	 * @throws ContradictionException
157 	 *             iff the constraint is found trivially unsat.
158 	 * @see #removeConstr(IConstr)
159 	 * @since 2.3.1
160 	 */
161 	IConstr addAtLeast(IVecInt literals, IVec<BigInteger> coeffs,
162 			BigInteger degree) throws ContradictionException;
163 
164 	/**
165 	 * Create a pseudo-boolean constraint of the type "subset sum".
166 	 * 
167 	 * @param literals
168 	 *            a set of literals. The vector can be reused since the solver
169 	 *            is not supposed to keep a reference to that vector.
170 	 * @param coeffs
171 	 *            the coefficients of the literals. The vector can be reused
172 	 *            since the solver is not supposed to keep a reference to that
173 	 *            vector.
174 	 * @param weight
175 	 *            the number of literals that must be satisfied
176 	 * @return a reference to the constraint added to the solver. It might
177 	 *         return an object representing a group of constraints.
178 	 * @throws ContradictionException
179 	 *             iff the constraint is trivially unsatisfiable.
180 	 * @since 2.3.1
181 	 */
182 	IConstr addExactly(IVecInt literals, IVecInt coeffs, int weight)
183 			throws ContradictionException;
184 
185 	/**
186 	 * Create a pseudo-boolean constraint of the type "subset sum".
187 	 * 
188 	 * @param literals
189 	 *            a set of literals. The vector can be reused since the solver
190 	 *            is not supposed to keep a reference to that vector.
191 	 * @param coeffs
192 	 *            the coefficients of the literals. The vector can be reused
193 	 *            since the solver is not supposed to keep a reference to that
194 	 *            vector.
195 	 * @param weight
196 	 *            the number of literals that must be satisfied
197 	 * @return a reference to the constraint added to the solver. It might
198 	 *         return an object representing a group of constraints.
199 	 * @throws ContradictionException
200 	 *             iff the constraint is trivially unsatisfiable.
201 	 * @since 2.3.1
202 	 */
203 	IConstr addExactly(IVecInt literals, IVec<BigInteger> coeffs,
204 			BigInteger weight) throws ContradictionException;
205 
206 	/**
207 	 * Provide an objective function to the solver.
208 	 * 
209 	 * @param obj
210 	 *            the objective function
211 	 */
212 	void setObjectiveFunction(ObjectiveFunction obj);
213 
214 	/**
215 	 * Retrieve the objective function from the solver.
216 	 * 
217 	 * @return the objective function
218 	 */
219 	ObjectiveFunction getObjectiveFunction();
220 }