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.ILits;
34 import org.sat4j.minisat.core.IOrder;
35 import org.sat4j.minisat.core.LearningStrategy;
36 import org.sat4j.pb.constraints.pb.PBConstr;
37 import org.sat4j.specs.ContradictionException;
38 import org.sat4j.specs.IConstr;
39 import org.sat4j.specs.IVec;
40 import org.sat4j.specs.IVecInt;
41
42 public class PBSolverWithImpliedClause extends PBSolverCP<ILits> {
43
44 public PBSolverWithImpliedClause(AssertingClauseGenerator acg,
45 LearningStrategy<ILits,PBDataStructureFactory<ILits>> learner, PBDataStructureFactory<ILits> dsf, IOrder<ILits> order) {
46 super(acg, learner, dsf, order);
47 }
48
49
50
51
52 private static final long serialVersionUID = 1L;
53
54 @Override
55 public IConstr addPseudoBoolean(IVecInt literals, IVec<BigInteger> coeffs,
56 boolean moreThan, BigInteger degree) throws ContradictionException {
57 IVecInt vlits = dimacs2internal(literals);
58 assert vlits.size() == literals.size();
59 assert literals.size() == coeffs.size();
60 PBConstr result = (PBConstr)dsfactory.createPseudoBooleanConstraint(
61 vlits, coeffs, moreThan, degree);
62 if (result != null) {
63 IVecInt clits = result.computeAnImpliedClause();
64 if (clits != null) {
65 addConstr(dsfactory.createClause(clits));
66 }
67 }
68 return addConstr(result);
69 }
70
71 @Override
72 public String toString(String prefix) {
73 return super.toString(prefix) + "\n" + prefix
74 + "Add implied clauses in preprocessing";
75 }
76 }