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 package org.sat4j.pb.core;
29
30 import java.math.BigInteger;
31
32 import org.sat4j.minisat.core.AssertingClauseGenerator;
33 import org.sat4j.minisat.core.IOrder;
34 import org.sat4j.minisat.core.LearningStrategy;
35 import org.sat4j.minisat.core.RestartStrategy;
36 import org.sat4j.minisat.core.SearchParams;
37 import org.sat4j.minisat.core.Solver;
38 import org.sat4j.pb.IPBSolver;
39 import org.sat4j.pb.ObjectiveFunction;
40 import org.sat4j.pb.orders.VarOrderHeapObjective;
41 import org.sat4j.specs.ContradictionException;
42 import org.sat4j.specs.IConstr;
43 import org.sat4j.specs.IVec;
44 import org.sat4j.specs.IVecInt;
45
46 public abstract class PBSolver extends Solver<PBDataStructureFactory> implements
47 IPBSolver {
48
49 private ObjectiveFunction objf;
50
51
52
53
54 private static final long serialVersionUID = 1L;
55
56 public PBSolver(AssertingClauseGenerator acg,
57 LearningStrategy<PBDataStructureFactory> learner,
58 PBDataStructureFactory dsf, IOrder order, RestartStrategy restarter) {
59 super(acg, learner, dsf, order, restarter);
60 }
61
62 public PBSolver(AssertingClauseGenerator acg,
63 LearningStrategy<PBDataStructureFactory> learner,
64 PBDataStructureFactory dsf, SearchParams params, IOrder order,
65 RestartStrategy restarter) {
66 super(acg, learner, dsf, params, order, restarter);
67 }
68
69 public IConstr addPseudoBoolean(IVecInt literals, IVec<BigInteger> coeffs,
70 boolean moreThan, BigInteger degree) throws ContradictionException {
71 IVecInt vlits = dimacs2internal(literals);
72 assert vlits.size() == literals.size();
73 assert literals.size() == coeffs.size();
74 return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
75 moreThan, degree));
76 }
77
78 public void setObjectiveFunction(ObjectiveFunction obj) {
79 objf = obj;
80 IOrder order = getOrder();
81 if (order instanceof VarOrderHeapObjective) {
82 ((VarOrderHeapObjective) order).setObjectiveFunction(obj);
83 }
84 }
85
86 public ObjectiveFunction getObjectiveFunction() {
87 return objf;
88 }
89 }