Program: 39192
Project: 39192
Buggy source:
public static <T>ArrayList<Pair<double[],double[]>> oneEval(AI ai1,AI ai2,MicroRTSInformation task,RTSFitnessFunction ff,PhysicalGameStateJFrame w){
  coevolution=ff.getCoevolution();
  gs=task.getGameState();
  PhysicalGameState pgs=task.getPhysicalGameState();
  boolean gameover=false;
  double averageUnitDifference=0;
  int maxCycles=1000 * (int)Math.ceil(Math.sqrt(pgs.getHeight()));
  ff.setMaxCycles(maxCycles);
  PlayerAction pa1;
  PlayerAction pa2;
  Unit currentUnit;
  boolean baseDeath1Recorded=false;
  boolean baseDeath2Recorded=false;
  int currentCycle=0;
  do {
    try {
      pa1=ai1.getAction(0,gs);
      gs.issueSafe(pa1);
    }
 catch (    Exception e1) {
      e1.printStackTrace();
      System.exit(1);
    }
    try {
      pa2=ai2.getAction(1,gs);
      gs.issueSafe(pa2);
    }
 catch (    Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
    if (prog) {
      currentUnit=null;
      unitDifferenceNow=0;
      base1Alive=false;
      base2Alive=false;
      for (int i=0; i < pgs.getWidth(); i++) {
        for (int j=0; j < pgs.getHeight(); j++) {
          currentUnit=pgs.getUnitAt(i,j);
          if (currentUnit != null) {
            updateUnitsAlive(currentUnit);
            updateUnitDifference(currentUnit);
            if (currentUnit.getType().name.equals("String_Node_Str"))             updateHarvestingEfficiency(currentUnit,coevolution,task);
            if (currentUnit.getType().name.equals("String_Node_Str"))             updateBaseIsAlive(currentUnit,coevolution);
          }
        }
      }
      updateUnitDeaths();
      if (!base1Alive && !baseDeath1Recorded) {
        task.setBaseUpTime(gs.getTime(),1);
        baseDeath1Recorded=true;
      }
      if (!base2Alive && !baseDeath2Recorded && coevolution) {
        task.setBaseUpTime(gs.getTime(),2);
        baseDeath2Recorded=true;
      }
      currentCycle++;
      averageUnitDifference+=(unitDifferenceNow - averageUnitDifference) / (1.0 * currentCycle);
    }
    gameover=gs.cycle();
    if (CommonConstants.watch)     w.repaint();
  }
 while (!gameover && gs.getTime() < maxCycles);
  task.setPercentEnemiesDestroyed((unitDeaths2 * 100) / uniqueAllTime2,1);
  task.setPercentEnemiesDestroyed((unitDeaths1 * 100) / uniqueAllTime1,2);
  task.setAvgUnitDiff(averageUnitDifference);
  if (CommonConstants.watch)   w.dispose();
  return ff.getFitness(gs);
}

Fixed version (ground truth):
public static <T>ArrayList<Pair<double[],double[]>> oneEval(AI ai1,AI ai2,MicroRTSInformation task,RTSFitnessFunction ff,PhysicalGameStateJFrame w){
  coevolution=ff.getCoevolution();
  gs=task.getGameState();
  PhysicalGameState pgs=task.getPhysicalGameState();
  boolean gameover=false;
  double averageUnitDifference=0;
  int maxCycles=1000 * (int)Math.ceil(Math.sqrt(pgs.getHeight()));
  ff.setMaxCycles(maxCycles);
  PlayerAction pa1;
  PlayerAction pa2;
  Unit currentUnit;
  boolean baseDeath1Recorded=false;
  boolean baseDeath2Recorded=false;
  int currentCycle=0;
  do {
    try {
      pa1=ai1.getAction(0,gs);
      gs.issueSafe(pa1);
    }
 catch (    Exception e1) {
      e1.printStackTrace();
      System.exit(1);
    }
    try {
      pa2=ai2.getAction(1,gs);
      gs.issueSafe(pa2);
    }
 catch (    Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
    if (prog) {
      currentUnit=null;
      unitDifferenceNow=0;
      base1Alive=false;
      base2Alive=false;
      for (int i=0; i < pgs.getWidth(); i++) {
        for (int j=0; j < pgs.getHeight(); j++) {
          currentUnit=pgs.getUnitAt(i,j);
          if (currentUnit != null) {
            updateUnitsAlive(currentUnit);
            updateUnitDifference(currentUnit);
            if (currentUnit.getType().name.equals("String_Node_Str"))             updateHarvestingEfficiency(currentUnit,coevolution,task);
            if (currentUnit.getType().name.equals("String_Node_Str"))             updateBaseIsAlive(currentUnit,coevolution);
          }
        }
      }
      updateUnitDeaths();
      if (!base1Alive && !baseDeath1Recorded) {
        task.setBaseUpTime(gs.getTime(),1);
        baseDeath1Recorded=true;
      }
      if (!base2Alive && !baseDeath2Recorded && coevolution) {
        task.setBaseUpTime(gs.getTime(),2);
        baseDeath2Recorded=true;
      }
      currentCycle++;
      averageUnitDifference+=(unitDifferenceNow - averageUnitDifference) / (1.0 * currentCycle);
    }
    gameover=gs.cycle();
    if (CommonConstants.watch)     w.repaint();
  }
 while (!gameover && gs.getTime() < maxCycles);
  task.setPercentEnemiesDestroyed((unitDeaths2 * 100) / uniqueAllTime2,1);
  if (coevolution)   task.setPercentEnemiesDestroyed((unitDeaths1 * 100) / uniqueAllTime1,2);
  task.setAvgUnitDiff(averageUnitDifference);
  if (CommonConstants.watch)   w.dispose();
  return ff.getFitness(gs);
}