use of edu.stanford.CVC4.Expr in project VERDICT by ge-high-assurance.
the class VerdictSynthesis method performSynthesisMaxSmt.
/**
* Perform synthesis using Z3 MaxSMT.
*
* @param tree
* @param targetDal
* @param factory
* @return
* @deprecated use the multi-requirement approach instead
*/
@Deprecated
public static Optional<Pair<Set<ComponentDefense>, Double>> performSynthesisMaxSmt(DTree tree, int targetDal, DLeaf.Factory factory) {
Context context = new Context();
Optimize optimizer = context.mkOptimize();
Collection<ComponentDefense> pairs = factory.allComponentDefensePairs();
int costLcd = normalizeCosts(pairs);
for (ComponentDefense pair : pairs) {
if (pair.dalToNormCost(targetDal) > 0) {
// this id ("cover") doesn't matter but we have to specify something
optimizer.AssertSoft(context.mkNot(pair.toZ3(context)), pair.dalToNormCost(targetDal), "cover");
}
}
optimizer.Assert(tree.toZ3(context));
if (optimizer.Check().equals(Status.SATISFIABLE)) {
Set<ComponentDefense> output = new LinkedHashSet<>();
int totalNormalizedCost = 0;
Model model = optimizer.getModel();
for (ComponentDefense pair : pairs) {
Expr expr = model.eval(pair.toZ3(context), true);
switch(expr.getBoolValue()) {
case Z3_L_TRUE:
output.add(pair);
totalNormalizedCost += pair.dalToNormCost(targetDal);
break;
case Z3_L_FALSE:
break;
case Z3_L_UNDEF:
default:
throw new RuntimeException("Synthesis: Undefined variable in output model: " + pair.toString());
}
}
return Optional.of(new Pair<>(output, ((double) totalNormalizedCost) / costLcd));
} else {
System.err.println("Synthesis: SMT not satisfiable, perhaps there are unmitigatable attacks");
return Optional.empty();
}
}
use of edu.stanford.CVC4.Expr in project cel-java by projectnessie.
the class Unparser method visitList.
void visitList(CreateList expr) {
List<Expr> elems = expr.getElementsList();
str.append("[");
for (int i = 0; i < elems.size(); i++) {
if (i > 0) {
str.append(", ");
}
Expr elem = elems.get(i);
visit(elem);
}
str.append("]");
}
use of edu.stanford.CVC4.Expr in project cel-java by projectnessie.
the class Unparser method visitStructMap.
void visitStructMap(CreateStruct expr) {
List<Entry> entries = expr.getEntriesList();
str.append("{");
for (int i = 0; i < entries.size(); i++) {
if (i > 0) {
str.append(", ");
}
Entry entry = entries.get(i);
Expr k = entry.getMapKey();
visit(k);
str.append(": ");
Expr v = entry.getValue();
visit(v);
}
str.append("}");
}
use of edu.stanford.CVC4.Expr in project cel-java by projectnessie.
the class Unparser method visitCallBinary.
void visitCallBinary(Call expr) {
String fun = expr.getFunction();
List<Expr> args = expr.getArgsList();
Expr lhs = args.get(0);
// add parens if the current operator is lower precedence than the lhs expr operator.
boolean lhsParen = isComplexOperatorWithRespectTo(fun, lhs);
Expr rhs = args.get(1);
// add parens if the current operator is lower precedence than the rhs expr operator,
// or the same precedence and the operator is left recursive.
boolean rhsParen = isComplexOperatorWithRespectTo(fun, rhs);
if (!rhsParen && isLeftRecursive(fun)) {
rhsParen = isSamePrecedence(Operator.precedence(fun), rhs);
}
visitMaybeNested(lhs, lhsParen);
String unmangled = Operator.findReverseBinaryOperator(fun);
if (unmangled == null) {
throw new IllegalStateException(String.format("cannot unmangle operator: %s", fun));
}
str.append(" ");
str.append(unmangled);
str.append(" ");
visitMaybeNested(rhs, rhsParen);
}
use of edu.stanford.CVC4.Expr in project cel-java by projectnessie.
the class CELTest method CustomMacro.
@Test
void CustomMacro() {
Macro joinMacro = newReceiverMacro("join", 1, (eh, target, args) -> {
Expr delim = args.get(0);
Expr iterIdent = eh.ident("__iter__");
Expr accuIdent = eh.ident("__result__");
Expr init = eh.literalString("");
Expr condition = eh.literalBool(true);
Expr step = eh.globalCall(Operator.Conditional.id, eh.globalCall(Operator.Greater.id, eh.receiverCall("size", accuIdent, emptyList()), eh.literalInt(0)), eh.globalCall(Operator.Add.id, eh.globalCall(Operator.Add.id, accuIdent, delim), iterIdent), iterIdent);
return eh.fold("__iter__", target, "__result__", init, condition, step, accuIdent);
});
Env e = newEnv(macros(joinMacro));
AstIssuesTuple astIss = e.compile("['hello', 'cel', 'friend'].join(',')");
assertThat(astIss.hasIssues()).isFalse();
Program prg = e.program(astIss.getAst(), evalOptions(OptExhaustiveEval));
EvalResult out = prg.eval(noVars());
assertThat(out.getVal().equal(stringOf("hello,cel,friend"))).isSameAs(True);
}
Aggregations