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;
29
30 import org.sat4j.core.VecInt;
31 import org.sat4j.specs.ContradictionException;
32 import org.sat4j.specs.IOptimizationProblem;
33 import org.sat4j.specs.IVecInt;
34 import org.sat4j.specs.TimeoutException;
35
36
37
38
39
40
41
42 public class OptToPBSATAdapter extends PBSolverDecorator {
43
44
45
46
47 private static final long serialVersionUID = 1L;
48
49 IOptimizationProblem problem;
50
51 boolean modelComputed = false;
52
53 private final IVecInt assumps = new VecInt();
54
55 private long begin;
56
57 public OptToPBSATAdapter(IOptimizationProblem problem) {
58 super((IPBSolver) problem);
59 this.problem = problem;
60 }
61
62 @Override
63 public boolean isSatisfiable() throws TimeoutException {
64 modelComputed = false;
65 assumps.clear();
66 begin = System.currentTimeMillis();
67 if (problem.hasNoObjectiveFunction()) {
68 return modelComputed = problem.isSatisfiable();
69 }
70 return problem.admitABetterSolution();
71 }
72
73 @Override
74 public boolean isSatisfiable(boolean global) throws TimeoutException {
75 return isSatisfiable();
76 }
77
78 @Override
79 public boolean isSatisfiable(IVecInt myAssumps, boolean global)
80 throws TimeoutException {
81 return isSatisfiable(myAssumps);
82 }
83
84 @Override
85 public boolean isSatisfiable(IVecInt myAssumps) throws TimeoutException {
86 modelComputed = false;
87 this.assumps.clear();
88 myAssumps.copyTo(this.assumps);
89 begin = System.currentTimeMillis();
90 if (problem.hasNoObjectiveFunction()) {
91 return modelComputed = problem.isSatisfiable(myAssumps);
92 }
93 return problem.admitABetterSolution(myAssumps);
94 }
95
96 @Override
97 public int[] model() {
98 if (modelComputed)
99 return problem.model();
100 try {
101 assert problem.admitABetterSolution(assumps);
102 assert !problem.hasNoObjectiveFunction();
103 do {
104 problem.discardCurrentSolution();
105 if (isVerbose()) {
106 System.out.println(getLogPrefix()
107 + "Current objective function value: "
108 + problem.getObjectiveValue() + "("
109 + ((System.currentTimeMillis() - begin) / 1000.0)
110 + "s)");
111 }
112 } while (problem.admitABetterSolution(assumps));
113 } catch (TimeoutException e) {
114 if (isVerbose()) {
115 System.out.println(getLogPrefix() + "Solver timed out after "
116 + ((System.currentTimeMillis() - begin) / 1000.0)
117 + "s)");
118 }
119 } catch (ContradictionException e) {
120
121 }
122 modelComputed = true;
123 return problem.model();
124 }
125
126 @Override
127 public boolean model(int var) {
128 if (!modelComputed)
129 model();
130 return problem.model(var);
131 }
132
133 @Override
134 public String toString(String prefix) {
135 return prefix + "Optimization to Pseudo Boolean adapter\n"
136 + super.toString(prefix);
137 }
138
139 public boolean isOptimal() {
140 return problem.isOptimal();
141 }
142 }