use of com.marcnuri.yakc.model.io.k8s.apimachinery.pkg.apis.meta.v1.Status in project batfish by batfish.
the class NodJobTest method testNattedUnsat.
/**
* Test that traffic originating from 3.0.0.0 that is expected to be NATed returns UNSAT when we
* constrain to only allow NOT-NATed results.
*/
@Test
public void testNattedUnsat() {
HeaderSpace headerSpace = new HeaderSpace();
headerSpace.setSrcIps(ImmutableList.of(new IpWildcard("3.0.0.0")));
NodJob nodJob = getNodJob(headerSpace, false);
Context z3Context = new Context();
Status status = nodJob.computeNodSat(System.currentTimeMillis(), z3Context);
assertThat(status, equalTo(Status.UNSATISFIABLE));
}
use of com.marcnuri.yakc.model.io.k8s.apimachinery.pkg.apis.meta.v1.Status in project bmoth by hhu-stups.
the class BoundedModelChecker method doModelCheck.
@Override
protected ModelCheckingResult doModelCheck() {
for (int k = 0; k < maxSteps; k++) {
// get a clean solver
solver.reset();
// INIT(V0)
solver.add(init());
// CONJUNCTION i from 1 to k T(Vi-1, Vi)
for (int i = 1; i <= k; i++) {
solver.add(transition(i - 1, i));
}
// not INV(Vk)
solver.add(getContext().mkNot(invariant(k)));
// CONJUNCTION i from 1 to k, j from i + 1 to k (Vi != Vj)
solver.add(distinctVectors(k));
Status check = solver.check();
if (check == Status.SATISFIABLE) {
// counter example found!
State counterExample = getStateFromModel(solver.getModel(), k);
return ModelCheckingResult.createCounterExampleFound(k, counterExample, null);
}
}
// no counter example found after maxStep steps
return ModelCheckingResult.createExceededMaxSteps(maxSteps);
}
use of com.marcnuri.yakc.model.io.k8s.apimachinery.pkg.apis.meta.v1.Status in project bmoth by hhu-stups.
the class ExplicitStateModelChecker method labelStateSpace.
private void labelStateSpace() {
Queue<State> statesToUpdate = new ArrayDeque<>();
statesToUpdate.addAll(stateSpace.vertexSet());
while (!statesToUpdate.isEmpty()) {
State current = statesToUpdate.poll();
final Set<BuechiAutomatonNode> buechiNodes = new HashSet<>();
final Set<BuechiAutomatonNode> candidates = new HashSet<>();
if (stateSpace.rootVertexSet().contains(current)) {
candidates.addAll(buechiAutomaton.getInitialStates());
} else {
Set<DefaultEdge> incomingEdges = stateSpace.incomingEdgesOf(current);
for (DefaultEdge incomingEdge : incomingEdges) {
State predecessor = stateSpace.getEdgeSource(incomingEdge);
predecessor.getBuechiNodes().forEach(n -> candidates.addAll(n.getSuccessors()));
}
}
for (BuechiAutomatonNode node : candidates) {
if (node.getLabels().isEmpty()) {
buechiNodes.add(node);
}
// TODO use all labels?
for (PredicateNode label : node.getLabels()) {
labelSolver.reset();
labelSolver.add(FormulaToZ3Translator.translatePredicate(label, getContext(), getMachineTranslator().getZ3TypeInference()));
labelSolver.add(current.getStateConstraint(getContext()));
Status status = labelSolver.check();
switch(status) {
case UNSATISFIABLE:
break;
case UNKNOWN:
throw new UnsupportedOperationException("should not be undefined");
case SATISFIABLE:
buechiNodes.add(node);
}
}
}
buechiNodes.stream().filter(n -> !current.getBuechiNodes().contains(n)).forEach(newBuechiNode -> {
// found a new node, need to update successors again
current.addBuechiNode(newBuechiNode);
Set<DefaultEdge> outgoingEdges = stateSpace.outgoingEdgesOf(current);
for (DefaultEdge outgoingEdge : outgoingEdges) {
State successor = stateSpace.getEdgeTarget(outgoingEdge);
if (!statesToUpdate.contains(successor)) {
statesToUpdate.add(successor);
}
}
});
}
}
use of com.marcnuri.yakc.model.io.k8s.apimachinery.pkg.apis.meta.v1.Status in project bmoth by hhu-stups.
the class KInductionModelChecker method doModelCheck.
@Override
protected ModelCheckingResult doModelCheck() {
for (int k = 0; k < maxSteps; k++) {
// get a clean baseSolver
baseSolver.reset();
// INIT(V0)
baseSolver.add(init());
// CONJUNCTION i from 1 to k T(Vi-1, Vi)
for (int i = 1; i <= k; i++) {
baseSolver.add(transition(i - 1, i));
}
// not INV(Vk)
baseSolver.add(getContext().mkNot(invariant(k)));
Status check = baseSolver.check();
if (check == Status.SATISFIABLE) {
// counter example found!
State counterExample = getStateFromModel(baseSolver.getModel(), k);
return createCounterExampleFound(k, counterExample, null);
} else {
stepSolver.reset();
stepSolver.add();
// CONJUNCTION i from 1 to k, j from i + 1 to k (Vi != Vj)
stepSolver.add(distinctVectors(k));
for (int i = 0; i <= k; i++) {
stepSolver.add(transition(i - 1, i));
}
for (int i = 0; i <= k; i++) {
stepSolver.add(invariant(i));
}
stepSolver.add(getContext().mkNot(invariant(k + 1)));
Status checkStep = stepSolver.check();
if (checkStep == Status.UNSATISFIABLE)
// TODO think about state space root!
return createVerified(k, null);
}
}
// no counter example found after maxStep steps
return createExceededMaxSteps(maxSteps);
}
use of com.marcnuri.yakc.model.io.k8s.apimachinery.pkg.apis.meta.v1.Status in project Dat3M by hernanponcedeleon.
the class Porthos 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 sourceOpt = new Option("s", "source", true, "source MCM");
sourceOpt.setRequired(true);
options.addOption(sourceOpt);
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("state", false, "PORTHOS performs state portability");
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());
options.addOption(Option.builder("unroll").hasArg().desc("Unrolling steps").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("PORTHOS", options);
System.exit(1);
return;
}
String source = cmd.getOptionValue("source");
if (!MCMs.stream().anyMatch(mcms -> mcms.trim().equals(source))) {
System.out.println("Unrecognized source");
System.exit(0);
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);
boolean statePortability = cmd.hasOption("state");
String[] rels = new String[100];
if (cmd.hasOption("rels")) {
rels = cmd.getOptionValues("rels");
}
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;
}
int steps = 1;
if (cmd.hasOption("unroll")) {
steps = Integer.parseInt(cmd.getOptionValue("unroll"));
}
p.initialize(steps);
Program pSource = p.clone();
Program pTarget = p.clone();
pSource.compile(source, false, true);
Integer startEId = Collections.max(pSource.getEvents().stream().filter(e -> e instanceof Init).map(e -> e.getEId()).collect(Collectors.toSet())) + 1;
pTarget.compile(target, false, true, startEId);
Context ctx = new Context();
ctx.setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB_FULL);
Solver s = ctx.mkSolver();
Solver s2 = ctx.mkSolver();
BoolExpr sourceDF = pSource.encodeDF(ctx);
BoolExpr sourceCF = pSource.encodeCF(ctx);
BoolExpr sourceDF_RF = pSource.encodeDF_RF(ctx);
BoolExpr sourceDomain = Domain.encode(pSource, ctx);
BoolExpr sourceMM = pSource.encodeMM(ctx, source);
s.add(pTarget.encodeDF(ctx));
s.add(pTarget.encodeCF(ctx));
s.add(pTarget.encodeDF_RF(ctx));
s.add(Domain.encode(pTarget, ctx));
s.add(pTarget.encodeMM(ctx, target));
s.add(pTarget.encodeConsistent(ctx, target));
s.add(sourceDF);
s.add(sourceCF);
s.add(sourceDF_RF);
s.add(sourceDomain);
s.add(sourceMM);
s.add(pSource.encodeInconsistent(ctx, source));
s.add(encodeCommonExecutions(pTarget, pSource, ctx));
s2.add(sourceDF);
s2.add(sourceCF);
s2.add(sourceDF_RF);
s2.add(sourceDomain);
s2.add(sourceMM);
s2.add(pSource.encodeConsistent(ctx, source));
if (!statePortability) {
if (s.check() == Status.SATISFIABLE) {
System.out.println("The program is not portable");
// System.out.println(" 0");
if (cmd.hasOption("draw")) {
String outputPath = cmd.getOptionValue("draw");
Utils.drawGraph(p, pSource, pTarget, ctx, s.getModel(), outputPath, rels);
}
return;
} else {
System.out.println("The program is portable");
// System.out.println(" 1");
return;
}
}
int iterations = 0;
Status lastCheck = Status.SATISFIABLE;
Set<Expr> visited = new HashSet<Expr>();
while (lastCheck == Status.SATISFIABLE) {
lastCheck = s.check();
if (lastCheck == Status.SATISFIABLE) {
iterations = iterations + 1;
Model model = s.getModel();
s2.push();
BoolExpr reachedState = encodeReachedState(pTarget, model, ctx);
visited.add(reachedState);
assert (iterations == visited.size());
s2.add(reachedState);
if (s2.check() == Status.UNSATISFIABLE) {
System.out.println("The program is not state-portable");
System.out.println("Iterations: " + iterations);
// System.out.println(" 0");
return;
} else {
s2.pop();
s.add(ctx.mkNot(reachedState));
}
} else {
System.out.println("The program is state-portable");
System.out.println("Iterations: " + iterations);
// System.out.println(" 1");
return;
}
}
}
Aggregations