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;
31
32 import java.io.PrintWriter;
33
34 import org.sat4j.core.VecInt;
35 import org.sat4j.specs.ContradictionException;
36 import org.sat4j.specs.IOptimizationProblem;
37 import org.sat4j.specs.IVecInt;
38 import org.sat4j.specs.TimeoutException;
39
40
41
42
43
44
45
46 public class OptToPBSATAdapter extends PBSolverDecorator {
47
48
49
50
51 private static final long serialVersionUID = 1L;
52
53 IOptimizationProblem problem;
54
55 boolean modelComputed = false;
56
57 private final IVecInt assumps = new VecInt();
58
59 private long begin;
60
61 public OptToPBSATAdapter(IOptimizationProblem problem) {
62 super((IPBSolver) problem);
63 this.problem = problem;
64 }
65
66 @Override
67 public boolean isSatisfiable() throws TimeoutException {
68 this.modelComputed = false;
69 this.assumps.clear();
70 this.begin = System.currentTimeMillis();
71 if (this.problem.hasNoObjectiveFunction()) {
72 return this.modelComputed = this.problem.isSatisfiable();
73 }
74 return this.problem.admitABetterSolution();
75 }
76
77 @Override
78 public boolean isSatisfiable(boolean global) throws TimeoutException {
79 return isSatisfiable();
80 }
81
82 @Override
83 public boolean isSatisfiable(IVecInt myAssumps, boolean global)
84 throws TimeoutException {
85 return isSatisfiable(myAssumps);
86 }
87
88 @Override
89 public boolean isSatisfiable(IVecInt myAssumps) throws TimeoutException {
90 this.modelComputed = false;
91 this.assumps.clear();
92 myAssumps.copyTo(this.assumps);
93 this.begin = System.currentTimeMillis();
94 if (this.problem.hasNoObjectiveFunction()) {
95 return this.modelComputed = this.problem.isSatisfiable(myAssumps);
96 }
97 return this.problem.admitABetterSolution(myAssumps);
98 }
99
100 @Override
101 public int[] model() {
102 return model(new PrintWriter(System.out, true));
103 }
104
105
106
107
108
109
110
111
112
113 public int[] model(PrintWriter out) {
114 if (this.modelComputed) {
115 return this.problem.model();
116 }
117 try {
118 assert this.problem.admitABetterSolution(this.assumps);
119 assert !this.problem.hasNoObjectiveFunction();
120 do {
121 this.problem.discardCurrentSolution();
122 if (isVerbose()) {
123 out.println(getLogPrefix()
124 + "Current objective function value: "
125 + this.problem.getObjectiveValue() + "("
126 + (System.currentTimeMillis() - this.begin)
127 / 1000.0 + "s)");
128 }
129 } while (this.problem.admitABetterSolution(this.assumps));
130 if (isVerbose()) {
131 out.println(getLogPrefix()
132 + "Optimal objective function value: "
133 + this.problem.getObjectiveValue() + "("
134 + (System.currentTimeMillis() - this.begin) / 1000.0
135 + "s)");
136 }
137 } catch (TimeoutException e) {
138 if (isVerbose()) {
139 out.println(getLogPrefix() + "Solver timed out after "
140 + (System.currentTimeMillis() - this.begin) / 1000.0
141 + "s)");
142 }
143 } catch (ContradictionException e) {
144
145 }
146 this.modelComputed = true;
147 return this.problem.model();
148 }
149
150 @Override
151 public boolean model(int var) {
152 if (!this.modelComputed) {
153 model();
154 }
155 return this.problem.model(var);
156 }
157
158 @Override
159 public String toString(String prefix) {
160 return prefix + "Optimization to Pseudo Boolean adapter\n"
161 + super.toString(prefix);
162 }
163
164 public boolean isOptimal() {
165 return this.problem.isOptimal();
166 }
167
168
169
170
171
172
173
174 public Number getCurrentObjectiveValue() {
175 return this.problem.getObjectiveValue();
176 }
177
178
179
180
181
182
183
184
185
186
187 public void setTimeoutForFindingBetterSolution(int seconds) {
188 this.problem.setTimeoutForFindingBetterSolution(seconds);
189 }
190 }