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