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.core.ConstrGroup;
33 import org.sat4j.core.Vec;
34 import org.sat4j.minisat.core.IOrder;
35 import org.sat4j.minisat.core.LearningStrategy;
36 import org.sat4j.minisat.core.RestartStrategy;
37 import org.sat4j.minisat.core.SearchParams;
38 import org.sat4j.minisat.core.Solver;
39 import org.sat4j.pb.IPBSolver;
40 import org.sat4j.pb.ObjectiveFunction;
41 import org.sat4j.pb.orders.IOrderObjective;
42 import org.sat4j.specs.ContradictionException;
43 import org.sat4j.specs.IConstr;
44 import org.sat4j.specs.IVec;
45 import org.sat4j.specs.IVecInt;
46
47 public abstract class PBSolver extends Solver<PBDataStructureFactory> implements
48 IPBSolver {
49
50 private ObjectiveFunction objf;
51
52
53
54
55 private static final long serialVersionUID = 1L;
56
57 protected PBSolverStats stats;
58
59 public PBSolver(LearningStrategy<PBDataStructureFactory> learner,
60 PBDataStructureFactory dsf, IOrder order, RestartStrategy restarter) {
61 super(learner, dsf, order, restarter);
62 stats = new PBSolverStats();
63 initStats(stats);
64 }
65
66 public PBSolver(LearningStrategy<PBDataStructureFactory> learner,
67 PBDataStructureFactory dsf, SearchParams params, IOrder order,
68 RestartStrategy restarter) {
69 super(learner, dsf, params, order, restarter);
70 stats = new PBSolverStats();
71 initStats(stats);
72 }
73
74 public IConstr addPseudoBoolean(IVecInt literals, IVec<BigInteger> coeffs,
75 boolean moreThan, BigInteger degree) throws ContradictionException {
76 IVecInt vlits = dimacs2internal(literals);
77 assert vlits.size() == literals.size();
78 assert literals.size() == coeffs.size();
79 return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
80 moreThan, degree));
81 }
82
83 public void setObjectiveFunction(ObjectiveFunction obj) {
84 objf = obj;
85 IOrder order = getOrder();
86 if (order instanceof IOrderObjective) {
87 ((IOrderObjective) order).setObjectiveFunction(obj);
88 }
89 }
90
91 public ObjectiveFunction getObjectiveFunction() {
92 return objf;
93 }
94
95 public IConstr addAtMost(IVecInt literals, IVecInt coeffs, int degree)
96 throws ContradictionException {
97
98 IVec<BigInteger> bcoeffs = new Vec<BigInteger>(coeffs.size());
99 for (int i = 0; i < coeffs.size(); i++) {
100 bcoeffs.push(BigInteger.valueOf(coeffs.get(i)));
101 }
102 return addAtMost(literals, bcoeffs, BigInteger.valueOf(degree));
103 }
104
105 public IConstr addAtMost(IVecInt literals, IVec<BigInteger> coeffs,
106 BigInteger degree) throws ContradictionException {
107 IVecInt vlits = dimacs2internal(literals);
108 assert vlits.size() == literals.size();
109 assert literals.size() == coeffs.size();
110 return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
111 false, degree));
112 }
113
114 public IConstr addAtLeast(IVecInt literals, IVecInt coeffs, int degree)
115 throws ContradictionException {
116
117 IVec<BigInteger> bcoeffs = new Vec<BigInteger>(coeffs.size());
118 for (int i = 0; i < coeffs.size(); i++) {
119 bcoeffs.push(BigInteger.valueOf(coeffs.get(i)));
120 }
121 return addAtLeast(literals, bcoeffs, BigInteger.valueOf(degree));
122 }
123
124 public IConstr addAtLeast(IVecInt literals, IVec<BigInteger> coeffs,
125 BigInteger degree) throws ContradictionException {
126 IVecInt vlits = dimacs2internal(literals);
127 assert vlits.size() == literals.size();
128 assert literals.size() == coeffs.size();
129 return addConstr(dsfactory.createPseudoBooleanConstraint(vlits, coeffs,
130 true, degree));
131 }
132
133 public IConstr addExactly(IVecInt literals, IVecInt coeffs, int weight)
134 throws ContradictionException {
135
136 IVec<BigInteger> bcoeffs = new Vec<BigInteger>(coeffs.size());
137 for (int i = 0; i < coeffs.size(); i++) {
138 bcoeffs.push(BigInteger.valueOf(coeffs.get(i)));
139 }
140 return addExactly(literals, bcoeffs, BigInteger.valueOf(weight));
141 }
142
143 public IConstr addExactly(IVecInt literals, IVec<BigInteger> coeffs,
144 BigInteger weight) throws ContradictionException {
145 IVecInt vlits = dimacs2internal(literals);
146 assert vlits.size() == literals.size();
147 assert literals.size() == coeffs.size();
148 ConstrGroup group = new ConstrGroup(false);
149 group.add(addConstr(dsfactory.createPseudoBooleanConstraint(vlits,
150 coeffs, false, weight)));
151 group.add(addConstr(dsfactory.createPseudoBooleanConstraint(vlits,
152 coeffs, true, weight)));
153 return group;
154 }
155 }