forked from typetools/checker-framework-inference
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathCnfSerializerSolver.java
More file actions
139 lines (113 loc) · 4.76 KB
/
Copy pathCnfSerializerSolver.java
File metadata and controls
139 lines (113 loc) · 4.76 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package checkers.inference.model.serialization;
import org.checkerframework.framework.type.QualifierHierarchy;
import org.checkerframework.javacutil.AnnotationUtils;
import org.sat4j.core.VecInt;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
import checkers.inference.InferenceMain;
import checkers.inference.InferenceResult;
import checkers.inference.InferenceSolver;
import checkers.inference.SlotManager;
import checkers.inference.model.ConstantSlot;
import checkers.inference.model.Constraint;
import checkers.inference.model.Slot;
/** TODO: THIS IS NOT USEFUL UNTIL WE MAP EXISTENTIALVARIABLEIDS to POTENTIAL VAR */
public class CnfSerializerSolver implements InferenceSolver {
private static final String FILE_KEY = "constraint-file";
private static final String DEFAULT_FILE = "./constraints.json";
private SlotManager slotManager;
@Override
public InferenceResult solve(
Map<String, String> configuration,
Collection<Slot> slots,
Collection<Constraint> constraints,
QualifierHierarchy qualHierarchy,
ProcessingEnvironment processingEnvironment) {
final AnnotationMirror top = qualHierarchy.getTopAnnotations().iterator().next();
// AnnotationMirror bottom =
// qualHierarchy.getBottomAnnotations().iterator().next();
this.slotManager = InferenceMain.getInstance().getSlotManager();
CnfVecIntSerializer cnfSerializer =
new CnfVecIntSerializer(slotManager) {
@Override
protected boolean isTop(ConstantSlot constantSlot) {
return AnnotationUtils.areSame(constantSlot.getValue(), top);
}
};
String outFile =
configuration.containsKey(FILE_KEY) ? configuration.get(FILE_KEY) : DEFAULT_FILE;
printCnf(new File(outFile), constraints, cnfSerializer);
return null;
}
protected void printCnf(
File outputFile, Collection<Constraint> constraints, CnfVecIntSerializer serializer) {
try {
int totalVars = slotManager.getNumberOfSlots();
int totalConstraints = constraints.size();
final BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
String header =
makeComment(
"CNF File Generated by checkers.inference.serialization.CnfSerializerSolver\n"
+ "https://eisop.github.io/cf/\n"
+ "Generated: "
+ getDateString()
+ "\n"
+ "File Format: DIMACS CNF - http://www.satcompetition.org/2009/format-benchmarks2009.html");
writer.write(header);
writer.newLine();
writer.write(problem("cnf", totalVars, totalConstraints));
writer.newLine();
for (Constraint constraint : constraints) {
final VecInt[] clauses = constraint.serialize(serializer);
for (VecInt clause : clauses) {
writer.write(makeClause(clause));
writer.newLine();
}
}
writer.flush();
writer.close();
} catch (IOException ioExc) {
throw new RuntimeException(
"Error writing CNF File: " + outputFile.getAbsolutePath(), ioExc);
}
}
private String getDateString() {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
return dateFormat.format(date);
}
private String makeComment(String commentBlock) {
String[] lines = commentBlock.split("\\r?\\n");
StringBuilder sb = new StringBuilder();
for (String line : lines) {
sb.append("c " + line);
}
return sb.toString();
}
private String makeClause(VecInt clause) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (int entry : clause.toArray()) {
if (!first) {
sb.append(' ');
}
sb.append(entry);
first = false;
}
sb.append(' ');
sb.append(0);
return sb.toString();
}
private String problem(String format, int maxVariables, int maxConstraints) {
return "p " + format + " " + maxVariables + " " + maxConstraints;
}
}