use of com.dat3m.dartagnan.utils.Result in project Dat3M by hernanponcedeleon.
the class BuildWitnessTest method BuildWriteEncode.
@Test
public void BuildWriteEncode() throws Exception {
Configuration config = Configuration.builder().setOption(WITNESS_ORIGINAL_PROGRAM_PATH, ResourceHelper.TEST_RESOURCE_PATH + "witness/lazy01-for-witness.bpl").setOption(BOUND, "1").build();
Program p = new ProgramParser().parse(new File(ResourceHelper.TEST_RESOURCE_PATH + "witness/lazy01-for-witness.bpl"));
Wmm wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/svcomp.cat"));
VerificationTask task = VerificationTask.builder().withConfig(config).build(p, wmm, EnumSet.of(Property.getDefault()));
try (SolverContext ctx = TestHelper.createContext();
ProverEnvironment prover = ctx.newProverEnvironment(ProverOptions.GENERATE_MODELS)) {
Result res = IncrementalSolver.run(ctx, prover, task);
WitnessBuilder witnessBuilder = new WitnessBuilder(task, ctx, prover, res);
config.inject(witnessBuilder);
WitnessGraph graph = witnessBuilder.build();
File witnessFile = new File(System.getenv("DAT3M_HOME") + "/output/lazy01-for-witness.graphml");
// The file should not exist
assertFalse(witnessFile.exists());
// Write to file
graph.write();
// The file should exist now
assertTrue(witnessFile.exists());
// Delete the file
witnessFile.delete();
// Create encoding
BooleanFormula enc = graph.encode(p, ctx);
BooleanFormulaManager bmgr = ctx.getFormulaManager().getBooleanFormulaManager();
// Check the formula is not trivial
assertFalse(bmgr.isFalse(enc));
assertFalse(bmgr.isTrue(enc));
}
}
use of com.dat3m.dartagnan.utils.Result in project Dat3M by hernanponcedeleon.
the class BranchTest method data.
@Parameterized.Parameters(name = "{index}: {0}")
public static Iterable<Object[]> data() throws IOException {
ImmutableMap<String, Result> expected = readExpectedResults();
Wmm linuxWmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/linux-kernel.cat"));
Wmm aarch64Wmm = new ParserCat().parse(new File(ResourceHelper.CAT_RESOURCE_PATH + "cat/aarch64.cat"));
List<Object[]> data;
try (Stream<Path> fileStream = Files.walk(Paths.get(ResourceHelper.TEST_RESOURCE_PATH + "branch/C/"))) {
data = fileStream.filter(Files::isRegularFile).filter(f -> (f.toString().endsWith("litmus"))).map(f -> new Object[] { f.toString(), expected.get(f.getFileName().toString()), linuxWmm }).collect(Collectors.toList());
}
try (Stream<Path> fileStream = Files.walk(Paths.get(ResourceHelper.TEST_RESOURCE_PATH + "branch/AARCH64/"))) {
data.addAll(fileStream.filter(Files::isRegularFile).filter(f -> (f.toString().endsWith("litmus"))).map(f -> new Object[] { f.toString(), expected.get(f.getFileName().toString()), aarch64Wmm }).collect(Collectors.toList()));
}
return data;
}
use of com.dat3m.dartagnan.utils.Result in project Dat3M by hernanponcedeleon.
the class ReachabilityResult method run.
private void run() {
if (validate()) {
ShutdownManager sdm = ShutdownManager.create();
Thread t = new Thread(() -> {
try {
if (options.getTimeout() > 0) {
// Converts timeout from secs to millisecs
Thread.sleep(1000L * options.getTimeout());
sdm.requestShutdown("Shutdown Request");
}
} catch (InterruptedException e) {
// Verification ended, nothing to be done.
}
});
try {
Result result = Result.UNKNOWN;
Arch arch = program.getArch() != null ? program.getArch() : options.getTarget();
VerificationTask task = VerificationTask.builder().withBound(options.getBound()).withSolverTimeout(options.getTimeout()).withTarget(arch).build(program, wmm, EnumSet.of(Property.getDefault()));
t.start();
Configuration config = Configuration.builder().setOption(PHANTOM_REFERENCES, "true").build();
try (SolverContext ctx = SolverContextFactory.createSolverContext(config, BasicLogManager.create(config), sdm.getNotifier(), options.getSolver());
ProverEnvironment prover = ctx.newProverEnvironment(ProverOptions.GENERATE_MODELS)) {
switch(options.getMethod()) {
case INCREMENTAL:
result = IncrementalSolver.run(ctx, prover, task);
break;
case ASSUME:
result = AssumeSolver.run(ctx, prover, task);
break;
case TWO:
try (ProverEnvironment prover2 = ctx.newProverEnvironment(ProverOptions.GENERATE_MODELS)) {
result = TwoSolvers.run(ctx, prover, prover2, task);
}
break;
case CAAT:
result = RefinementSolver.run(ctx, prover, RefinementTask.fromVerificationTaskWithDefaultBaselineWMM(task));
break;
}
// Verification ended, we can interrupt the timeout Thread
t.interrupt();
buildVerdict(result);
}
} catch (InterruptedException e) {
verdict = "TIMEOUT";
} catch (Exception e) {
verdict = "ERROR: " + e.getMessage();
}
}
}
use of com.dat3m.dartagnan.utils.Result in project Dat3M by hernanponcedeleon.
the class AssumeSolver method run.
public static Result run(SolverContext ctx, ProverEnvironment prover, VerificationTask task) throws InterruptedException, SolverException, InvalidConfigurationException {
Result res = Result.UNKNOWN;
task.preprocessProgram();
if (task.getProgram().getAss() instanceof AssertTrue) {
logger.info("Verification finished: assertion trivially holds");
return PASS;
}
task.performStaticProgramAnalyses();
task.performStaticWmmAnalyses();
task.initializeEncoders(ctx);
ProgramEncoder programEncoder = task.getProgramEncoder();
PropertyEncoder propertyEncoder = task.getPropertyEncoder();
WmmEncoder wmmEncoder = task.getWmmEncoder();
SymmetryEncoder symmEncoder = task.getSymmetryEncoder();
logger.info("Starting encoding using " + ctx.getVersion());
prover.addConstraint(programEncoder.encodeFullProgram(ctx));
prover.addConstraint(wmmEncoder.encodeFullMemoryModel(ctx));
// For validation this contains information.
// For verification graph.encode() just returns ctx.mkTrue()
prover.addConstraint(task.getWitness().encode(task.getProgram(), ctx));
prover.addConstraint(symmEncoder.encodeFullSymmetry(ctx));
BooleanFormulaManager bmgr = ctx.getFormulaManager().getBooleanFormulaManager();
BooleanFormula assumptionLiteral = bmgr.makeVariable("DAT3M_spec_assumption");
BooleanFormula assumedSpec = bmgr.implication(assumptionLiteral, propertyEncoder.encodeSpecification(task.getProperty(), ctx));
prover.addConstraint(assumedSpec);
logger.info("Starting first solver.check()");
if (prover.isUnsatWithAssumptions(singletonList(assumptionLiteral))) {
prover.addConstraint(propertyEncoder.encodeBoundEventExec(ctx));
logger.info("Starting second solver.check()");
res = prover.isUnsat() ? PASS : Result.UNKNOWN;
} else {
res = FAIL;
}
if (logger.isDebugEnabled()) {
String smtStatistics = "\n ===== SMT Statistics ===== \n";
for (String key : prover.getStatistics().keySet()) {
smtStatistics += String.format("\t%s -> %s\n", key, prover.getStatistics().get(key));
}
logger.debug(smtStatistics);
}
res = task.getProgram().getAss().getInvert() ? res.invert() : res;
logger.info("Verification finished with result " + res);
return res;
}
use of com.dat3m.dartagnan.utils.Result in project Dat3M by hernanponcedeleon.
the class IncrementalSolver method run.
public static Result run(SolverContext ctx, ProverEnvironment prover, VerificationTask task) throws InterruptedException, SolverException, InvalidConfigurationException {
Result res = Result.UNKNOWN;
task.preprocessProgram();
if (task.getProgram().getAss() instanceof AssertTrue) {
logger.info("Verification finished: assertion trivially holds");
return PASS;
}
task.performStaticProgramAnalyses();
task.performStaticWmmAnalyses();
task.initializeEncoders(ctx);
ProgramEncoder programEncoder = task.getProgramEncoder();
PropertyEncoder propertyEncoder = task.getPropertyEncoder();
WmmEncoder wmmEncoder = task.getWmmEncoder();
SymmetryEncoder symmEncoder = task.getSymmetryEncoder();
logger.info("Starting encoding using " + ctx.getVersion());
prover.addConstraint(programEncoder.encodeFullProgram(ctx));
prover.addConstraint(wmmEncoder.encodeFullMemoryModel(ctx));
// For validation this contains information.
// For verification graph.encode() just returns ctx.mkTrue()
prover.addConstraint(task.getWitness().encode(task.getProgram(), ctx));
prover.addConstraint(symmEncoder.encodeFullSymmetry(ctx));
logger.info("Starting push()");
prover.push();
prover.addConstraint(propertyEncoder.encodeSpecification(task.getProperty(), ctx));
logger.info("Starting first solver.check()");
if (prover.isUnsat()) {
prover.pop();
prover.addConstraint(propertyEncoder.encodeBoundEventExec(ctx));
logger.info("Starting second solver.check()");
res = prover.isUnsat() ? PASS : Result.UNKNOWN;
} else {
res = FAIL;
}
if (logger.isDebugEnabled()) {
String smtStatistics = "\n ===== SMT Statistics ===== \n";
for (String key : prover.getStatistics().keySet()) {
smtStatistics += String.format("\t%s -> %s\n", key, prover.getStatistics().get(key));
}
logger.debug(smtStatistics);
}
res = task.getProgram().getAss().getInvert() ? res.invert() : res;
logger.info("Verification finished with result " + res);
return res;
}
Aggregations