/**
   * Iterate over all execution results and summarize statistics
   *
   * @param results
   * @param predicateCount
   * @param callCount
   * @param trueDistance
   * @param falseDistance
   * @return
   */
  private boolean analyzeTraces(
      AbstractTestSuiteChromosome<? extends ExecutableChromosome> suite,
      List<ExecutionResult> results,
      Map<Integer, Integer> predicateCount,
      Map<Integer, Double> trueDistance,
      Map<Integer, Double> falseDistance) {

    boolean hasTimeoutOrTestException = false;
    for (ExecutionResult result : results) {
      if (result.hasTimeout() || result.hasTestException()) {
        hasTimeoutOrTestException = true;
        continue;
      }

      for (Entry<Integer, Integer> entry :
          result.getTrace().getPredicateExecutionCount().entrySet()) {
        if (!branchesId.contains(entry.getKey())
            || (removedBranchesT.contains(entry.getKey())
                && removedBranchesF.contains(entry.getKey()))) continue;
        if (!predicateCount.containsKey(entry.getKey()))
          predicateCount.put(entry.getKey(), entry.getValue());
        else {
          predicateCount.put(entry.getKey(), predicateCount.get(entry.getKey()) + entry.getValue());
        }
      }
      for (Entry<Integer, Double> entry : result.getTrace().getTrueDistances().entrySet()) {
        if (!branchesId.contains(entry.getKey()) || removedBranchesT.contains(entry.getKey()))
          continue;
        if (!trueDistance.containsKey(entry.getKey()))
          trueDistance.put(entry.getKey(), entry.getValue());
        else {
          trueDistance.put(
              entry.getKey(), Math.min(trueDistance.get(entry.getKey()), entry.getValue()));
        }
        if ((Double.compare(entry.getValue(), 0.0) == 0)) {
          result.test.addCoveredGoal(branchCoverageTrueMap.get(entry.getKey()));
          if (Properties.TEST_ARCHIVE) {
            TestsArchive.instance.putTest(this, branchCoverageTrueMap.get(entry.getKey()), result);
            toRemoveBranchesT.add(entry.getKey());
            suite.isToBeUpdated(true);
          }
        }
      }
      for (Entry<Integer, Double> entry : result.getTrace().getFalseDistances().entrySet()) {
        if (!branchesId.contains(entry.getKey()) || removedBranchesF.contains(entry.getKey()))
          continue;
        if (!falseDistance.containsKey(entry.getKey()))
          falseDistance.put(entry.getKey(), entry.getValue());
        else {
          falseDistance.put(
              entry.getKey(), Math.min(falseDistance.get(entry.getKey()), entry.getValue()));
        }
        if ((Double.compare(entry.getValue(), 0.0) == 0)) {
          result.test.addCoveredGoal(branchCoverageFalseMap.get(entry.getKey()));
          if (Properties.TEST_ARCHIVE) {
            TestsArchive.instance.putTest(this, branchCoverageFalseMap.get(entry.getKey()), result);
            toRemoveBranchesF.add(entry.getKey());
            suite.isToBeUpdated(true);
          }
        }
      }
    }
    return hasTimeoutOrTestException;
  }