/
ParetoFrontCalculator.java
87 lines (64 loc) · 2.31 KB
/
ParetoFrontCalculator.java
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
package edu.atilim.acma;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import edu.atilim.acma.metrics.MetricNormalizer;
import edu.atilim.acma.metrics.MetricSummary;
import edu.atilim.acma.ui.ConfigManager;
public class ParetoFrontCalculator implements Runnable {
@Override
public void run() {
ArrayList<RunResult> results = new ArrayList<RunResult>();
System.out.println("Please enter the results folder location: ");
String root = Console.readLine();
if (root.length() == 0) {
root = ".//data//results";
}
File rd = new File(root);
try {
if (rd.exists() && rd.isDirectory()) {
for (File inner : rd.listFiles()) {
if (inner.isDirectory()) {
for (File result : inner.listFiles()) {
if (!result.isFile() || !result.getName().endsWith(".txt")) continue;
results.add(RunResult.readFrom(result.getAbsolutePath()));
}
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
results = getParetoFront(results);
for (RunResult r : results) {
System.out.println(r.getRunInfo());
}
}
private ArrayList<RunResult> getParetoFront(ArrayList<RunResult> res) {
RunConfig config = ConfigManager.getRunConfig("Default");
ArrayList<RunResult> front = new ArrayList<RunResult>();
cur:
for (int i = 0; i < res.size(); i++) {
RunResult cur = res.get(i);
HashMap<String, Double> curMetrics = MetricNormalizer.normalizeEach(new MetricSummary(cur.getFinalDesign().getMetrics()), config);
for (int j = 0; j < res.size(); j++) {
if (i == j) continue;
RunResult check = res.get(j);
if (!cur.getBenchmark().equalsIgnoreCase(check.getBenchmark())) continue;
HashMap<String, Double> checkMetrics = MetricNormalizer.normalizeEach(new MetricSummary(check.getFinalDesign().getMetrics()), config);
boolean paretobetter = true;
for (Entry<String, Double> metric : checkMetrics.entrySet()) {
double checkVal = metric.getValue();
double curVal = curMetrics.get(metric.getKey());
if (checkVal > curVal)
paretobetter = false;
}
if (paretobetter)
continue cur;
}
front.add(cur);
}
return front;
}
}