forked from typetools/checker-framework-inference
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathZ3SmtSoftConstraintEncoder.java
More file actions
73 lines (58 loc) · 2.92 KB
/
Copy pathZ3SmtSoftConstraintEncoder.java
File metadata and controls
73 lines (58 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package checkers.inference.solver.backend.z3smt.encoder;
import java.util.Collection;
import java.util.logging.Logger;
import checkers.inference.InferenceMain;
import com.microsoft.z3.Context;
import com.microsoft.z3.Expr;
import checkers.inference.model.Constraint;
import checkers.inference.model.EqualityConstraint;
import checkers.inference.model.InequalityConstraint;
import checkers.inference.model.SubtypeConstraint;
import checkers.inference.solver.backend.z3smt.Z3SmtFormatTranslator;
import checkers.inference.solver.frontend.Lattice;
import org.checkerframework.javacutil.BugInCF;
public abstract class Z3SmtSoftConstraintEncoder<SlotEncodingT, SlotSolutionT>
extends Z3SmtAbstractConstraintEncoder<SlotEncodingT, SlotSolutionT> {
private static final Logger logger = Logger.getLogger(Z3SmtSoftConstraintEncoder.class.getName());
protected final StringBuilder softConstraints;
public Z3SmtSoftConstraintEncoder(
Lattice lattice,
Context ctx,
Z3SmtFormatTranslator<SlotEncodingT, SlotSolutionT> z3SmtFormatTranslator) {
super(lattice, ctx, z3SmtFormatTranslator);
this.softConstraints = new StringBuilder();
}
protected void addSoftConstraint(Expr serializedConstraint, int weight) {
softConstraints.append("(assert-soft " + serializedConstraint + " :weight " + weight + ")\n");
}
protected abstract void encodeSoftSubtypeConstraint(SubtypeConstraint constraint);
protected abstract void encodeSoftEqualityConstraint(EqualityConstraint constraint);
protected abstract void encodeSoftInequalityConstraint(InequalityConstraint constraint);
/**
* Encode a set of constraints as soft constraints.
*
* @param constraints constraints to be encoded as soft constraints
* @return a string representation of the encoding of soft constraints
*/
public String encodeAndGetSoftConstraints(Collection<Constraint> constraints) {
for (Constraint constraint : constraints) {
if (constraint instanceof SubtypeConstraint) {
encodeSoftSubtypeConstraint((SubtypeConstraint) constraint);
} else if (constraint instanceof EqualityConstraint) {
encodeSoftEqualityConstraint((EqualityConstraint) constraint);
} else if (constraint instanceof InequalityConstraint) {
encodeSoftInequalityConstraint((InequalityConstraint) constraint);
} else {
if (InferenceMain.isHackMode()) {
logger.warning("Soft constraint for " + constraint.getClass().getName() + " is not supported");
} else {
throw new BugInCF("Soft constraint for " + constraint.getClass().getName() + " is not supported");
}
}
}
String res = softConstraints.toString();
// clear field for next usage
softConstraints.setLength(0);
return res;
}
}