docs: @Override
    public int filter(double[] eigenValues) {
      // determine sum of eigenvalues
      double totalSum = 0;
      for(int i = 0; i < eigenValues.length; i++) {
        totalSum += eigenValues[i];
      }
      double expectedVariance = totalSum / eigenValues.length * walpha;
  
      // determine strong and weak eigenpairs
      double currSum = 0;
      for(int i = 0; i < eigenValues.length - 1; i++) {
        // weak Eigenvector?
        if(eigenValues[i] < expectedVariance) {
          break;
        }
        currSum += eigenValues[i];
        // calculate progressive alpha level
        double alpha = 1.0 - (1.0 - palpha) * (1.0 - (i + 1) / (double) eigenValues.length);
        if(currSum / totalSum >= alpha) {
          return i + 1;
        }
      }
  
      // the code using this method doesn't expect an empty strong set,
      // if we didn't find any strong ones, we make all vectors strong
      return eigenValues.length;
    }