diff --git a/src/main/java/br/ufrgs/inf/prosoft/tfcache/metadata/Method.java b/src/main/java/br/ufrgs/inf/prosoft/tfcache/metadata/Method.java
index 4071323..ae74a46 100755
--- a/src/main/java/br/ufrgs/inf/prosoft/tfcache/metadata/Method.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/tfcache/metadata/Method.java
@@ -22,6 +22,7 @@ public class Method {
private List<GroupOfOccurrences> groupsOfOccurrences;
private Integer countChangeableGroups;
private Pareto pareto;
+ private Double minEuclideanDistance;
public Method(String name, List<Occurrence> occurrences) {
this.name = name;
@@ -47,6 +48,11 @@ public class Method {
return name;
}
+ public double getMinEuclideanDistance() {
+ if (minEuclideanDistance == null) minEuclideanDistance = this.pareto.getNormalised().getMinEuclideanDistance();
+ return minEuclideanDistance;
+ }
+
public Metrics getBestMetrics() {
if (this.pareto == null) throw new RuntimeException("trying to access pareto before calculating it");
return this.pareto.getBestMetrics();
diff --git a/src/main/java/br/ufrgs/inf/prosoft/tfcache/Pareto.java b/src/main/java/br/ufrgs/inf/prosoft/tfcache/Pareto.java
index edfb7da..1e4e350 100755
--- a/src/main/java/br/ufrgs/inf/prosoft/tfcache/Pareto.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/tfcache/Pareto.java
@@ -11,12 +11,18 @@ public class Pareto {
private final Map<Double, Metrics> savedTimeHasMetrics;
private Metrics bestMetrics;
+ private Double minEuclideanDistance;
public Pareto() {
savedTimeHasMetrics = new ConcurrentHashMap<>();
}
- public Pareto(List<Metrics> metrics) {
+ public Pareto(Collection<Metrics> metrics) {
+ this();
+ metrics.forEach(this::addIfPareto);
+ }
+
+ public Pareto(Stream<Metrics> metrics) {
this();
metrics.forEach(this::addIfPareto);
}
@@ -53,7 +59,7 @@ public class Pareto {
return values().stream().map(Metrics::getTtl).collect(Collectors.toSet());
}
- public Stream<Metrics> getNormalised() {
+ public Pareto getNormalised() {
double minSavedTime = values().stream().mapToDouble(Metrics::getSavedTime).min().orElseThrow();
double maxSavedTime = values().stream().mapToDouble(Metrics::getSavedTime).max().orElseThrow();
double distanceSavedTime = maxSavedTime - minSavedTime;
@@ -61,15 +67,22 @@ public class Pareto {
double maxIdleTime = values().stream().mapToDouble(Metrics::getIdleTime).max().orElseThrow();
double distanceIdleTime = maxIdleTime - minIdleTime;
- return values().stream().map(it -> {
+ Stream<Metrics> normalisedPareto = values().stream().map(it -> {
double normalisedSavedTime = (it.getSavedTime() - minSavedTime) / distanceSavedTime;
double normalisedIdleTime = (it.getIdleTime() - minIdleTime) / distanceIdleTime;
return it.getNormalised(normalisedSavedTime, normalisedIdleTime);
});
+ return new Pareto(normalisedPareto);
+ }
+
+ public Double getMinEuclideanDistance() {
+ if (minEuclideanDistance == null) getBestMetrics();
+ return minEuclideanDistance;
}
public Metrics getBestMetrics() {
if (this.bestMetrics == null) this.bestMetrics = getBestMetrics(Configuration.getPreferences().get(0), Configuration.getPreferences().get(1));
+ this.minEuclideanDistance = this.bestMetrics.calculateEuclideanDistance(Configuration.getPreferences().get(0), Configuration.getPreferences().get(1));
return this.bestMetrics;
}