diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java
index 170fa69..f7acb1a 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/adapter/Thresholds.java
@@ -1,14 +1,16 @@
package br.ufrgs.inf.prosoft.memoizeittf.adapter;
+import java.math.BigDecimal;
+import java.math.MathContext;
import java.util.ArrayList;
import java.util.List;
public class Thresholds {
- private static final List<Double> DISTANCES = new ArrayList<>();
+ private static final List<BigDecimal> DISTANCES = new ArrayList<>();
public static long population;
- private static Double averageDistance;
- private static Double stdDevDistance;
+ private static BigDecimal averageDistance;
+ private static BigDecimal stdDevDistance;
public static void reset() {
Thresholds.DISTANCES.clear();
@@ -16,37 +18,35 @@ public class Thresholds {
Thresholds.stdDevDistance = null;
}
- public static void addDistance(Double distance) {
+ public static void addDistance(BigDecimal distance) {
DISTANCES.add(distance);
Thresholds.averageDistance = null;
Thresholds.stdDevDistance = null;
}
- public static double getAverageDistance() {
- if (DISTANCES.isEmpty()) return 0D;
- if (averageDistance == null) averageDistance = DISTANCES.stream().reduce(Double::sum).orElse(0D) / DISTANCES.size();
- return averageDistance;
+ public static BigDecimal getAverageDistance() {
+ if (DISTANCES.isEmpty()) return BigDecimal.ZERO;
+ return DISTANCES.stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).divide(BigDecimal.valueOf(DISTANCES.size()), MathContext.DECIMAL128);
}
- public static double getStdDevDistance() {
- if (population == 0) return 0;
+ public static BigDecimal getStdDevDistance() {
+ if (population == 0) return BigDecimal.ZERO;
if (stdDevDistance != null) return stdDevDistance;
-
- double mean = getAverageDistance();
- double temp = DISTANCES.stream()
- .map(difference -> (difference - mean) * (difference - mean))
- .reduce(Double::sum)
- .orElse(0D);
- stdDevDistance = Math.sqrt(temp / population);
+ BigDecimal mean = getAverageDistance();
+ BigDecimal temp = DISTANCES.stream()
+ .map(difference -> difference.subtract(mean).multiply(difference.subtract(mean)))
+ .reduce(BigDecimal::add)
+ .orElse(BigDecimal.ZERO);
+ stdDevDistance = temp.divide(BigDecimal.valueOf(population), MathContext.DECIMAL128).sqrt(MathContext.DECIMAL128);
return stdDevDistance;
}
- public static double distanceThreshold(int kStdDev) {
- return getAverageDistance() - (kStdDev * getStdDevDistance());
+ public static BigDecimal distanceThreshold(int kStdDev) {
+ return getAverageDistance().subtract((getStdDevDistance().multiply(BigDecimal.valueOf(kStdDev))));
}
- public static double distanceThreshold() {
- return 0.5;
+ public static BigDecimal distanceThreshold() {
+ return BigDecimal.valueOf(0.5);
}
}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java
index d6a09e6..51ac48e 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/memoizeittf/MemoizeItTF.java
@@ -47,7 +47,7 @@ public class MemoizeItTF extends MemoizeIt {
tfCacheMethods.removeIf(method -> method.getBestMetrics().getSavedTime() == 0);
LOGGER.info(MessageFormat.format("Removing methods according to the Threshold from {0}", tfCacheMethods.size()));
- tfCacheMethods.removeIf(method -> method.getMinEuclideanDistance() > Thresholds.distanceThreshold());
+ tfCacheMethods.removeIf(method -> method.getNormalisedMinEuclideanDistance().compareTo(Thresholds.distanceThreshold()) > 0);
LOGGER.info(MessageFormat.format("Ranking {0} methods according saved time", tfCacheMethods.size()));
tfCacheMethods.sort((method1, method2) -> Double.compare(method2.getEstimatedSavedTime(), method1.getEstimatedSavedTime()));