|
15 | 15 | */
|
16 | 16 | package hu.bme.mit.theta.sts.cli;
|
17 | 17 |
|
18 |
| -import java.io.FileInputStream; |
19 |
| -import java.io.FileNotFoundException; |
20 |
| -import java.io.IOException; |
21 |
| -import java.io.InputStream; |
22 |
| -import java.io.PrintWriter; |
23 |
| -import java.io.StringWriter; |
| 18 | +import java.io.*; |
24 | 19 | import java.util.concurrent.TimeUnit;
|
25 | 20 |
|
26 | 21 | import com.beust.jcommander.JCommander;
|
|
29 | 24 | import com.google.common.base.Stopwatch;
|
30 | 25 |
|
31 | 26 | import hu.bme.mit.theta.analysis.State;
|
| 27 | +import hu.bme.mit.theta.analysis.Trace; |
32 | 28 | import hu.bme.mit.theta.analysis.algorithm.SafetyResult;
|
33 | 29 | import hu.bme.mit.theta.analysis.algorithm.cegar.CegarStatistics;
|
| 30 | +import hu.bme.mit.theta.analysis.expl.ExplState; |
| 31 | +import hu.bme.mit.theta.analysis.expr.ExprState; |
34 | 32 | import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy;
|
35 | 33 | import hu.bme.mit.theta.analysis.utils.ArgVisualizer;
|
36 | 34 | import hu.bme.mit.theta.analysis.utils.TraceVisualizer;
|
|
43 | 41 | import hu.bme.mit.theta.common.table.TableWriter;
|
44 | 42 | import hu.bme.mit.theta.common.visualization.Graph;
|
45 | 43 | import hu.bme.mit.theta.common.visualization.writer.GraphvizWriter;
|
| 44 | +import hu.bme.mit.theta.core.model.Valuation; |
46 | 45 | import hu.bme.mit.theta.core.type.booltype.BoolExprs;
|
47 | 46 | import hu.bme.mit.theta.core.utils.ExprUtils;
|
48 | 47 | import hu.bme.mit.theta.solver.*;
|
|
53 | 52 | import hu.bme.mit.theta.sts.aiger.AigerToSts;
|
54 | 53 | import hu.bme.mit.theta.sts.aiger.elements.AigerSystem;
|
55 | 54 | import hu.bme.mit.theta.sts.aiger.utils.AigerCoi;
|
| 55 | +import hu.bme.mit.theta.sts.analysis.StsAction; |
| 56 | +import hu.bme.mit.theta.sts.analysis.StsTraceConcretizer; |
56 | 57 | import hu.bme.mit.theta.sts.dsl.StsDslManager;
|
57 | 58 | import hu.bme.mit.theta.sts.dsl.StsSpec;
|
58 | 59 | import hu.bme.mit.theta.sts.analysis.config.StsConfig;
|
@@ -99,8 +100,8 @@ public class StsCli {
|
99 | 100 | @Parameter(names = {"--benchmark"}, description = "Benchmark mode (only print metrics)")
|
100 | 101 | Boolean benchmarkMode = false;
|
101 | 102 |
|
102 |
| - @Parameter(names = {"--visualize"}, description = "Write proof or counterexample to file in dot format") |
103 |
| - String dotfile = null; |
| 103 | + @Parameter(names = "--cex", description = "Write concrete counterexample to a file") |
| 104 | + String cexfile = null; |
104 | 105 |
|
105 | 106 | @Parameter(names = {"--header"}, description = "Print only a header (for benchmarks)", help = true)
|
106 | 107 | boolean headerOnly = false;
|
@@ -140,8 +141,8 @@ private void run() {
|
140 | 141 | final SafetyResult<?, ?> status = configuration.check();
|
141 | 142 | sw.stop();
|
142 | 143 | printResult(status, sts, sw.elapsed(TimeUnit.MILLISECONDS));
|
143 |
| - if (dotfile != null) { |
144 |
| - writeVisualStatus(status, dotfile); |
| 144 | + if (status.isUnsafe() && cexfile != null) { |
| 145 | + writeCex(sts, status.asUnsafe()); |
145 | 146 | }
|
146 | 147 | } catch (final Throwable ex) {
|
147 | 148 | printError(ex);
|
@@ -218,11 +219,22 @@ private void printError(final Throwable ex) {
|
218 | 219 | }
|
219 | 220 | }
|
220 | 221 |
|
221 |
| - private void writeVisualStatus(final SafetyResult<?, ?> status, final String filename) |
222 |
| - throws FileNotFoundException { |
223 |
| - final Graph graph = status.isSafe() |
224 |
| - ? new ArgVisualizer<>(State::toString, a -> "").visualize(status.asSafe().getArg()) |
225 |
| - : new TraceVisualizer<>(State::toString, a -> "").visualize(status.asUnsafe().getTrace()); |
226 |
| - GraphvizWriter.getInstance().writeFile(graph, filename); |
| 222 | + private void writeCex(final STS sts, final SafetyResult.Unsafe<?, ?> status) { |
| 223 | + @SuppressWarnings("unchecked") final Trace<ExprState, StsAction> trace = (Trace<ExprState, StsAction>) status.getTrace(); |
| 224 | + final Trace<Valuation, StsAction> concrTrace = StsTraceConcretizer.concretize(sts, trace, solverFactory); |
| 225 | + final File file = new File(cexfile); |
| 226 | + PrintWriter printWriter = null; |
| 227 | + try { |
| 228 | + printWriter = new PrintWriter(file); |
| 229 | + for (Valuation state : concrTrace.getStates()) { |
| 230 | + printWriter.println(state.toString()); |
| 231 | + } |
| 232 | + } catch (final FileNotFoundException e) { |
| 233 | + printError(e); |
| 234 | + } finally { |
| 235 | + if (printWriter != null) { |
| 236 | + printWriter.close(); |
| 237 | + } |
| 238 | + } |
227 | 239 | }
|
228 | 240 | }
|
0 commit comments