|
1 |
| package org.sat4j; |
|
2 |
| |
|
3 |
| import java.io.BufferedReader; |
|
4 |
| import java.io.FileNotFoundException; |
|
5 |
| import java.io.IOException; |
|
6 |
| import java.io.InputStreamReader; |
|
7 |
| import java.io.PrintWriter; |
|
8 |
| import java.io.Serializable; |
|
9 |
| import java.net.URL; |
|
10 |
| import java.util.Properties; |
|
11 |
| |
|
12 |
| import org.sat4j.reader.ParseFormatException; |
|
13 |
| import org.sat4j.reader.Reader; |
|
14 |
| import org.sat4j.specs.ContradictionException; |
|
15 |
| import org.sat4j.specs.IProblem; |
|
16 |
| import org.sat4j.specs.ISolver; |
|
17 |
| import org.sat4j.specs.TimeoutException; |
|
18 |
| |
|
19 |
| |
|
20 |
| |
|
21 |
| |
|
22 |
| |
|
23 |
| |
|
24 |
| |
|
25 |
| public abstract class AbstractLauncher implements Serializable { |
|
26 |
| |
|
27 |
| public static final String SOLUTION_PREFIX = "v "; |
|
28 |
| |
|
29 |
| public static final String ANSWER_PREFIX = "s "; |
|
30 |
| |
|
31 |
| public static final String COMMENT_PREFIX = "c "; |
|
32 |
| |
|
33 |
| private long beginTime; |
|
34 |
| |
|
35 |
| private ExitCode exitCode = ExitCode.UNKNOWN; |
|
36 |
| |
|
37 |
| protected Reader reader; |
|
38 |
| |
|
39 |
| private transient PrintWriter out = new PrintWriter(System.out, true); |
|
40 |
| |
|
41 |
| protected transient Thread shutdownHook = new Thread() { |
|
42 |
0
| @Override
|
|
43 |
| public void run() { |
|
44 |
0
| displayResult();
|
|
45 |
| } |
|
46 |
| }; |
|
47 |
| |
|
48 |
| protected ISolver solver; |
|
49 |
| |
|
50 |
0
| protected AbstractLauncher() {
|
|
51 |
0
| Runtime.getRuntime().addShutdownHook(shutdownHook);
|
|
52 |
| } |
|
53 |
| |
|
54 |
0
| protected void displayResult() {
|
|
55 |
0
| if (solver != null) {
|
|
56 |
0
| double wallclocktime = (System.currentTimeMillis() - beginTime) / 1000.0;
|
|
57 |
0
| solver.printStat(out, COMMENT_PREFIX);
|
|
58 |
0
| out.println(ANSWER_PREFIX + exitCode);
|
|
59 |
0
| if (exitCode == ExitCode.SATISFIABLE) {
|
|
60 |
0
| int[] model = solver.model();
|
|
61 |
0
| out.println(SOLUTION_PREFIX + reader.decode(model));
|
|
62 |
| } |
|
63 |
0
| log("Total wall clock time (in seconds) : " + wallclocktime);
|
|
64 |
| } |
|
65 |
| } |
|
66 |
| |
|
67 |
| protected abstract void usage(); |
|
68 |
| |
|
69 |
| |
|
70 |
| |
|
71 |
| |
|
72 |
0
| protected final void displayHeader() throws IOException {
|
|
73 |
0
| log("SAT4J: a SATisfiability library for Java (c) 2004-2006 Daniel Le Berre");
|
|
74 |
0
| log("This is free software under the GNU LGPL licence. See www.sat4j.org for details.");
|
|
75 |
0
| log("This software uses some libraries from the Jakarta project. See jakarta.apache.org for details.");
|
|
76 |
0
| URL url = Lanceur.class.getResource("/sat4j.version");
|
|
77 |
0
| if (url == null) {
|
|
78 |
0
| log("no version file found!!!");
|
|
79 |
| } else { |
|
80 |
0
| BufferedReader in = new BufferedReader(new InputStreamReader(url
|
|
81 |
| .openStream())); |
|
82 |
0
| log("version " + in.readLine());
|
|
83 |
0
| in.close();
|
|
84 |
| } |
|
85 |
0
| Properties prop = System.getProperties();
|
|
86 |
0
| String [] infoskeys = {"sun.arch.data.model","java.version","os.name","os.version","os.arch"};
|
|
87 |
0
| for (String key : infoskeys) {
|
|
88 |
0
| log(key+"\t"+prop.getProperty(key));
|
|
89 |
| } |
|
90 |
0
| Runtime runtime = Runtime.getRuntime();
|
|
91 |
0
| log("Free memory " + runtime.freeMemory());
|
|
92 |
0
| log("Max memory " + runtime.maxMemory());
|
|
93 |
0
| log("Total memory " + runtime.totalMemory());
|
|
94 |
0
| log("Number of processors " + runtime.availableProcessors());
|
|
95 |
| } |
|
96 |
| |
|
97 |
| |
|
98 |
| |
|
99 |
| |
|
100 |
| |
|
101 |
| |
|
102 |
| |
|
103 |
| |
|
104 |
| |
|
105 |
| |
|
106 |
| |
|
107 |
| |
|
108 |
| |
|
109 |
| |
|
110 |
| |
|
111 |
| |
|
112 |
| |
|
113 |
| |
|
114 |
| |
|
115 |
| |
|
116 |
0
| protected IProblem readProblem(String problemname)
|
|
117 |
| throws FileNotFoundException, ParseFormatException, IOException, |
|
118 |
| ContradictionException { |
|
119 |
0
| log("solving " + problemname);
|
|
120 |
0
| log("reading problem ... ");
|
|
121 |
0
| reader = createReader(solver, problemname);
|
|
122 |
0
| IProblem problem = reader.parseInstance(problemname);
|
|
123 |
0
| log("... done. Time "
|
|
124 |
| + (System.currentTimeMillis() - beginTime) / 1000.0 + " ms."); |
|
125 |
0
| log("#vars " + solver.nVars());
|
|
126 |
0
| log("#constraints " + solver.nConstraints());
|
|
127 |
0
| return problem;
|
|
128 |
| } |
|
129 |
| |
|
130 |
| protected abstract Reader createReader(ISolver solver, String problemname); |
|
131 |
| |
|
132 |
0
| public void run(String[] args) {
|
|
133 |
| |
|
134 |
0
| try {
|
|
135 |
| |
|
136 |
0
| displayHeader();
|
|
137 |
| |
|
138 |
0
| solver = configureSolver(args);
|
|
139 |
| |
|
140 |
0
| if (solver==null)
|
|
141 |
0
| return;
|
|
142 |
| |
|
143 |
0
| String instanceName = getInstanceName(args);
|
|
144 |
| |
|
145 |
0
| beginTime = System.currentTimeMillis();
|
|
146 |
| |
|
147 |
0
| IProblem problem = readProblem(instanceName);
|
|
148 |
| |
|
149 |
0
| try {
|
|
150 |
| |
|
151 |
0
| solve(problem);
|
|
152 |
| |
|
153 |
| |
|
154 |
| } catch (TimeoutException e) { |
|
155 |
0
| log("timeout");
|
|
156 |
| } |
|
157 |
| } catch (FileNotFoundException e) { |
|
158 |
0
| e.printStackTrace();
|
|
159 |
| } catch (IOException e) { |
|
160 |
0
| e.printStackTrace();
|
|
161 |
| } catch (ContradictionException e) { |
|
162 |
0
| exitCode = ExitCode.UNSATISFIABLE;
|
|
163 |
0
| log("(trivial inconsistency)");
|
|
164 |
| } catch (ParseFormatException e) { |
|
165 |
0
| e.printStackTrace();
|
|
166 |
| } |
|
167 |
| } |
|
168 |
| |
|
169 |
| protected abstract String getInstanceName(String[] args); |
|
170 |
| |
|
171 |
| protected abstract ISolver configureSolver(String[] args); |
|
172 |
| |
|
173 |
| |
|
174 |
| |
|
175 |
| |
|
176 |
| |
|
177 |
| |
|
178 |
0
| protected void log(String message) {
|
|
179 |
0
| out.println(COMMENT_PREFIX + message);
|
|
180 |
| } |
|
181 |
| |
|
182 |
0
| protected void solve(IProblem problem) throws TimeoutException {
|
|
183 |
0
| exitCode = problem.isSatisfiable() ? ExitCode.SATISFIABLE
|
|
184 |
| : ExitCode.UNSATISFIABLE; |
|
185 |
| } |
|
186 |
| |
|
187 |
| |
|
188 |
| |
|
189 |
| |
|
190 |
| |
|
191 |
0
| public final void setExitCode(ExitCode exitCode) {
|
|
192 |
0
| this.exitCode = exitCode;
|
|
193 |
| } |
|
194 |
| |
|
195 |
| |
|
196 |
| |
|
197 |
| |
|
198 |
| |
|
199 |
0
| public final ExitCode getExitCode() {
|
|
200 |
0
| return exitCode;
|
|
201 |
| } |
|
202 |
| |
|
203 |
| |
|
204 |
| |
|
205 |
| |
|
206 |
| |
|
207 |
0
| public final long getBeginTime() {
|
|
208 |
0
| return beginTime;
|
|
209 |
| } |
|
210 |
| |
|
211 |
| |
|
212 |
| |
|
213 |
| |
|
214 |
| |
|
215 |
0
| public final Reader getReader() {
|
|
216 |
0
| return reader;
|
|
217 |
| } |
|
218 |
| |
|
219 |
| |
|
220 |
| |
|
221 |
| |
|
222 |
| |
|
223 |
| |
|
224 |
| |
|
225 |
0
| public void setLogWriter(PrintWriter out) {
|
|
226 |
0
| this.out = out;
|
|
227 |
| } |
|
228 |
| |
|
229 |
0
| public PrintWriter getLogWriter() {
|
|
230 |
0
| return out;
|
|
231 |
| } |
|
232 |
| } |