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
29
30 package org.sat4j.pb.tools;
31
32 import java.math.BigInteger;
33 import java.util.ArrayList;
34 import java.util.List;
35
36 import org.sat4j.core.Vec;
37 import org.sat4j.pb.IPBSolver;
38 import org.sat4j.pb.ObjectiveFunction;
39 import org.sat4j.specs.ContradictionException;
40 import org.sat4j.specs.IConstr;
41 import org.sat4j.specs.IVec;
42 import org.sat4j.specs.IVecInt;
43 import org.sat4j.specs.TimeoutException;
44 import org.sat4j.tools.LexicoDecorator;
45
46 public class LexicoDecoratorPB extends LexicoDecorator<IPBSolver> implements
47 IPBSolver {
48
49
50
51
52 private static final long serialVersionUID = 1L;
53
54 private final List<ObjectiveFunction> objs = new ArrayList<ObjectiveFunction>();
55 private BigInteger bigCurrentValue;
56
57 public LexicoDecoratorPB(IPBSolver solver) {
58 super(solver);
59 }
60
61 public IConstr addPseudoBoolean(IVecInt lits, IVec<BigInteger> coeffs,
62 boolean moreThan, BigInteger d) throws ContradictionException {
63 return decorated().addPseudoBoolean(lits, coeffs, moreThan, d);
64 }
65
66 public void setObjectiveFunction(ObjectiveFunction obj) {
67 throw new UnsupportedOperationException();
68
69 }
70
71 public ObjectiveFunction getObjectiveFunction() {
72 return this.objs.get(this.currentCriterion);
73 }
74
75 @Override
76 public boolean admitABetterSolution(IVecInt assumps)
77 throws TimeoutException {
78 decorated().setObjectiveFunction(this.objs.get(this.currentCriterion));
79 return super.admitABetterSolution(assumps);
80 }
81
82 @Override
83 public void addCriterion(IVecInt literals) {
84 this.objs.add(new ObjectiveFunction(literals, new Vec<BigInteger>(
85 literals.size(), BigInteger.ONE)));
86 }
87
88 public void addCriterion(IVecInt literals, IVec<BigInteger> coefs) {
89 this.objs.add(new ObjectiveFunction(literals, coefs));
90 }
91
92 @Override
93 protected Number evaluate() {
94 this.bigCurrentValue = this.objs.get(this.currentCriterion)
95 .calculateDegree(this);
96 return this.bigCurrentValue;
97 }
98
99 @Override
100 protected Number evaluate(int criterion) {
101 return this.objs.get(criterion).calculateDegree(this);
102 }
103
104 @Override
105 protected void fixCriterionValue() throws ContradictionException {
106 if (bigCurrentValue == null) {
107 throw new ContradictionException("no current value computed!");
108 }
109 addExactly(this.objs.get(this.currentCriterion).getVars(), this.objs
110 .get(this.currentCriterion).getCoeffs(), this.bigCurrentValue);
111 }
112
113 @Override
114 protected IConstr discardSolutionsForOptimizing()
115 throws ContradictionException {
116 return addAtMost(this.objs.get(this.currentCriterion).getVars(),
117 this.objs.get(this.currentCriterion).getCoeffs(),
118 this.bigCurrentValue.subtract(BigInteger.ONE));
119 }
120
121 @Override
122 public int numberOfCriteria() {
123 return this.objs.size();
124 }
125
126 public IConstr addAtMost(IVecInt literals, IVecInt coeffs, int degree)
127 throws ContradictionException {
128 return decorated().addAtMost(literals, coeffs, degree);
129 }
130
131 public IConstr addAtMost(IVecInt literals, IVec<BigInteger> coeffs,
132 BigInteger degree) throws ContradictionException {
133 return decorated().addAtMost(literals, coeffs, degree);
134 }
135
136 public IConstr addAtLeast(IVecInt literals, IVecInt coeffs, int degree)
137 throws ContradictionException {
138 return decorated().addAtLeast(literals, coeffs, degree);
139 }
140
141 public IConstr addAtLeast(IVecInt literals, IVec<BigInteger> coeffs,
142 BigInteger degree) throws ContradictionException {
143 return decorated().addAtLeast(literals, coeffs, degree);
144 }
145
146 public IConstr addExactly(IVecInt literals, IVecInt coeffs, int weight)
147 throws ContradictionException {
148 return decorated().addExactly(literals, coeffs, weight);
149 }
150
151 public IConstr addExactly(IVecInt literals, IVec<BigInteger> coeffs,
152 BigInteger weight) throws ContradictionException {
153 return decorated().addExactly(literals, coeffs, weight);
154 }
155
156 }