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 package org.ximtec.igesture.batch;
29
30 import java.io.File;
31 import java.util.ArrayList;
32 import java.util.List;
33 import java.util.concurrent.Callable;
34 import java.util.logging.Level;
35 import java.util.logging.Logger;
36
37 import org.sigtec.util.Constant;
38 import org.ximtec.igesture.algorithm.Algorithm;
39 import org.ximtec.igesture.algorithm.AlgorithmException;
40 import org.ximtec.igesture.algorithm.AlgorithmFactory;
41 import org.ximtec.igesture.batch.core.BatchAlgorithm;
42 import org.ximtec.igesture.batch.core.BatchForValue;
43 import org.ximtec.igesture.batch.core.BatchParameter;
44 import org.ximtec.igesture.batch.core.BatchPowerSetValue;
45 import org.ximtec.igesture.batch.core.BatchSequenceValue;
46 import org.ximtec.igesture.batch.core.BatchValue;
47 import org.ximtec.igesture.configuration.Configuration;
48 import org.ximtec.igesture.core.Gesture;
49 import org.ximtec.igesture.core.GestureSet;
50 import org.ximtec.igesture.core.ResultSet;
51 import org.ximtec.igesture.core.TestClass;
52 import org.ximtec.igesture.core.TestSet;
53 import org.ximtec.igesture.util.XMLTool;
54
55
56
57
58
59
60
61
62
63
64 public class BatchProcess implements Callable<BatchResultSet> {
65
66 private static final Logger LOGGER = Logger.getLogger(AlgorithmFactory.class
67 .getName());
68
69 private static final String NUMBER_CONFIGURATIONS = "Number of configurations: ";
70
71 private BatchProcessContainer batchProcessContainer;
72
73 private List<Configuration> configurations;
74
75 TestSet testSet;
76
77 List<GestureSet> sets;
78
79
80
81
82
83
84
85 public BatchProcess(BatchProcessContainer container) {
86 this.batchProcessContainer = container;
87 this.configurations = createConfigurations(batchProcessContainer
88 .getAlgorithms());
89
90 this.sets = batchProcessContainer.getGestureSets();
91 }
92
93
94
95
96
97
98
99 public void setTestSet(TestSet testSet) {
100 this.testSet = testSet;
101 }
102
103
104
105
106
107
108
109 public void addGestureSet(GestureSet set) {
110 this.sets.add(set);
111 }
112
113
114
115
116
117
118
119 public void addGestureSets(List<GestureSet> sets) {
120 this.sets.addAll(sets);
121 }
122
123
124
125
126
127
128
129 public BatchResultSet run() {
130 BatchResultSet batchResultSet = new BatchResultSet();
131 LOGGER.log(Level.INFO, NUMBER_CONFIGURATIONS + configurations.size());
132 int counter = 1;
133
134 for (Configuration config : configurations) {
135 config.addGestureSets(sets);
136 BatchResult batchResult = new BatchResult(testSet, config);
137
138 try {
139 batchResult.setStartTime();
140 Algorithm algorithm;
141 algorithm = AlgorithmFactory.createAlgorithm(config);
142
143 for (TestClass testClass : testSet.getTestClasses()) {
144
145 for (Gesture<?> sample : testClass.getGestures()) {
146 ResultSet resultSet = algorithm.recognise(sample);
147
148 if(Thread.currentThread().isInterrupted()){
149 return null;
150 }
151
152 if (resultSet.isEmpty()) {
153
154 if (sample.getName().equals(TestSet.NOISE)) {
155 batchResult.incRejectCorrect(sample.getName());
156 }
157 else {
158 batchResult.incRejectError(sample.getName());
159 }
160
161 }
162 else {
163
164 if (resultSet.getResult().getGestureClassName().equals(
165 sample.getName())) {
166 batchResult.incCorrect(sample.getName());
167 }
168 else {
169 batchResult.incError(sample.getName());
170 }
171
172 }
173
174 }
175 }
176
177 batchResult.setEndTime();
178 batchResultSet.addResult(batchResult);
179 }
180 catch (final AlgorithmException e) {
181 LOGGER.log(Level.SEVERE, Constant.EMPTY_STRING, e);
182 }
183
184 LOGGER.info((double)counter / configurations.size() * 100
185 + Constant.PERCENTAGE);
186 counter++;
187 }
188
189 return batchResultSet;
190 }
191
192
193
194
195
196
197
198
199
200
201
202 public static List<Configuration> createConfigurations(
203 List<BatchAlgorithm> algorithms) {
204 final List<Configuration> result = new ArrayList<Configuration>();
205
206 for (final BatchAlgorithm algorithm : algorithms) {
207 final Configuration config = new Configuration();
208 config.addAlgorithm(algorithm.getName());
209 permuteParameters(algorithm.getName(), algorithm.getParameters(), 0,
210 config, result);
211 }
212
213 return result;
214 }
215
216
217
218
219
220
221
222
223 public static List<Configuration> createConfigurations(File file) {
224 final BatchProcessContainer container = XMLTool
225 .importBatchProcessContainer(file);
226 final List<Configuration> configurations = createConfigurations(container
227 .getAlgorithms());
228
229
230 for (final Configuration config : configurations) {
231
232 for (final GestureSet set : container.getGestureSets()) {
233 config.addGestureSet(set);
234 }
235
236 }
237
238 return configurations;
239 }
240
241
242
243
244
245
246
247
248
249
250
251 private static void permuteParameters(String algorithm,
252 List<BatchParameter> parameters, int index,
253 Configuration configuration, List<Configuration> configurations) {
254
255
256
257
258
259 if (index == parameters.size()) {
260 configurations.add((Configuration)configuration.clone());
261 return;
262 }
263
264 final BatchParameter param = parameters.get(index);
265 processSimpleParameter(param, configuration, algorithm, parameters, index,
266 configurations);
267 processPowerSetParameter(param, configuration, algorithm, parameters,
268 index, configurations);
269 processSequenceParameter(param, configuration, algorithm, parameters,
270 index, configurations);
271 processForLoopParameter(param, configuration, algorithm, parameters,
272 index, configurations);
273 }
274
275
276
277
278
279
280
281
282
283
284
285 protected static void processSimpleParameter(BatchParameter param,
286 Configuration configuration, String algorithm,
287 List<BatchParameter> parameters, int index,
288 List<Configuration> configurations) {
289
290 if (param.getValue() != null) {
291 final BatchValue value = param.getValue();
292 final Configuration conf = (Configuration)configuration.clone();
293 conf.addParameter(algorithm, param.getName(), value.getValue());
294 permuteParameters(algorithm, parameters, index + 1, conf,
295 configurations);
296 }
297
298 }
299
300
301
302
303
304
305
306
307
308
309
310
311 protected static void processPowerSetParameter(BatchParameter param,
312 Configuration configuration, String algorithm,
313 List<BatchParameter> parameters, int index,
314 List<Configuration> configurations) {
315
316 if (param.getPermutationValue() != null) {
317 final BatchPowerSetValue values = param.getPermutationValue();
318
319 for (final String value : values.getValues()) {
320 final Configuration conf = (Configuration)configuration.clone();
321 conf.addParameter(algorithm, param.getName(), value);
322 permuteParameters(algorithm, parameters, index + 1, conf,
323 configurations);
324 }
325
326 }
327
328 }
329
330
331
332
333
334
335
336
337
338
339
340
341 protected static void processSequenceParameter(BatchParameter param,
342 Configuration configuration, String algorithm,
343 List<BatchParameter> parameters, int index,
344 List<Configuration> configurations) {
345
346 if (param.getSequenceValue() != null) {
347 final BatchSequenceValue values = param.getSequenceValue();
348
349 for (final String value : values.getValues()) {
350 final Configuration conf = (Configuration)configuration.clone();
351 conf.addParameter(algorithm, param.getName(), value);
352 permuteParameters(algorithm, parameters, index + 1, conf,
353 configurations);
354 }
355
356 }
357
358 }
359
360
361
362
363
364
365
366
367
368
369
370
371 protected static void processForLoopParameter(BatchParameter param,
372 Configuration configuration, String algorithm,
373 List<BatchParameter> parameters, int index,
374 List<Configuration> configurations) {
375
376 if (param.getIncrementalValue() != null) {
377 final BatchForValue values = param.getIncrementalValue();
378
379 for (final String value : values.getValues()) {
380 final Configuration conf = (Configuration)configuration.clone();
381 conf.addParameter(algorithm, param.getName(), value);
382 permuteParameters(algorithm, parameters, index + 1, conf,
383 configurations);
384 }
385
386 }
387
388 }
389
390
391 @Override
392 public BatchResultSet call() throws Exception {
393 return run();
394 }
395
396 }