package edu.usc.enl.dynamicmeasurement.metric.hhh; import edu.usc.enl.dynamicmeasurement.model.WildcardPattern; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created with IntelliJ IDEA. * User: masoud * Date: 2/28/13 * Time: 7:37 AM */ public class AncestorError extends HHHMetric implements NeedGroundTruthFolder { private List<Double> sums; private final boolean relative; private int step = 0; public AncestorError(boolean relative) { this.relative = relative; } public void reset() { step = 0; } public Double compute(List<WildcardPattern> hhh, List<WildcardPattern> reportedHHH, int step, String folder) { if (hhh.size() == 0) { return 1d; } Map<WildcardPattern, WildcardPattern> reported = new HashMap<>(); for (WildcardPattern wildcardPattern : reportedHHH) { reported.put(wildcardPattern, wildcardPattern); } double score = 0; double hhhSum = -1; double notHHHSum = 0; for (WildcardPattern wildcardPattern : hhh) { wildcardPattern = wildcardPattern.clone(); do { if (reportedHHH.contains(wildcardPattern)) { score += Math.abs(wildcardPattern.getWeight() - reported.get(wildcardPattern).getWeight()); if (relative) { score /= sums.get(step); //wildcardPattern.getWeight(); } break; } if (wildcardPattern.canGoUp()) { wildcardPattern = wildcardPattern.goUp(); } else { //ancestor not found if (hhhSum < 0) { //first compute hhh sum hhhSum = computeHHHSum(reportedHHH); notHHHSum = Math.max(0d, sums.get(this.step) - hhhSum); } score += Math.abs(wildcardPattern.getWeight() - notHHHSum); if (relative) { score /= score /= sums.get(step); //wildcardPattern.getWeight(); } } } while (wildcardPattern.canGoUp()); } this.step++; return 1.0 * score / hhh.size(); } private double computeHHHSum(List<WildcardPattern> reportedHHH) { double sum = 0; for (WildcardPattern wildcardPattern : reportedHHH) { sum += wildcardPattern.getWeight(); } return sum; } @Override public String toString() { return "AncestorError"; } @Override public void setGroundTruthFolder(String sumsFile) { sums = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(sumsFile + "/sums.csv"))) { while (br.ready()) { sums.add(Double.parseDouble(br.readLine().split(",")[1])); } } catch (IOException e) { e.printStackTrace(); } } }