Search in sources :

Example 11 with Solver

use of com.microsoft.z3.Solver in project bmoth by hhu-stups.

the class TestUsingZ3 method check.

public void check(Status satisfiable, String formula) {
    BoolExpr constraint = translatePredicate(formula, z3Context);
    // create scope just for current constraint
    z3Solver.push();
    z3Solver.add(constraint);
    Status check = z3Solver.check();
    // clean solver stack
    z3Solver.pop();
    assertEquals(satisfiable, check);
}
Also used : Status(com.microsoft.z3.Status) BoolExpr(com.microsoft.z3.BoolExpr)

Example 12 with Solver

use of com.microsoft.z3.Solver in project Dat3M by hernanponcedeleon.

the class Dartagnan method main.

public static void main(String[] args) throws Z3Exception, IOException {
    List<String> MCMs = Arrays.asList("sc", "tso", "pso", "rmo", "alpha", "power", "arm");
    Options options = new Options();
    Option targetOpt = new Option("t", "target", true, "target MCM");
    targetOpt.setRequired(true);
    options.addOption(targetOpt);
    Option inputOpt = new Option("i", "input", true, "input file path");
    inputOpt.setRequired(true);
    options.addOption(inputOpt);
    options.addOption(Option.builder("unroll").hasArg().desc("Unrolling steps").build());
    options.addOption(Option.builder("draw").hasArg().desc("If a buf is found, it outputs a graph \\path_to_file.dot").build());
    options.addOption(Option.builder("rels").hasArgs().desc("Relations to be drawn in the graph").build());
    CommandLineParser parserCmd = new DefaultParser();
    HelpFormatter formatter = new HelpFormatter();
    CommandLine cmd;
    try {
        cmd = parserCmd.parse(options, args);
    } catch (ParseException e) {
        System.out.println(e.getMessage());
        formatter.printHelp("DARTAGNAN", options);
        System.exit(1);
        return;
    }
    String target = cmd.getOptionValue("target");
    if (!MCMs.stream().anyMatch(mcms -> mcms.trim().equals(target))) {
        System.out.println("Unrecognized target");
        System.exit(0);
        return;
    }
    String inputFilePath = cmd.getOptionValue("input");
    if (!inputFilePath.endsWith("pts") && !inputFilePath.endsWith("litmus")) {
        System.out.println("Unrecognized program format");
        System.exit(0);
        return;
    }
    File file = new File(inputFilePath);
    String program = FileUtils.readFileToString(file, "UTF-8");
    ANTLRInputStream input = new ANTLRInputStream(program);
    Program p = new Program(inputFilePath);
    if (inputFilePath.endsWith("litmus")) {
        LitmusLexer lexer = new LitmusLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        LitmusParser parser = new LitmusParser(tokens);
        p = parser.program(inputFilePath).p;
    }
    if (inputFilePath.endsWith("pts")) {
        PorthosLexer lexer = new PorthosLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        PorthosParser parser = new PorthosParser(tokens);
        p = parser.program(inputFilePath).p;
    }
    String[] rels = new String[100];
    if (cmd.hasOption("rels")) {
        rels = cmd.getOptionValues("rels");
    }
    int steps = 1;
    if (cmd.hasOption("unroll")) {
        steps = Integer.parseInt(cmd.getOptionValue("unroll"));
    }
    p.initialize(steps);
    p.compile(target, false, true);
    Context ctx = new Context();
    Solver s = ctx.mkSolver();
    s.add(p.encodeDF(ctx));
    s.add(p.getAss().encode(ctx));
    s.add(p.encodeCF(ctx));
    s.add(p.encodeDF_RF(ctx));
    s.add(Domain.encode(p, ctx));
    s.add(p.encodeMM(ctx, target));
    s.add(p.encodeConsistent(ctx, target));
    ctx.setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB_FULL);
    if (s.check() == Status.SATISFIABLE) {
        System.out.println("The state is reachable");
        // System.out.println("       0");
        if (cmd.hasOption("draw")) {
            String outputPath = cmd.getOptionValue("draw");
            Utils.drawGraph(p, ctx, s.getModel(), outputPath, rels);
        }
    } else {
        System.out.println("The state is not reachable");
    // System.out.println("       1");
    }
    return;
}
Also used : Arrays(java.util.Arrays) ANTLRInputStream(org.antlr.v4.runtime.ANTLRInputStream) Solver(com.microsoft.z3.Solver) org.apache.commons.cli(org.apache.commons.cli) Context(com.microsoft.z3.Context) IOException(java.io.IOException) FileUtils(org.apache.commons.io.FileUtils) CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) Utils(dartagnan.utils.Utils) File(java.io.File) Z3_ast_print_mode(com.microsoft.z3.enumerations.Z3_ast_print_mode) LitmusParser(dartagnan.LitmusParser) List(java.util.List) Domain(dartagnan.wmm.Domain) PorthosLexer(dartagnan.PorthosLexer) PorthosParser(dartagnan.PorthosParser) Status(com.microsoft.z3.Status) Z3Exception(com.microsoft.z3.Z3Exception) Program(dartagnan.program.Program) LitmusLexer(dartagnan.LitmusLexer) Context(com.microsoft.z3.Context) CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) Solver(com.microsoft.z3.Solver) Program(dartagnan.program.Program) LitmusLexer(dartagnan.LitmusLexer) LitmusParser(dartagnan.LitmusParser) PorthosParser(dartagnan.PorthosParser) PorthosLexer(dartagnan.PorthosLexer) File(java.io.File) ANTLRInputStream(org.antlr.v4.runtime.ANTLRInputStream)

Example 13 with Solver

use of com.microsoft.z3.Solver in project batfish by batfish.

the class EncoderSlice method addUnusedDefaultValueConstraints.

/*
   * For performance reasons, we add constraints that if a message is not
   * valid, then the other variables will use default values. This speeds
   * up the solver significantly.
   */
private void addUnusedDefaultValueConstraints() {
    for (SymbolicRoute vars : getAllSymbolicRecords()) {
        BoolExpr notPermitted = mkNot(vars.getPermitted());
        ArithExpr zero = mkInt(0);
        if (vars.getAdminDist() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getAdminDist(), zero)));
        }
        if (vars.getMed() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getMed(), zero)));
        }
        if (vars.getLocalPref() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getLocalPref(), zero)));
        }
        if (vars.getPrefixLength() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getPrefixLength(), zero)));
        }
        if (vars.getMetric() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getMetric(), zero)));
        }
        if (vars.getOspfArea() != null) {
            add(mkImplies(notPermitted, vars.getOspfArea().isDefaultValue()));
        }
        if (vars.getOspfType() != null) {
            add(mkImplies(notPermitted, vars.getOspfType().isDefaultValue()));
        }
        if (vars.getProtocolHistory() != null) {
            add(mkImplies(notPermitted, vars.getProtocolHistory().isDefaultValue()));
        }
        if (vars.getBgpInternal() != null) {
            add(mkImplies(notPermitted, mkNot(vars.getBgpInternal())));
        }
        if (vars.getClientId() != null) {
            add(mkImplies(notPermitted, vars.getClientId().isDefaultValue()));
        }
        if (vars.getIgpMetric() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getIgpMetric(), zero)));
        }
        if (vars.getRouterId() != null) {
            add(mkImplies(notPermitted, mkEq(vars.getRouterId(), zero)));
        }
        vars.getCommunities().forEach((cvar, e) -> add(mkImplies(notPermitted, mkNot(e))));
    }
}
Also used : ArithExpr(com.microsoft.z3.ArithExpr) BoolExpr(com.microsoft.z3.BoolExpr)

Example 14 with Solver

use of com.microsoft.z3.Solver in project batfish by batfish.

the class PropertyAdder method instrumentLoad.

/*
   * Instruments the network with load balancing information to destination
   * port for graph edge ge. Each router will split load according to the
   * number of neighbors it actively uses to get to ge.
   */
Map<String, ArithExpr> instrumentLoad(Set<GraphEdge> ges) {
    Context ctx = _encoderSlice.getCtx();
    Solver solver = _encoderSlice.getSolver();
    String sliceName = _encoderSlice.getSliceName();
    Map<String, ArithExpr> loadVars = new HashMap<>();
    Graph graph = _encoderSlice.getGraph();
    for (String router : graph.getRouters()) {
        String name = _encoderSlice.getEncoder().getId() + "_" + sliceName + "_load_" + router;
        ArithExpr var = ctx.mkIntConst(name);
        loadVars.put(router, var);
        _encoderSlice.getAllVariables().put(var.toString(), var);
    }
    loadVars.forEach((name, var) -> solver.add(ctx.mkGe(var, ctx.mkInt(0))));
    ArithExpr zero = ctx.mkInt(0);
    ArithExpr one = ctx.mkInt(1);
    for (Entry<String, List<GraphEdge>> entry : graph.getEdgeMap().entrySet()) {
        String router = entry.getKey();
        List<GraphEdge> edges = entry.getValue();
        ArithExpr load = loadVars.get(router);
        BoolExpr hasDirectRoute = ctx.mkFalse();
        BoolExpr isAbsorbed = ctx.mkFalse();
        SymbolicRoute r = _encoderSlice.getBestNeighborPerProtocol(router, Protocol.CONNECTED);
        for (GraphEdge ge : edges) {
            if (!ge.isAbstract() && ges.contains(ge)) {
                // if we leave the network
                if (ge.getPeer() == null) {
                    BoolExpr fwdIface = _encoderSlice.getForwardsAcross().get(ge.getRouter(), ge);
                    assert (fwdIface != null);
                    hasDirectRoute = ctx.mkOr(hasDirectRoute, fwdIface);
                }
                // if connected route and we use it despite not forwarding
                if (r != null) {
                    BitVecExpr dstIp = _encoderSlice.getSymbolicPacket().getDstIp();
                    BitVecExpr ip = ctx.mkBV(ge.getStart().getAddress().getIp().asLong(), 32);
                    BoolExpr reach = ctx.mkAnd(r.getPermitted(), ctx.mkEq(dstIp, ip));
                    isAbsorbed = ctx.mkOr(isAbsorbed, reach);
                }
            }
        }
        ArithExpr acc = ctx.mkInt(0);
        for (GraphEdge edge : edges) {
            if (!edge.isAbstract()) {
                BoolExpr fwd = _encoderSlice.getForwardsAcross().get(router, edge);
                assert (fwd != null);
                if (edge.getPeer() != null) {
                    ArithExpr peerLoad = loadVars.get(edge.getPeer());
                    ArithExpr x = (ArithExpr) ctx.mkITE(fwd, peerLoad, zero);
                    acc = ctx.mkAdd(acc, x);
                }
            }
        }
        solver.add(ctx.mkEq(load, acc));
        BoolExpr guard = _encoderSlice.mkOr(hasDirectRoute, isAbsorbed);
        BoolExpr cond = _encoderSlice.mkIf(guard, ctx.mkEq(load, one), ctx.mkEq(load, acc));
        solver.add(cond);
    }
    return loadVars;
}
Also used : Context(com.microsoft.z3.Context) ArithExpr(com.microsoft.z3.ArithExpr) BoolExpr(com.microsoft.z3.BoolExpr) Solver(com.microsoft.z3.Solver) HashMap(java.util.HashMap) BitVecExpr(com.microsoft.z3.BitVecExpr) Graph(org.batfish.symbolic.Graph) List(java.util.List) GraphEdge(org.batfish.symbolic.GraphEdge)

Example 15 with Solver

use of com.microsoft.z3.Solver in project batfish by batfish.

the class PropertyAdder method initializeReachabilityVars.

/*
   * Initialize reachability and id variables an add the constraints
   * that all ids are at least 0 or higher, and reachable means non-zero.
   */
private void initializeReachabilityVars(EncoderSlice slice, Context ctx, Solver solver, Map<String, BoolExpr> reachableVars, Map<String, ArithExpr> idVars) {
    String sliceName = slice.getSliceName();
    ArithExpr zero = ctx.mkInt(0);
    for (String r : _encoderSlice.getGraph().getRouters()) {
        int id = _encoderSlice.getEncoder().getId();
        String s1 = id + "_" + sliceName + "_reachable-id_" + r;
        String s2 = id + "_" + sliceName + "_reachable_" + r;
        ArithExpr idVar = ctx.mkIntConst(s1);
        BoolExpr var = ctx.mkBoolConst(s2);
        idVars.put(r, idVar);
        reachableVars.put(r, var);
        _encoderSlice.getAllVariables().put(idVar.toString(), idVar);
        _encoderSlice.getAllVariables().put(var.toString(), var);
        solver.add(ctx.mkEq(var, ctx.mkGt(idVar, zero)));
        solver.add(ctx.mkGe(idVar, zero));
    }
}
Also used : ArithExpr(com.microsoft.z3.ArithExpr) BoolExpr(com.microsoft.z3.BoolExpr)

Aggregations

BoolExpr (com.microsoft.z3.BoolExpr)15 Solver (com.microsoft.z3.Solver)14 Context (com.microsoft.z3.Context)12 Status (com.microsoft.z3.Status)9 List (java.util.List)7 ArithExpr (com.microsoft.z3.ArithExpr)6 HashMap (java.util.HashMap)5 Graph (org.batfish.symbolic.Graph)5 GraphEdge (org.batfish.symbolic.GraphEdge)5 BitVecExpr (com.microsoft.z3.BitVecExpr)4 Model (com.microsoft.z3.Model)3 Test (org.junit.Test)3 Z3Exception (com.microsoft.z3.Z3Exception)2 Z3_ast_print_mode (com.microsoft.z3.enumerations.Z3_ast_print_mode)2 LitmusLexer (dartagnan.LitmusLexer)2 LitmusParser (dartagnan.LitmusParser)2 PorthosLexer (dartagnan.PorthosLexer)2 PorthosParser (dartagnan.PorthosParser)2 Program (dartagnan.program.Program)2 Utils (dartagnan.utils.Utils)2