memoizeittf

replaced distance by BigDecimal.

1/26/2021 3:06:37 AM

Details

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()));