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.constraints;
29
30 import java.math.BigInteger;
31
32 import org.sat4j.minisat.constraints.AbstractDataStructureFactory;
33 import org.sat4j.minisat.constraints.cnf.Clauses;
34 import org.sat4j.minisat.constraints.cnf.LearntBinaryClause;
35 import org.sat4j.minisat.constraints.cnf.LearntHTClause;
36 import org.sat4j.minisat.constraints.cnf.Lits;
37 import org.sat4j.minisat.constraints.cnf.UnitClause;
38 import org.sat4j.minisat.core.Constr;
39 import org.sat4j.minisat.core.ILits;
40 import org.sat4j.pb.constraints.pb.AtLeastPB;
41 import org.sat4j.pb.constraints.pb.BinaryClausePB;
42 import org.sat4j.pb.constraints.pb.HTClausePB;
43 import org.sat4j.pb.constraints.pb.IDataStructurePB;
44 import org.sat4j.pb.constraints.pb.IInternalPBConstraintCreator;
45 import org.sat4j.pb.constraints.pb.PBConstr;
46 import org.sat4j.pb.core.PBDataStructureFactory;
47 import org.sat4j.specs.ContradictionException;
48 import org.sat4j.specs.IConstr;
49 import org.sat4j.specs.IVec;
50 import org.sat4j.specs.IVecInt;
51
52
53
54
55
56 public abstract class AbstractPBDataStructureFactory extends
57 AbstractDataStructureFactory<ILits> implements PBDataStructureFactory<ILits>, IInternalPBConstraintCreator {
58
59
60
61
62 private static final long serialVersionUID = 1L;
63
64 public Constr createClause(IVecInt literals) throws ContradictionException {
65 IVecInt v = Clauses.sanityCheck(literals, getVocabulary(), solver);
66 if (v == null)
67 return null;
68 if (v.size()==2)
69 return BinaryClausePB.brandNewClause(solver, getVocabulary(), v);
70 return HTClausePB.brandNewClause(solver, getVocabulary(), v);
71 }
72
73 public Constr createUnregisteredClause(IVecInt literals) {
74 if (literals.size()==1)
75 return new UnitClause(literals.last());
76 if (literals.size()==2)
77 return new LearntBinaryClause(literals,getVocabulary());
78 return new LearntHTClause(literals, getVocabulary());
79 }
80
81 @Override
82 public Constr createCardinalityConstraint(IVecInt literals, int degree)
83 throws ContradictionException {
84 return AtLeastPB.atLeastNew(solver, getVocabulary(), literals, degree);
85 }
86
87 public Constr createPseudoBooleanConstraint(IVecInt literals,
88 IVec<BigInteger> coefs, boolean moreThan, BigInteger degree)
89 throws ContradictionException {
90 return constraintFactory(literals, coefs, moreThan, degree);
91 }
92
93
94
95
96
97
98
99
100 protected abstract PBConstr constraintFactory(IVecInt literals,
101 IVecInt coefs, boolean moreThan, int degree)
102 throws ContradictionException;
103
104 protected abstract PBConstr constraintFactory(IDataStructurePB dspb);
105
106 protected abstract PBConstr constraintFactory(IVecInt literals,
107 IVec<BigInteger> coefs, boolean moreThan, BigInteger degree)
108 throws ContradictionException;
109
110 public Constr createUnregisteredPseudoBooleanConstraint(IVecInt literals,
111 IVec<BigInteger> coefs, BigInteger degree) {
112 return constraintFactory(literals, coefs, degree);
113 }
114
115 public Constr createUnregisteredPseudoBooleanConstraint(IDataStructurePB dspb) {
116 return constraintFactory(dspb);
117 }
118
119 public IConstr createUnregisteredPseudoBooleanConstraint(IVecInt literals,
120 IVec<BigInteger> coefs, boolean moreThan, BigInteger degree)
121 throws ContradictionException {
122 return constraintFactory(literals, coefs, moreThan, degree);
123 }
124
125
126
127
128
129
130
131 protected abstract PBConstr constraintFactory(IVecInt literals,
132 IVecInt coefs, int degree);
133
134 protected abstract PBConstr constraintFactory(IVecInt literals,
135 IVec<BigInteger> coefs, BigInteger degree);
136
137 @Override
138 protected ILits createLits() {
139 return new Lits();
140 }
141
142 }