aplcachetf

replaced distance by BigDecimal.

1/26/2021 3:08:00 AM

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/APLCache.java b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/APLCache.java
index ca6ca94..ad9c541 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/APLCache.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/APLCache.java
@@ -98,6 +98,7 @@ public class APLCache {
       } else {
         System.out.println(method.getName()
           + " Occurrences " + method.occurrences().count()
+          + " EstimatedSavedTime " + method.getEstimatedSavedTime()
           + " Inputs " + method.groupsOfOccurrences().count());
       }
     });
diff --git a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metadata/GroupOfOccurrences.java b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metadata/GroupOfOccurrences.java
index 8336b5d..83d6702 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metadata/GroupOfOccurrences.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metadata/GroupOfOccurrences.java
@@ -65,7 +65,7 @@ public class GroupOfOccurrences {
     Thresholds.HIT_RATIOS.add(getMetrics().getHitRatio());
     Thresholds.MISS_RATIOS.add(getMetrics().getMissRatio());
     Thresholds.SHAREABILITIES.add(getMetrics().getShareability());
-    Thresholds.DISTANCES.add(getMetrics().getMinEuclideanDistance());
+    Thresholds.DISTANCES.add(getMetrics().getNormalisedMinEuclideanDistance());
   }
 
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/CacheabilityMetrics.java b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/CacheabilityMetrics.java
index 9e74b48..19bf847 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/CacheabilityMetrics.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/CacheabilityMetrics.java
@@ -4,39 +4,39 @@ import br.ufrgs.inf.prosoft.aplcachetf.extension.metadata.GroupOfOccurrences;
 
 public class CacheabilityMetrics {
 
-    public static int K_STANDARD_DEVIATION = 0;
+  public static int K_STANDARD_DEVIATION = 0;
 
-    public static boolean isStaticData(GroupOfOccurrences groupOfOccurrences) {
-        if (groupOfOccurrences.getMetrics().getMinEuclideanDistance() > Thresholds.distanceThreshold(K_STANDARD_DEVIATION)) return false;
-        return groupOfOccurrences.getMetrics().getHitRatio() == 100.0;
-    }
+  public static boolean isStaticData(GroupOfOccurrences groupOfOccurrences) {
+    if (groupOfOccurrences.getMetrics().getNormalisedMinEuclideanDistance().compareTo(Thresholds.distanceThreshold(K_STANDARD_DEVIATION)) > 0) return false;
+    return groupOfOccurrences.getMetrics().getHitRatio() == 100.0;
+  }
 
-    public static boolean isNotStaticData(GroupOfOccurrences groupOfOccurrences) {
-        return !isStaticData(groupOfOccurrences);
-    }
+  public static boolean isNotStaticData(GroupOfOccurrences groupOfOccurrences) {
+    return !isStaticData(groupOfOccurrences);
+  }
 
-    public static boolean isChangeable(GroupOfOccurrences groupOfOccurrences) {
-        return groupOfOccurrences.getMetrics().getMissRatio() > Thresholds.missThreshold(K_STANDARD_DEVIATION);
-    }
+  public static boolean isChangeable(GroupOfOccurrences groupOfOccurrences) {
+    return groupOfOccurrences.getMetrics().getMissRatio() > Thresholds.missThreshold(K_STANDARD_DEVIATION);
+  }
 
-    public static boolean hasHighSavedTimeAndLowIdleTime(GroupOfOccurrences groupOfOccurrences) {
-        return groupOfOccurrences.getMetrics().getMinEuclideanDistance() <= Thresholds.distanceThreshold(K_STANDARD_DEVIATION);
-    }
+  public static boolean hasHighSavedTimeAndLowIdleTime(GroupOfOccurrences groupOfOccurrences) {
+    return groupOfOccurrences.getMetrics().getNormalisedMinEuclideanDistance().compareTo(Thresholds.distanceThreshold(K_STANDARD_DEVIATION)) <= 0;
+  }
 
-    public static boolean hasLowSavedTimeAndHighIdleTime(GroupOfOccurrences groupOfOccurrences) {
-        return !hasHighSavedTimeAndLowIdleTime(groupOfOccurrences);
-    }
+  public static boolean hasLowSavedTimeAndHighIdleTime(GroupOfOccurrences groupOfOccurrences) {
+    return !hasHighSavedTimeAndLowIdleTime(groupOfOccurrences);
+  }
 
-    public static boolean isUserSpecific(GroupOfOccurrences groupOfOccurrences) {
-        if (groupOfOccurrences.getMetrics().getShareableReuses() == 0) return false;
-        return groupOfOccurrences.getMetrics().getShareability() < Thresholds.shareabilityThreshold(K_STANDARD_DEVIATION);
-    }
+  public static boolean isUserSpecific(GroupOfOccurrences groupOfOccurrences) {
+    if (groupOfOccurrences.getMetrics().getShareableReuses() == 0) return false;
+    return groupOfOccurrences.getMetrics().getShareability() < Thresholds.shareabilityThreshold(K_STANDARD_DEVIATION);
+  }
 
-    public static boolean isExpensive(GroupOfOccurrences groupOfOccurrences) {
-        return groupOfOccurrences.getMetrics().getAverageReusableExecutionTime() >= Thresholds.expensivenessThreshold(K_STANDARD_DEVIATION);
-    }
+  public static boolean isExpensive(GroupOfOccurrences groupOfOccurrences) {
+    return groupOfOccurrences.getMetrics().getAverageReusableExecutionTime() >= Thresholds.expensivenessThreshold(K_STANDARD_DEVIATION);
+  }
 
-    public static boolean isCheap(GroupOfOccurrences groupOfOccurrences) {
-        return !isExpensive(groupOfOccurrences);
-    }
+  public static boolean isCheap(GroupOfOccurrences groupOfOccurrences) {
+    return !isExpensive(groupOfOccurrences);
+  }
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Metrics.java b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Metrics.java
index fd25e16..bcc77c9 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Metrics.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Metrics.java
@@ -16,7 +16,7 @@ public class Metrics {
   private long reuses;
   private long shareableReuses;
   private long reusableExecutionTime;
-  private Double minEuclideanDistance;
+  private BigDecimal normalisedMinEuclideanDistance;
 
   public Metrics() {
     users = new HashSet<>();
@@ -52,9 +52,9 @@ public class Metrics {
     return getPareto().getBestMetrics().getSavedTime();
   }
 
-  public double getMinEuclideanDistance() {
-    if (minEuclideanDistance == null) minEuclideanDistance = getPareto().getNormalised().getMinEuclideanDistance();
-    return minEuclideanDistance;
+  public BigDecimal getNormalisedMinEuclideanDistance() {
+    if (normalisedMinEuclideanDistance == null) normalisedMinEuclideanDistance = getPareto().getNormalisedMinEuclideanDistance();
+    return normalisedMinEuclideanDistance;
   }
 
   public long getReusableExecutionTime() {
diff --git a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Thresholds.java b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Thresholds.java
index d5e7e6f..ba8dfa8 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Thresholds.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/aplcachetf/extension/metrics/Thresholds.java
@@ -1,19 +1,20 @@
 package br.ufrgs.inf.prosoft.aplcachetf.extension.metrics;
 
 import java.math.BigDecimal;
+import java.math.MathContext;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 
 public class Thresholds {
 
-  public static final List<Double> DISTANCES = new ArrayList<>();
+  public static final List<BigDecimal> DISTANCES = new ArrayList<>();
   public static final List<Double> HIT_RATIOS = new ArrayList<>();
   public static final List<Double> MISS_RATIOS = new ArrayList<>();
   public static final List<Long> EXECUTION_TIMES = new ArrayList<>();
   public static final List<Double> SHAREABILITIES = new ArrayList<>();
   public static long population;
-  private static Double stdDevDistance;
+  private static BigDecimal stdDevDistance;
   private static Double stdDevHitRatio;
   private static Double stdDevMissRatio;
   private static Double stdDevExecutionTime;
@@ -39,25 +40,25 @@ public class Thresholds {
     Thresholds.stdDevShareability = null;
   }
 
-  public static double getAverageDistance() {
-    if (DISTANCES.isEmpty()) return 0D;
-    return DISTANCES.stream().reduce(Double::sum).orElse(0D) / DISTANCES.size();
+  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))));
   }