private void FCBFElimination(double[][]rankedFeatures)
  throws Exception {

    int i,j;

    m_rankedFCBF = new double[m_attributeList.length][4];
    int[] attributes = new int[1];
    int[] classAtrributes = new int[1];

    int numSelectedAttributes = 0;

    int startPoint = 0;
    double tempSUIJ = 0;

    AttributeSetEvaluator ASEvaluator = (AttributeSetEvaluator)m_asEval;

    for (i = 0; i < rankedFeatures.length; i++) {
      m_rankedFCBF[i][0] = rankedFeatures[i][0];
      m_rankedFCBF[i][1] = rankedFeatures[i][1];
      m_rankedFCBF[i][2] = -1;
    }

    while (startPoint < rankedFeatures.length)
    {
      if (m_rankedFCBF[startPoint][2] != -1)
      {
        startPoint++;
        continue;
      }

      m_rankedFCBF[startPoint][2] = m_rankedFCBF[startPoint][0];
      numSelectedAttributes++;

      for (i = startPoint + 1; i < m_attributeList.length; i++)
      {
        if (m_rankedFCBF[i][2] != -1)
        {
          continue;
        }
        attributes[0] = (int) m_rankedFCBF[startPoint][0];
        classAtrributes[0] = (int) m_rankedFCBF[i][0];
        tempSUIJ = ASEvaluator.evaluateAttribute(attributes, classAtrributes);
        if (m_rankedFCBF[i][1] < tempSUIJ || Math.abs(tempSUIJ-m_rankedFCBF[i][1])<1E-8)
        {
          m_rankedFCBF[i][2] = m_rankedFCBF[startPoint][0];
          m_rankedFCBF[i][3] = tempSUIJ;
        }
      }
      startPoint++;
    }

    m_selectedFeatures = new double[numSelectedAttributes][2];

    for (i = 0, j = 0; i < m_attributeList.length; i++)
    {
      if (m_rankedFCBF[i][2] == m_rankedFCBF[i][0])
      {
        m_selectedFeatures[j][0] = m_rankedFCBF[i][0];
        m_selectedFeatures[j][1] = m_rankedFCBF[i][1];
        j++;
      }
    }
  }