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.Iterator;
34
35 import org.sat4j.core.Vec;
36 import org.sat4j.core.VecInt;
37 import org.sat4j.pb.IPBSolver;
38 import org.sat4j.pb.ObjectiveFunction;
39 import org.sat4j.specs.ContradictionException;
40 import org.sat4j.specs.IVec;
41 import org.sat4j.specs.IVecInt;
42 import org.sat4j.specs.TimeoutException;
43
44 public class SteppedTimeoutLexicoDecoratorPB extends LexicoDecoratorPB {
45
46
47
48
49 private static final long serialVersionUID = 1L;
50
51 public SteppedTimeoutLexicoDecoratorPB(IPBSolver solver) {
52 super(solver);
53 }
54
55 @Override
56 public boolean admitABetterSolution(IVecInt assumps)
57 throws TimeoutException {
58 decorated().setObjectiveFunction(this.objs.get(this.currentCriterion));
59 this.isSolutionOptimal = false;
60 try {
61 if (decorated().isSatisfiable(assumps, true)) {
62 this.prevboolmodel = new boolean[nVars()];
63 for (int i = 0; i < nVars(); i++) {
64 this.prevboolmodel[i] = decorated().model(i + 1);
65 }
66 this.prevfullmodel = decorated().model();
67 this.prevmodelwithinternalvars = decorated()
68 .modelWithInternalVariables();
69 calculateObjective();
70 return true;
71 }
72 decorated().expireTimeout();
73 return manageUnsatCase();
74 } catch (TimeoutException te) {
75 if (this.currentCriterion == numberOfCriteria() - 1) {
76 throw te;
77 }
78 mergeCurrentandNextCriteria();
79 if (this.prevConstr != null) {
80 super.removeConstr(this.prevConstr);
81 this.prevConstr = null;
82 }
83 try {
84 fixCriterionValue();
85 } catch (ContradictionException ce) {
86 throw new IllegalStateException(ce);
87 }
88 if (isVerbose()) {
89 System.out.println(getLogPrefix()
90 + "Partial timeout criterion number "
91 + (this.currentCriterion + 1));
92 }
93 this.currentCriterion++;
94 calculateObjective();
95 decorated().expireTimeout();
96 return true;
97 }
98 }
99
100 private void mergeCurrentandNextCriteria() {
101 ObjectiveFunction currentObj = this.objs.get(this.currentCriterion);
102 int currentObjSize = currentObj.getVars().size();
103 ObjectiveFunction nextObj = this.objs.get(this.currentCriterion + 1);
104 int nextObjSize = nextObj.getVars().size();
105 IVecInt newLits = new VecInt(currentObjSize + nextObjSize);
106 currentObj.getVars().copyTo(newLits);
107 nextObj.getVars().copyTo(newLits);
108 IVec<BigInteger> newCoeffs = new Vec<BigInteger>(currentObjSize
109 + nextObjSize);
110 BigInteger coeffFactor = BigInteger.valueOf(nextObjSize).add(
111 BigInteger.ONE);
112 for (Iterator<BigInteger> it = currentObj.getCoeffs().iterator(); it
113 .hasNext();) {
114 newCoeffs.push(it.next().multiply(coeffFactor));
115 }
116 nextObj.getCoeffs().copyTo(newCoeffs);
117 this.objs.set(this.currentCriterion + 1, new ObjectiveFunction(newLits,
118 newCoeffs));
119 }
120
121 }