Skip to content

Commit dbd22b0

Browse files
committed
Write STS counterexample
1 parent ea2386c commit dbd22b0

File tree

3 files changed

+30
-18
lines changed

3 files changed

+30
-18
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ buildscript {
1010

1111
allprojects {
1212
group = "hu.bme.mit.inf.theta"
13-
version = "1.4.4"
13+
version = "1.5"
1414

1515
apply(from = rootDir.resolve("gradle/shared-with-buildSrc/mirrors.gradle.kts"))
1616
}

subprojects/sts-analysis/src/main/java/hu.bme.mit.theta.sts/analysis/StsTraceConcretizer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import hu.bme.mit.theta.analysis.expr.refinement.ItpRefutation;
2727
import hu.bme.mit.theta.core.model.Valuation;
2828
import hu.bme.mit.theta.core.type.booltype.BoolExprs;
29-
import hu.bme.mit.theta.solver.*;
29+
import hu.bme.mit.theta.solver.SolverFactory;
3030
import hu.bme.mit.theta.sts.STS;
3131

3232
public final class StsTraceConcretizer {

subprojects/sts-cli/src/main/java/hu/bme/mit/theta/sts/cli/StsCli.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@
1515
*/
1616
package hu.bme.mit.theta.sts.cli;
1717

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.*;
2419
import java.util.concurrent.TimeUnit;
2520

2621
import com.beust.jcommander.JCommander;
@@ -29,8 +24,11 @@
2924
import com.google.common.base.Stopwatch;
3025

3126
import hu.bme.mit.theta.analysis.State;
27+
import hu.bme.mit.theta.analysis.Trace;
3228
import hu.bme.mit.theta.analysis.algorithm.SafetyResult;
3329
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;
3432
import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy;
3533
import hu.bme.mit.theta.analysis.utils.ArgVisualizer;
3634
import hu.bme.mit.theta.analysis.utils.TraceVisualizer;
@@ -43,6 +41,7 @@
4341
import hu.bme.mit.theta.common.table.TableWriter;
4442
import hu.bme.mit.theta.common.visualization.Graph;
4543
import hu.bme.mit.theta.common.visualization.writer.GraphvizWriter;
44+
import hu.bme.mit.theta.core.model.Valuation;
4645
import hu.bme.mit.theta.core.type.booltype.BoolExprs;
4746
import hu.bme.mit.theta.core.utils.ExprUtils;
4847
import hu.bme.mit.theta.solver.*;
@@ -53,6 +52,8 @@
5352
import hu.bme.mit.theta.sts.aiger.AigerToSts;
5453
import hu.bme.mit.theta.sts.aiger.elements.AigerSystem;
5554
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;
5657
import hu.bme.mit.theta.sts.dsl.StsDslManager;
5758
import hu.bme.mit.theta.sts.dsl.StsSpec;
5859
import hu.bme.mit.theta.sts.analysis.config.StsConfig;
@@ -99,8 +100,8 @@ public class StsCli {
99100
@Parameter(names = {"--benchmark"}, description = "Benchmark mode (only print metrics)")
100101
Boolean benchmarkMode = false;
101102

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;
104105

105106
@Parameter(names = {"--header"}, description = "Print only a header (for benchmarks)", help = true)
106107
boolean headerOnly = false;
@@ -140,8 +141,8 @@ private void run() {
140141
final SafetyResult<?, ?> status = configuration.check();
141142
sw.stop();
142143
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());
145146
}
146147
} catch (final Throwable ex) {
147148
printError(ex);
@@ -218,11 +219,22 @@ private void printError(final Throwable ex) {
218219
}
219220
}
220221

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+
}
227239
}
228240
}

0 commit comments

Comments
 (0)