/** calculates statstics and output for results on a given test sequence */
  public void calcResultIncrement(TrainingSequence training, int[] predictedHiddenSequence) {
    labeled.add(
        new TrainingSequence(
            training.getInputSequence(),
            predictedHiddenSequence)); // This is only place that labelled gets added to???
    // So I guess the results just get built up incrementally, both the actuall hidden sequences and
    // the stats?
    Assert.a(training.length() == predictedHiddenSequence.length);
    int[] actualHiddenSequence = new int[training.length()];
    for (int i = 0; i < training.length(); i++) {
      actualHiddenSequence[i] = training.getY(i);
    }
    boolean thisperfect = true;
    for (int i = 0; i < predictedHiddenSequence.length; ++i) {
      int predY = predictedHiddenSequence[i];
      int realY = actualHiddenSequence[i];

      if (realY == predY) {
        correct += 1;
      } else {
        incorrect += 1;
        thisperfect = false;
      }

      ctCodingNucleotide.increment(isCodingPlus(predY), isCodingPlus(realY));
      ctCodingNucleotide.increment(isCodingMinus(predY), isCodingMinus(realY));

      for (int s = 0; s < nStates; s++) {
        ctStates.get(s).increment((predY == s), (realY == s));
      }
    }
    if (thisperfect) {
      perfect++;
    } else {
      imperfect++;
    }
    for (int i = 1; i < predictedHiddenSequence.length; ++i) {
      int predY = predictedHiddenSequence[i];
      int realY = actualHiddenSequence[i];
      int predYp = predictedHiddenSequence[i - 1];
      int realYp = actualHiddenSequence[i - 1];

      for (int t = 0; t < nTransitions; t++) {
        boolean bPred = ((predYp == fromInd.get(t)) && (predY == toInd.get(t)));
        boolean bReal = ((realYp == fromInd.get(t)) && (realY == toInd.get(t)));
        ctTransitions.get(t).increment(bPred, bReal);
      }
    }

    // Now let's increment the contingency table for exons; note that here not counting TN's
    RangeMap predExonsPlus = new RangeMap();
    RangeMap predExonsMinus = new RangeMap();
    RangeMap realExonsPlus = new RangeMap();
    RangeMap realExonsMinus = new RangeMap();
    makeExonRangeMapFrom13SV(predictedHiddenSequence, predExonsPlus, predExonsMinus);
    makeExonRangeMapFrom13SV(actualHiddenSequence, realExonsPlus, realExonsMinus);
    incrementCTFromRangeMaps(ctExons, predExonsPlus, realExonsPlus);
    incrementCTFromRangeMaps(ctExons, predExonsMinus, realExonsMinus);
  }