/**
   * calculates one over residual score. works pretty much the same as a stand root-mean-squared
   * error metric for a single output, but weights those points that are closer to the origin (in
   * the input space) higher. Assumes only one input.
   */
  public double calcRSquared(PredictionTable pt) {
    // the diff between the first output and prediction for
    // each example
    double[] errors;
    // the distance from the original in the input space for
    // each example
    double[] distances;

    int i, j;
    double pred, actual;
    int input = pt.getInputFeatures()[0];
    int output = pt.getOutputFeatures()[0];

    int numRows = pt.getNumRows();
    errors = new double[numRows];
    distances = new double[numRows];
    // System.out.println("\n\n");
    for (i = 0; i < numRows; i++) {
      actual = pt.getDouble(i, output);
      pred = pt.getDoublePrediction(i, 0);
      errors[i] = actual - pred;

      // System.out.println("bin:" + i +
      //		"actual:"+actual+" pred:"+pred+"error:"+errors[i]);

      distances[i] = pt.getDouble(i, input);
    }
    // System.out.println("\n");

    double weight;
    double r2 = 0;
    ;
    for (i = 0; i < numRows; i++) {
      weight = calcWeight(distances[i]);
      //	System.out.println("dist:"+distances[i] + " weight:" + weight);
      r2 += weight * errors[i] * errors[i];
      //	System.out.println("errors:"+errors[i] + " r2 tally:" + r2);
      //	System.out.println();
    }
    return r2;
  }