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 protected PBSolverStats stats;
57
58 public PBSolver(AssertingClauseGenerator acg,
59 LearningStrategy<PBDataStructureFactory> learner,
60 PBDataStructureFactory dsf, IOrder order, RestartStrategy restarter) {
61 super(acg, learner, dsf, order, restarter);
62 stats = new PBSolverStats();
63 initStats(stats);
64 }
65
66 public PBSolver(AssertingClauseGenerator acg,
67 LearningStrategy<PBDataStructureFactory> learner,
68 PBDataStructureFactory dsf, SearchParams params, IOrder order,
69 RestartStrategy restarter) {
70 super(acg, learner, dsf, params, order, restarter);
71 stats = new PBSolverStats();
72 initStats(stats);
73 }
74
75 public IConstr addPseudoBoolean(IVecInt literals, IVec<BigInteger> coeffs,
76 boolean moreThan, BigInteger degree) throws ContradictionException {
77 IVecInt vlits = dimacs2internal(literals);
78 assert vlits.size() == literals.size();
79 assert literals.size() == coeffs.size();
80 return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
81 moreThan, degree));
82 }
83
84 public void setObjectiveFunction(ObjectiveFunction obj) {
85 objf = obj;
86 IOrder order = getOrder();
87 if (order instanceof VarOrderHeapObjective) {
88 ((VarOrderHeapObjective) order).setObjectiveFunction(obj);
89 }
90 }
91
92 public ObjectiveFunction getObjectiveFunction() {
93 return objf;
94 }
95 }