1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package p3j.experiment.results;
17
18 import java.io.File;
19 import java.io.FileWriter;
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Map.Entry;
27
28 import p3j.gui.panels.projections.ParameterInstanceNode;
29 import p3j.misc.Misc;
30 import p3j.pppm.ProjectionModel;
31 import p3j.pppm.parameters.ParameterAssignment;
32 import p3j.pppm.parameters.ParameterAssignmentComparator;
33 import p3j.pppm.parameters.ParameterInstance;
34 import p3j.pppm.parameters.ParameterInstanceComparator;
35 import p3j.pppm.sets.Set;
36 import p3j.pppm.sets.SetType;
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 public class ParameterAssumptionEncoder {
72
73
74 private final ProjectionModel projection;
75
76
77 private final List<ParameterInstance> orderedParameterInstances;
78
79
80 private final Map<Integer, Map<Integer, Integer>> encoding;
81
82
83 private final Map<Integer, ParameterAssignment> assignments = new HashMap<Integer, ParameterAssignment>();
84
85
86
87
88
89
90
91 public ParameterAssumptionEncoder(ProjectionModel projectionModel) {
92 projection = projectionModel;
93 orderedParameterInstances = setUpOrderedInstanceList();
94 encoding = constructEncoding();
95 }
96
97
98
99
100
101
102 private List<ParameterInstance> setUpOrderedInstanceList() {
103 List<ParameterInstance> paramInstances = new ArrayList<ParameterInstance>(
104 projection.getAllParameterInstances());
105 Collections.sort(paramInstances, new ParameterInstanceComparator());
106 return Collections.unmodifiableList(paramInstances);
107 }
108
109
110
111
112
113
114 private Map<Integer, Map<Integer, Integer>> constructEncoding() {
115 Map<Integer, Map<Integer, Integer>> paramEncoding = new HashMap<Integer, Map<Integer, Integer>>();
116
117 Map<ParameterInstance, SetType> instSetTypeMap = projection
118 .getInstanceSetTypes();
119 for (ParameterInstance instance : orderedParameterInstances) {
120 paramEncoding.put(instance.getID(),
121 getSubEncoding(instSetTypeMap, instance));
122 }
123
124 return Collections.unmodifiableMap(paramEncoding);
125 }
126
127
128
129
130
131
132
133
134
135
136
137 private Map<Integer, Integer> getSubEncoding(
138 Map<ParameterInstance, SetType> instSetTypeMap, ParameterInstance instance) {
139
140 List<ParameterAssignment> assignmentList = getAllAssignmentsForInstance(
141 instSetTypeMap, instance);
142
143 Collections.sort(assignmentList, new ParameterAssignmentComparator());
144
145 Map<Integer, Integer> subEncoding = new HashMap<Integer, Integer>();
146 int assignmentCounter = 0;
147 for (ParameterAssignment assignment : assignmentList) {
148 assignments.put(assignment.getID(), assignment);
149 subEncoding.put(assignment.getID(), assignmentCounter++);
150 }
151
152 return Collections.unmodifiableMap(subEncoding);
153 }
154
155
156
157
158
159
160
161
162
163
164
165 private List<ParameterAssignment> getAllAssignmentsForInstance(
166 Map<ParameterInstance, SetType> instSetTypeMap, ParameterInstance instance) {
167 SetType setType = instSetTypeMap.get(instance);
168 List<ParameterAssignment> assignmentList = new ArrayList<ParameterAssignment>();
169 for (Set set : setType.getSets()) {
170 assignmentList.addAll(set.getParameterAssignments(instance)
171 .getAssignments());
172 }
173 return assignmentList;
174 }
175
176
177
178
179
180
181
182
183
184
185
186
187 public void writeMappingSummary(File dataDirectory) throws IOException {
188
189 StringBuffer strBuf = new StringBuffer();
190 for (ParameterInstance instance : orderedParameterInstances) {
191 strBuf.append(ParameterInstanceNode.getDisplayName(instance) + " ["
192 + instance.getID() + "]:\n");
193 Map<Integer, Integer> assignmentMap = encoding.get(instance.getID());
194 Map<Integer, Integer> inverted = new HashMap<Integer, Integer>();
195 Misc.invertMap(assignmentMap, inverted);
196 for (int i = 0; i < inverted.size(); i++) {
197 int id = inverted.get(i);
198 ParameterAssignment assignment = assignments.get(id);
199 strBuf.append("\t" + i + ": " + assignment.getName() + " [" + id
200 + "]\n");
201 }
202 strBuf.append("\n\n");
203 }
204
205 FileWriter fw = new FileWriter(dataDirectory.getAbsolutePath()
206 + File.separatorChar + "assumption_mapping.txt");
207 fw.append(strBuf);
208 fw.close();
209
210 }
211
212
213
214
215
216
217
218
219
220 public int[] encode(Map<ParameterInstance, ParameterAssignment> assignment) {
221 int[] result = new int[orderedParameterInstances.size()];
222 Map<Integer, Integer> idMapping = convertToIDMapping(assignment);
223 for (int i = 0; i < result.length; i++) {
224 ParameterInstance instance = orderedParameterInstances.get(i);
225 result[i] = encoding.get(instance.getID()).get(
226 idMapping.get(instance.getID()));
227 }
228 return result;
229 }
230
231
232
233
234
235
236
237
238
239 private Map<Integer, Integer> convertToIDMapping(
240 Map<ParameterInstance, ParameterAssignment> assignment) {
241 Map<Integer, Integer> result = new HashMap<Integer, Integer>();
242 for (Entry<ParameterInstance, ParameterAssignment> aEntry : assignment
243 .entrySet()) {
244 result.put(aEntry.getKey().getID(), aEntry.getValue().getID());
245 }
246 return result;
247 }
248
249
250
251
252
253
254
255
256
257 public String verboseEncoding(
258 Map<ParameterInstance, ParameterAssignment> assignment) {
259 StringBuffer strBuf = new StringBuffer();
260 Map<Integer, Integer> idMapping = convertToIDMapping(assignment);
261 for (int i = 0; i < orderedParameterInstances.size(); i++) {
262 ParameterInstance instance = orderedParameterInstances.get(i);
263 int assignmentID = idMapping.get(instance.getID());
264 strBuf.append(ParameterInstanceNode.getDisplayName(instance) + ":\n\t"
265 + assignments.get(assignmentID).getName() + " [option:"
266 + encoding.get(instance.getID()).get(assignmentID) + "]\n");
267 }
268 return strBuf.toString();
269 }
270 }