private void calculatePartialFitness() {

    ProcessInstance pi = null;
    int numSimilarPIs = 0;
    int numMissingTokens = 0;
    int numExtraTokensLeftBehind = 0;

    Iterator logReaderInstanceIterator = logReader.instanceIterator();
    while (logReaderInstanceIterator.hasNext()) {
      pi = (ProcessInstance) logReaderInstanceIterator.next();
      numSimilarPIs = MethodsForWorkflowLogDataStructures.getNumberSimilarProcessInstances(pi);
      for (int i = 0; i < population.length; i++) {
        if (mapping.getMap(i) < 0) { // we need to compute the partial
          // fitness
          parser[i].parse(pi);
          // partial assignment to variables
          numMissingTokens = parser[i].getNumMissingTokens();
          if (numMissingTokens > 0) {
            this.numPIsWithMissingTokens[i] += numSimilarPIs;
            this.numMissingTokens[i] += (numMissingTokens * numSimilarPIs);
          }

          numExtraTokensLeftBehind = parser[i].getNumExtraTokensLeftBehind();
          if (numExtraTokensLeftBehind > 0) {
            this.numPIsWithExtraTokensLeftBehind[i] += numSimilarPIs;
            this.numExtraTokensLeftBehind[i] += (numExtraTokensLeftBehind * numSimilarPIs);
          }
          numParsedWMEs[i] += (parser[i].getNumParsedElements() * numSimilarPIs);
          numEnabledWMEs[i] += (parser[i].getNumTotalEnabledElements() * numSimilarPIs);
        }
      }
    }
  }
 private void createParser() {
   // creating a parser for every individual
   parser = new ExtraBehaviorParser[population.length];
   for (int i = 0; i < parser.length; i++) {
     if (mapping.getMap(i) < 0) {
       parser[i] = new ExtraBehaviorParser(population[i], generator);
     }
   }
 }
  private HeuristicsNet[] assignFitness() {

    double fitness = 0;
    double f1 = 0;
    double f2 = 0;
    double f3 = 0;

    double numATEsAtLog = 0;
    double numPIsAtLog = 0;
    double missingTokensDenominator = 0.001;
    double unusedTokensDenominator = 0.001;
    double maxEnabledWMEs = Double.MIN_VALUE;
    int indexIdenticalIndividual = 0;

    numATEsAtLog = logReader.getLogSummary().getNumberOfAuditTrailEntries();
    numPIsAtLog = logReader.getLogSummary().getNumberOfProcessInstances();
    maxEnabledWMEs = getMaxValue(numEnabledWMEs);

    for (int i = 0; i < population.length; i++) {

      indexIdenticalIndividual = mapping.getMap(i);

      if (indexIdenticalIndividual < 0) {

        missingTokensDenominator = numPIsAtLog - numPIsWithMissingTokens[i] + 1;

        unusedTokensDenominator = numPIsAtLog - numPIsWithExtraTokensLeftBehind[i] + 1;

        f1 =
            (numParsedWMEs[i]
                    - ((numMissingTokens[i] / missingTokensDenominator)
                        + (numExtraTokensLeftBehind[i] / unusedTokensDenominator)))
                / numATEsAtLog;

        f2 = numEnabledWMEs[i];

        f2 /= maxEnabledWMEs; // normalizing...

        if (maximumNumberIntersectingElements > 0) {
          f3 =
              (numIntersectingDuplicatesPerInputElement[i]
                      + numIntersectingDuplicatesPerOutputElement[i])
                  / maximumNumberIntersectingElements;
        } else {
          f3 = 0.0;
        }

        // f3 = (numIntersectingDuplicatesPerInputElement[i] +
        // numIntersectingDuplicatesPerOutputElement[i]) / (2 *
        // (Math.pow(population[i].size(),
        // 2) - population[i].size()));

        fitness = f1 - kappa * f2 - gamma * f3;
        // final double k = 1.0/3.0;
        // fitness = k*f1 + (k - (k*f2)) + (k - (k*f3));

        population[i].setFitness(fitness);

      } else {

        population[i].setFitness(population[indexIdenticalIndividual].getFitness());
        population[i].setDuplicatesActualFiring(
            population[indexIdenticalIndividual].getDuplicatesActualFiring());
        population[i].setArcUsage(population[indexIdenticalIndividual].getArcUsage());
      }
    }

    return population;
  }