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);
}
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;
}
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))));
}
}
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;
}
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));
}
}
Aggregations