m_hasClass = true;
  public int[] search (ASEvaluation ASEval, Instances data)    throws Exception {    int i, j;    if (!(ASEval instanceof AttributeEvaluator)) {      throw  new Exception(ASEval.getClass().getName() 			   + " is not a" 			   + "Attribute evaluator!");    }        if (ASEval instanceof AttributeTransformer) {      data = ((AttributeTransformer)ASEval).transformedHeader();    }    m_numAttribs = data.numAttributes();    if (ASEval instanceof UnsupervisedAttributeEvaluator) {      m_hasClass = false;    }    else {      m_hasClass = true;      m_classIndex = data.classIndex();    }    m_startRange.setUpper(m_numAttribs - 1);    if (!(getStartSet().equals(""))) {      m_starting = m_startRange.getSelection();    }        int sl=0;    if (m_starting != null) {      sl = m_starting.length;    }    if ((m_starting != null) && (m_hasClass == true)) {      // see if the supplied list contains the class index      boolean ok = false;      for (i = 0; i < sl; i++) {	if (m_starting[i] == m_classIndex) {	  ok = true;	  break;	}      }            if (ok == false) {	sl++;      }    }    else {      if (m_hasClass == true) {	sl++;      }    }    m_attributeList = new int[m_numAttribs - sl];    m_attributeMerit = new double[m_numAttribs - sl];    // add in those attributes not in the starting (omit list)    for (i = 0, j = 0; i < m_numAttribs; i++) {      if (!inStarting(i)) {	m_attributeList[j++] = i;      }    }    AttributeEvaluator ASEvaluator = (AttributeEvaluator)ASEval;    for (i = 0; i < m_attributeList.length; i++) {      m_attributeMerit[i] = ASEvaluator.evaluateAttribute(m_attributeList[i]);    }    double[][] tempRanked = rankedAttributes();    int[] rankedAttributes = new int[m_attributeList.length];    for (i = 0; i < m_attributeList.length; i++) {      rankedAttributes[i] = (int)tempRanked[i][0];    }    return  rankedAttributes;  }