Search in sources :

Example 6 with Result

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));
    }
}
Also used : Program(com.dat3m.dartagnan.program.Program) BooleanFormulaManager(org.sosy_lab.java_smt.api.BooleanFormulaManager) Configuration(org.sosy_lab.common.configuration.Configuration) ProgramParser(com.dat3m.dartagnan.parsers.program.ProgramParser) ParserCat(com.dat3m.dartagnan.parsers.cat.ParserCat) Result(com.dat3m.dartagnan.utils.Result) SolverContext(org.sosy_lab.java_smt.api.SolverContext) VerificationTask(com.dat3m.dartagnan.verification.VerificationTask) Wmm(com.dat3m.dartagnan.wmm.Wmm) File(java.io.File) ProverEnvironment(org.sosy_lab.java_smt.api.ProverEnvironment) BooleanFormula(org.sosy_lab.java_smt.api.BooleanFormula) Test(org.junit.Test)

Example 7 with Result

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;
}
Also used : Path(java.nio.file.Path) Property(com.dat3m.dartagnan.configuration.Property) RunWith(org.junit.runner.RunWith) ProverOptions(org.sosy_lab.java_smt.api.SolverContext.ProverOptions) ProverEnvironment(org.sosy_lab.java_smt.api.ProverEnvironment) TestHelper(com.dat3m.dartagnan.utils.TestHelper) Wmm(com.dat3m.dartagnan.wmm.Wmm) Result(com.dat3m.dartagnan.utils.Result) ParserCat(com.dat3m.dartagnan.parsers.cat.ParserCat) ProgramParser(com.dat3m.dartagnan.parsers.program.ProgramParser) ResourceHelper(com.dat3m.dartagnan.utils.ResourceHelper) SolverContext(org.sosy_lab.java_smt.api.SolverContext) Program(com.dat3m.dartagnan.program.Program) Assert.fail(org.junit.Assert.fail) Path(java.nio.file.Path) Parameterized(org.junit.runners.Parameterized) EnumSet(java.util.EnumSet) VerificationTask(com.dat3m.dartagnan.verification.VerificationTask) ImmutableMap(com.google.common.collect.ImmutableMap) Files(java.nio.file.Files) Test(org.junit.Test) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) File(java.io.File) TwoSolvers(com.dat3m.dartagnan.verification.solving.TwoSolvers) PASS(com.dat3m.dartagnan.utils.Result.PASS) List(java.util.List) Stream(java.util.stream.Stream) Arch(com.dat3m.dartagnan.configuration.Arch) Paths(java.nio.file.Paths) BufferedReader(java.io.BufferedReader) FileReader(java.io.FileReader) FAIL(com.dat3m.dartagnan.utils.Result.FAIL) Assert.assertEquals(org.junit.Assert.assertEquals) Wmm(com.dat3m.dartagnan.wmm.Wmm) ParserCat(com.dat3m.dartagnan.parsers.cat.ParserCat) Files(java.nio.file.Files) File(java.io.File) Result(com.dat3m.dartagnan.utils.Result)

Example 8 with Result

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();
        }
    }
}
Also used : SolverContext(org.sosy_lab.java_smt.api.SolverContext) VerificationTask(com.dat3m.dartagnan.verification.VerificationTask) Configuration(org.sosy_lab.common.configuration.Configuration) ShutdownManager(org.sosy_lab.common.ShutdownManager) Arch(com.dat3m.dartagnan.configuration.Arch) ProverEnvironment(org.sosy_lab.java_smt.api.ProverEnvironment) Result(com.dat3m.dartagnan.utils.Result)

Example 9 with Result

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;
}
Also used : PropertyEncoder(com.dat3m.dartagnan.encoding.PropertyEncoder) AssertTrue(com.dat3m.dartagnan.asserts.AssertTrue) ProgramEncoder(com.dat3m.dartagnan.encoding.ProgramEncoder) WmmEncoder(com.dat3m.dartagnan.encoding.WmmEncoder) SymmetryEncoder(com.dat3m.dartagnan.encoding.SymmetryEncoder) Result(com.dat3m.dartagnan.utils.Result)

Example 10 with Result

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;
}
Also used : PropertyEncoder(com.dat3m.dartagnan.encoding.PropertyEncoder) AssertTrue(com.dat3m.dartagnan.asserts.AssertTrue) ProgramEncoder(com.dat3m.dartagnan.encoding.ProgramEncoder) WmmEncoder(com.dat3m.dartagnan.encoding.WmmEncoder) SymmetryEncoder(com.dat3m.dartagnan.encoding.SymmetryEncoder) Result(com.dat3m.dartagnan.utils.Result)

Aggregations

Result (com.dat3m.dartagnan.utils.Result)11 ProgramEncoder (com.dat3m.dartagnan.encoding.ProgramEncoder)5 PropertyEncoder (com.dat3m.dartagnan.encoding.PropertyEncoder)5 WmmEncoder (com.dat3m.dartagnan.encoding.WmmEncoder)5 Program (com.dat3m.dartagnan.program.Program)5 VerificationTask (com.dat3m.dartagnan.verification.VerificationTask)5 ProverEnvironment (org.sosy_lab.java_smt.api.ProverEnvironment)5 SolverContext (org.sosy_lab.java_smt.api.SolverContext)5 AssertTrue (com.dat3m.dartagnan.asserts.AssertTrue)4 SymmetryEncoder (com.dat3m.dartagnan.encoding.SymmetryEncoder)4 File (java.io.File)4 ParserCat (com.dat3m.dartagnan.parsers.cat.ParserCat)3 ProgramParser (com.dat3m.dartagnan.parsers.program.ProgramParser)3 Wmm (com.dat3m.dartagnan.wmm.Wmm)3 Configuration (org.sosy_lab.common.configuration.Configuration)3 Arch (com.dat3m.dartagnan.configuration.Arch)2 Property (com.dat3m.dartagnan.configuration.Property)2 ExecutionModel (com.dat3m.dartagnan.verification.model.ExecutionModel)2 String.valueOf (java.lang.String.valueOf)2 InvalidConfigurationException (org.sosy_lab.common.configuration.InvalidConfigurationException)2