@Override public double[] fitness(Node individual) { DataSet dataSetView = this.context.getCurrentDataSet(); TreeEvaluator evaluator = context.getConfiguration().getEvaluator(); double[] fitness = new double[3]; double fitnessLenght; List<Bounds[]> evaluate; try { evaluate = evaluator.evaluate(individual, context); StringBuilder builder = new StringBuilder(); individual.describe(builder); fitnessLenght = builder.length(); } catch (TreeEvaluationException ex) { Logger.getLogger(CharmaskMatchLengthObjective.class.getName()).log(Level.SEVERE, null, ex); Arrays.fill(fitness, Double.POSITIVE_INFINITY); return fitness; } //Calculates the true positive and false positive matches: //match stats makes sense only for tp e fp values... we cannot use instance statistic formulas other than precision BasicStats statsOverall = new BasicStats(); //char stats can be managed as ususal BasicStats statsCharsOverall = new BasicStats(); int i = 0; for (Bounds[] result : evaluate) { BasicStats stats = new BasicStats(); BasicStats statsChars = new BasicStats(); //Characted extracted in the right place (match) Example example = dataSetView.getExample(i); List<Bounds> expectedMatchMask = example.getMatch(); List<Bounds> expectedUnmatchMask = example.getUnmatch(); List<Bounds> annotatedMask = new FastList(expectedMatchMask); annotatedMask.addAll(expectedUnmatchMask); stats.tp = countIdenticalRanges(result, expectedMatchMask); stats.fp = Bounds.countRangesThatCollideZone(result, annotatedMask) - stats.tp; statsChars.tp = intersection(result, expectedMatchMask); statsChars.fp = intersection(result, expectedUnmatchMask); statsOverall.add(stats); statsCharsOverall.add(statsChars); i++; } statsCharsOverall.tn = dataSetView.getNumberUnmatchedChars() - statsCharsOverall.fp; statsCharsOverall.fn = dataSetView.getNumberMatchedChars() - statsCharsOverall.tp; fitness[0] = (statsCharsOverall.fpr() + statsCharsOverall.fnr()) * 100.0; fitness[1] = Math.abs(statsOverall.fp + statsOverall.tp - dataSetView.getNumberMatches()); // ABS((TP+FP) - (TP+FN)) alias ABS(Number_Extractions - Number_Matches)) fitness[2] = fitnessLenght; return fitness; }
@Override public TreeEvaluator getTreeEvaluator() { return context.getConfiguration().getEvaluator(); }