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 throw new UnsupportedOperationException();
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 void fixCriterionValue() throws ContradictionException {
101 addPseudoBoolean(this.objs.get(this.currentCriterion).getVars(),
102 this.objs.get(this.currentCriterion).getCoeffs(), true,
103 this.bigCurrentValue);
104 addPseudoBoolean(this.objs.get(this.currentCriterion).getVars(),
105 this.objs.get(this.currentCriterion).getCoeffs(), false,
106 this.bigCurrentValue);
107 }
108
109 @Override
110 protected IConstr discardSolutionsForOptimizing()
111 throws ContradictionException {
112 return addPseudoBoolean(this.objs.get(this.currentCriterion).getVars(),
113 this.objs.get(this.currentCriterion).getCoeffs(), false,
114 this.bigCurrentValue.subtract(BigInteger.ONE));
115 }
116
117 @Override
118 protected int numberOfCriteria() {
119 return this.objs.size();
120 }
121
122 public IConstr addAtMost(IVecInt literals, IVecInt coeffs, int degree)
123 throws ContradictionException {
124 throw new UnsupportedOperationException();
125 }
126
127 public IConstr addAtMost(IVecInt literals, IVec<BigInteger> coeffs,
128 BigInteger degree) throws ContradictionException {
129 throw new UnsupportedOperationException();
130 }
131
132 public IConstr addAtLeast(IVecInt literals, IVecInt coeffs, int degree)
133 throws ContradictionException {
134 throw new UnsupportedOperationException();
135 }
136
137 public IConstr addAtLeast(IVecInt literals, IVec<BigInteger> coeffs,
138 BigInteger degree) throws ContradictionException {
139 throw new UnsupportedOperationException();
140 }
141
142 public IConstr addExactly(IVecInt literals, IVecInt coeffs, int weight)
143 throws ContradictionException {
144 throw new UnsupportedOperationException();
145 }
146
147 public IConstr addExactly(IVecInt literals, IVec<BigInteger> coeffs,
148 BigInteger weight) throws ContradictionException {
149 throw new UnsupportedOperationException();
150 }
151
152 }