Program: 81567
Project: 81567
Buggy source:
@Override protected BufferedDataTable[] execute(BufferedDataTable[] inData,ExecutionContext exec) throws Exception {
  BufferedDataTable input=inData[0];
  DataTableSpec inputSpec=input.getDataTableSpec();
  List<Attribute> parameter=new ArrayList<Attribute>();
  for (  String item : parameterNames.getIncludeList()) {
    Attribute attribute=new InputTableAttribute(item,input);
    if (attribute.getType().equals(DoubleCell.TYPE)) {
      parameter.add(attribute);
    }
 else {
      logger.warn("String_Node_Str" + attribute.getName() + "String_Node_Str");
    }
  }
  Attribute groupingAttribute=new InputTableAttribute(this.groupingColumn.getStringValue(),input);
  Map<Object,List<DataRow>> subsets=AttributeUtils.splitRowsGeneric(input,groupingAttribute);
  BufferedDataContainer keepContainer=exec.createDataContainer(inputSpec);
  BufferedDataContainer discartContainer=exec.createDataContainer(inputSpec);
  int S=subsets.size();
  int s=1;
  for (  Object key : subsets.keySet()) {
    List<DataRow> rowSubset=subsets.get(key);
    RealMatrix data=extractMatrix(rowSubset,parameter);
    int N=data.getColumnDimension();
    int M=data.getRowDimension();
    if (M == 0) {
      logger.warn("String_Node_Str" + key + "String_Node_Str");
    }
 else {
      double[] lowerBound=new double[N];
      double[] upperBound=new double[N];
      if (method.getStringValue().equals("String_Node_Str")) {
        for (int c=0; c < N; ++c) {
          RealVector vect=data.getColumnVector(c);
          DescriptiveStatistics stats=new DescriptiveStatistics();
          for (          double value : vect.getData()) {
            stats.addValue(value);
          }
          double lowerQuantile=stats.getPercentile(25);
          double upperQuantile=stats.getPercentile(85);
          double whisker=factor.getDoubleValue() * Math.abs(lowerQuantile - upperQuantile);
          lowerBound[c]=lowerQuantile - whisker;
          upperBound[c]=upperQuantile + whisker;
        }
      }
 else {
        for (int c=0; c < N; ++c) {
          RealVector vect=data.getColumnVector(c);
          double mean=StatUtils.mean(vect.getData());
          double sd=Math.sqrt(StatUtils.variance(vect.getData()));
          lowerBound[c]=mean - factor.getDoubleValue() * sd;
          upperBound[c]=mean + factor.getDoubleValue() * sd;
        }
      }
      if (rule.getBooleanValue()) {
        for (        DataRow row : rowSubset) {
          int c=0;
          for (          Attribute column : parameter) {
            Double value=(Double)column.getValue(row);
            if ((value != null) && (lowerBound[c] <= value) && (value <= upperBound[c])) {
              break;
            }
 else {
              c++;
            }
          }
          if (c != N) {
            keepContainer.addRowToTable(row);
          }
 else {
            discartContainer.addRowToTable(row);
          }
        }
      }
 else {
        for (        DataRow row : rowSubset) {
          int c=0;
          for (          Attribute column : parameter) {
            Double value=(Double)column.getValue(row);
            if ((value != null) && (lowerBound[c] <= value) && (value <= upperBound[c])) {
              c++;
            }
 else {
              break;
            }
          }
          if (c == N) {
            keepContainer.addRowToTable(row);
          }
 else {
            discartContainer.addRowToTable(row);
          }
        }
      }
    }
    BufTableUtils.updateProgress(exec,s++,S);
  }
  keepContainer.close();
  discartContainer.close();
  return new BufferedDataTable[]{keepContainer.getTable(),discartContainer.getTable()};
}

Fixed version (ground truth):
@Override protected BufferedDataTable[] execute(BufferedDataTable[] inData,ExecutionContext exec) throws Exception {
  BufferedDataTable input=inData[0];
  DataTableSpec inputSpec=input.getDataTableSpec();
  List<Attribute> parameter=new ArrayList<Attribute>();
  for (  String item : parameterNames.getIncludeList()) {
    Attribute attribute=new InputTableAttribute(item,input);
    if (attribute.getType().isCompatible(DoubleValue.class)) {
      parameter.add(attribute);
    }
 else {
      logger.warn("String_Node_Str" + attribute.getName() + "String_Node_Str");
    }
  }
  Attribute groupingAttribute=new InputTableAttribute(this.groupingColumn.getStringValue(),input);
  Map<Object,List<DataRow>> subsets=AttributeUtils.splitRowsGeneric(input,groupingAttribute);
  BufferedDataContainer keepContainer=exec.createDataContainer(inputSpec);
  BufferedDataContainer discartContainer=exec.createDataContainer(inputSpec);
  int S=subsets.size();
  int s=1;
  for (  Object key : subsets.keySet()) {
    List<DataRow> rowSubset=subsets.get(key);
    RealMatrix data=extractMatrix(rowSubset,parameter);
    int N=data.getColumnDimension();
    int M=data.getRowDimension();
    if (M == 0) {
      logger.warn("String_Node_Str" + key + "String_Node_Str");
    }
 else {
      double[] lowerBound=new double[N];
      double[] upperBound=new double[N];
      if (method.getStringValue().equals("String_Node_Str")) {
        for (int c=0; c < N; ++c) {
          RealVector vect=data.getColumnVector(c);
          DescriptiveStatistics stats=new DescriptiveStatistics();
          for (          double value : vect.getData()) {
            stats.addValue(value);
          }
          double lowerQuantile=stats.getPercentile(25);
          double upperQuantile=stats.getPercentile(85);
          double whisker=factor.getDoubleValue() * Math.abs(lowerQuantile - upperQuantile);
          lowerBound[c]=lowerQuantile - whisker;
          upperBound[c]=upperQuantile + whisker;
        }
      }
 else {
        for (int c=0; c < N; ++c) {
          RealVector vect=data.getColumnVector(c);
          double mean=StatUtils.mean(vect.getData());
          double sd=Math.sqrt(StatUtils.variance(vect.getData()));
          lowerBound[c]=mean - factor.getDoubleValue() * sd;
          upperBound[c]=mean + factor.getDoubleValue() * sd;
        }
      }
      if (rule.getBooleanValue()) {
        for (        DataRow row : rowSubset) {
          int c=0;
          for (          Attribute column : parameter) {
            DataCell valueCell=row.getCell(((InputTableAttribute)column).getColumnIndex());
            if (valueCell.isMissing()) {
              continue;
            }
            Double value=((DoubleValue)valueCell).getDoubleValue();
            if ((value != null) && (lowerBound[c] <= value) && (value <= upperBound[c])) {
              break;
            }
 else {
              c++;
            }
          }
          if (c != N) {
            keepContainer.addRowToTable(row);
          }
 else {
            discartContainer.addRowToTable(row);
          }
        }
      }
 else {
        for (        DataRow row : rowSubset) {
          int c=0;
          for (          Attribute column : parameter) {
            DataCell valueCell=row.getCell(((InputTableAttribute)column).getColumnIndex());
            if (valueCell.isMissing()) {
              c++;
              continue;
            }
            Double value=((DoubleValue)valueCell).getDoubleValue();
            if ((value != null) && (lowerBound[c] <= value) && (value <= upperBound[c])) {
              c++;
            }
 else {
              break;
            }
          }
          if (c == N) {
            keepContainer.addRowToTable(row);
          }
 else {
            discartContainer.addRowToTable(row);
          }
        }
      }
    }
    BufTableUtils.updateProgress(exec,s++,S);
  }
  keepContainer.close();
  discartContainer.close();
  return new BufferedDataTable[]{keepContainer.getTable(),discartContainer.getTable()};
}