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