Program: 144104
Project: 144104
Buggy source:
private void sampleZAndBurnWithCollapsedErrorRates(int iterationNumber){
  for (int p=0; p < numberOfDomains; p++) {
    for (int j=0; j < numberOfFunctions; j++) {
      disagreements[j][p]=0;
      for (int i=0; i < numberOfDataSamples[p]; i++)       if (functionOutputsArray[j][p][i] != labelsSamples[iterationNumber][p][i])       disagreements[j][p]++;
    }
  }
  for (int j=0; j < numberOfFunctions; j++) {
    for (int k=0; k < numberOfDomains; k++) {
      sum_2[j][k]=0;
      for (int p=0; p < numberOfDomains; p++) {
        if (zSamples[iterationNumber][p] == k)         sum_2[j][k]+=disagreements[j][p];
      }
    }
  }
  for (int p=0; p < numberOfDomains; p++) {
    dp.remove_topic_assignment(zSamples[iterationNumber][p]);
    int total_cnt=dp.prob_topics();
    double z_probabilities[]=new double[total_cnt];
    for (int i=0; i < total_cnt; i++) {
      z_probabilities[i]=Math.log(dp.pdf[i].prob);
    }
    int previous_topic=zSamples[iterationNumber][p];
    for (int j=0; j < numberOfFunctions; j++) {
      for (int i=0; i < total_cnt - 1; i++) {
        if (previous_topic == dp.pdf[i].topic) {
          sum_1[j][previous_topic]-=numberOfDataSamples[p];
          sum_2[j][previous_topic]-=disagreements[j][p];
        }
        int k=dp.pdf[i].topic;
        double alpha=alpha_e + sum_2[j][k] + disagreements[j][p];
        double beta=beta_e + sum_1[j][k] + numberOfDataSamples[p] - disagreements[j][p];
        z_probabilities[i]+=logBeta(alpha,beta) - logBeta(alpha_e + sum_2[j][k],beta_e + sum_1[j][k] - sum_2[j][k]);
      }
      z_probabilities[total_cnt - 1]+=logBeta(alpha_e + disagreements[j][p],beta_e + numberOfDataSamples[p] - disagreements[j][p]) - logBeta(alpha_e,beta_e);
    }
    for (int i=1; i < total_cnt; i++) {
      z_probabilities[i]=MatrixUtilities.computeLogSumExp(z_probabilities[i - 1],z_probabilities[i]);
    }
    double uniform=Math.log(random.nextDouble()) + z_probabilities[total_cnt - 1];
    zSamples[iterationNumber][p]=dp.pdf[total_cnt - 1].topic;
    for (int i=0; i < total_cnt - 1; i++) {
      if (z_probabilities[i] > uniform) {
        zSamples[iterationNumber][p]=dp.pdf[i].topic;
        for (int j=0; j < numberOfFunctions; j++) {
          sum_1[j][dp.pdf[i].topic]+=numberOfDataSamples[p];
          sum_2[j][dp.pdf[i].topic]+=disagreements[j][p];
        }
        dp.add_topic_assingment(dp.pdf[i].topic);
        break;
      }
    }
    if (zSamples[iterationNumber][p] == dp.pdf[total_cnt - 1].topic) {
      for (int j=0; j < numberOfFunctions; j++) {
        sum_1[j][dp.pdf[total_cnt - 1].topic]+=numberOfDataSamples[p];
        sum_2[j][dp.pdf[total_cnt - 1].topic]+=disagreements[j][p];
      }
      dp.add_topic_assingment(dp.pdf[total_cnt - 1].topic);
    }
  }
}

Fixed version (ground truth):
private void sampleZAndBurnWithCollapsedErrorRates(int iterationNumber){
  for (int p=0; p < numberOfDomains; p++) {
    for (int j=0; j < numberOfFunctions; j++) {
      disagreements[j][p]=0;
      for (int i=0; i < numberOfDataSamples[p]; i++)       if (functionOutputsArray[j][p][i] != labelsSamples[iterationNumber][p][i])       disagreements[j][p]++;
    }
  }
  for (int j=0; j < numberOfFunctions; j++) {
    for (int k=0; k < numberOfDomains; k++) {
      sum_2[j][k]=0;
      for (int p=0; p < numberOfDomains; p++)       if (zSamples[iterationNumber][p] == k)       sum_2[j][k]+=disagreements[j][p];
    }
  }
  for (int p=0; p < numberOfDomains; p++) {
    dp.remove_topic_assignment(zSamples[iterationNumber][p]);
    int total_cnt=dp.prob_topics();
    double z_probabilities[]=new double[total_cnt];
    for (int i=0; i < total_cnt; i++)     z_probabilities[i]=Math.log(dp.pdf[i].prob);
    for (int j=0; j < numberOfFunctions; j++) {
      sum_1[j][zSamples[iterationNumber][p]]-=numberOfDataSamples[p];
      sum_2[j][zSamples[iterationNumber][p]]-=disagreements[j][p];
      for (int i=0; i < total_cnt - 1; i++) {
        z_probabilities[i]+=logBeta(alpha_e + sum_2[j][dp.pdf[i].topic] + disagreements[j][p],beta_e + sum_1[j][dp.pdf[i].topic] - sum_2[j][dp.pdf[i].topic] + numberOfDataSamples[p] - disagreements[j][p]) - logBeta(alpha_e + sum_2[j][dp.pdf[i].topic],beta_e + sum_1[j][dp.pdf[i].topic] - sum_2[j][dp.pdf[i].topic]);
      }
      z_probabilities[total_cnt - 1]+=logBeta(alpha_e + disagreements[j][p],beta_e + numberOfDataSamples[p] - disagreements[j][p]) - logBeta(alpha_e,beta_e);
    }
    for (int i=1; i < total_cnt; i++)     z_probabilities[i]=MatrixUtilities.computeLogSumExp(z_probabilities[i - 1],z_probabilities[i]);
    double uniform=Math.log(random.nextDouble()) + z_probabilities[total_cnt - 1];
    zSamples[iterationNumber][p]=dp.pdf[total_cnt - 1].topic;
    for (int i=0; i < total_cnt - 1; i++) {
      if (z_probabilities[i] > uniform) {
        zSamples[iterationNumber][p]=dp.pdf[i].topic;
        for (int j=0; j < numberOfFunctions; j++) {
          sum_1[j][dp.pdf[i].topic]+=numberOfDataSamples[p];
          sum_2[j][dp.pdf[i].topic]+=disagreements[j][p];
        }
        dp.add_topic_assingment(dp.pdf[i].topic);
        break;
      }
    }
    if (zSamples[iterationNumber][p] == dp.pdf[total_cnt - 1].topic) {
      for (int j=0; j < numberOfFunctions; j++) {
        sum_1[j][dp.pdf[total_cnt - 1].topic]+=numberOfDataSamples[p];
        sum_2[j][dp.pdf[total_cnt - 1].topic]+=disagreements[j][p];
      }
      dp.add_topic_assingment(dp.pdf[total_cnt - 1].topic);
    }
  }
}