m_Evaluation = null;
  public double evaluateSubset (BitSet subset)    throws Exception {    int i,j;    double errorRate = 0;    int numAttributes = 0;    Instances trainCopy=null;    Instances testCopy=null;    Remove delTransform = new Remove();    delTransform.setInvertSelection(true);    // copy the training instances    trainCopy = new Instances(m_trainingInstances);        if (!m_useTraining) {      if (m_holdOutInstances == null) {	throw new Exception("Must specify a set of hold out/test instances "			    +"with -H");      }       // copy the test instances      testCopy = new Instances(m_holdOutInstances);    }        // count attributes set in the BitSet    for (i = 0; i < m_numAttribs; i++) {      if (subset.get(i)) {        numAttributes++;      }    }        // set up an array of attribute indexes for the filter (+1 for the class)    int[] featArray = new int[numAttributes + 1];        for (i = 0, j = 0; i < m_numAttribs; i++) {      if (subset.get(i)) {        featArray[j++] = i;      }    }        featArray[j] = m_classIndex;    delTransform.setAttributeIndicesArray(featArray);    delTransform.setInputFormat(trainCopy);    trainCopy = Filter.useFilter(trainCopy, delTransform);    if (!m_useTraining) {      testCopy = Filter.useFilter(testCopy, delTransform);    }    // build the classifier    m_Classifier.buildClassifier(trainCopy);    m_Evaluation = new Evaluation(trainCopy);    if (!m_useTraining) {      m_Evaluation.evaluateModel(m_Classifier, testCopy);    } else {      m_Evaluation.evaluateModel(m_Classifier, trainCopy);    }    if (m_trainingInstances.classAttribute().isNominal()) {      errorRate = m_Evaluation.errorRate();    } else {      errorRate = m_Evaluation.meanAbsoluteError();    }    // return the negative of the error rate as search methods  need to    // maximize something    return -errorRate;  }