public void doit() throws Exception {
    PredictionModelModule pmm = (PredictionModelModule) pullInput(0);
    Table t = (Table) pullInput(1);

    PredictionTable pt = pmm.predict(t);
    int[] outputs = pt.getOutputFeatures();
    int[] preds = pt.getPredictionSet();

    int numRows = pt.getNumRows();

    String[] names = new String[preds.length];
    double[] errors = new double[preds.length];
    for (int i = 0; i < preds.length; i++) {
      int numCorrect = 0;
      for (int j = 0; j < numRows; j++) {
        String orig = pt.getString(j, outputs[i]);
        String pred = pt.getString(j, preds[i]);
        if (orig.equals(pred)) numCorrect++;
      }

      names[i] = pt.getColumnLabel(preds[i]);
      errors[i] = 1 - ((double) numCorrect) / ((double) numRows);
    }

    ParameterPoint pp = ParameterPointImpl.getParameterPoint(names, errors);
    pushOutput(pp, 0);
  }
  /**
   * 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;
  }