Program: 107854
Project: 107854
Buggy source:
/** 
 * This method optimizes the given data output with local recoding to improve its utility
 * @param handle
 * @param records A fraction [0,1] of records that need to be optimized.
 * @param gsFactor A factor [0,1] weighting generalization and suppression.The default value is 0.5, which means that generalization and suppression will be treated equally. A factor of 0 will favor suppression, and a factor of 1 will favor generalization. The values in between can be used for balancing both methods.
 * @param listener 
 * @return The number of optimized records
 */
public int optimizeFast(DataHandle handle,double records,double gsFactor,ARXListener listener) throws RollbackRequiredException {
  if (listener == null) {
    throw new NullPointerException("String_Node_Str");
  }
  if (handle == null) {
    throw new NullPointerException("String_Node_Str");
  }
  if (!Double.isNaN(records) && (records < 0d || records > 1d)) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (!Double.isNaN(gsFactor) && (gsFactor < 0d || gsFactor > 1d)) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (!(handle instanceof DataHandleOutput)) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (!isOptimizable(handle)) {
    return 0;
  }
  DataHandleOutput output=(DataHandleOutput)handle;
  if (output.getInputBuffer() == null || !output.getInputBuffer().equals(this.checker.getInputBuffer())) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  RowSet rowset=RowSet.create(output.getNumRows());
  for (int row=0; row < output.getNumRows(); row++) {
    if (output.isOutlier(row)) {
      rowset.add(row);
    }
  }
  ARXConfiguration config=this.config.getInstanceForLocalRecoding(rowset,gsFactor);
  if (!Double.isNaN(records)) {
    double absoluteRecords=records * handle.getNumRows();
    double relativeRecords=absoluteRecords / (double)rowset.size();
    relativeRecords=relativeRecords < 0d ? 0d : relativeRecords;
    relativeRecords=relativeRecords > 1d ? 1d : relativeRecords;
    config.setMaxOutliers(1d - relativeRecords);
  }
  DataDefinition definition=this.definition.clone();
  DataManager manager=this.manager.getSubsetInstance(rowset);
  ARXAnonymizer anonymizer=new ARXAnonymizer();
  if (listener != null) {
    anonymizer.setListener(listener);
  }
  if (this.anonymizer != null) {
    anonymizer.parse(this.anonymizer);
  }
  Result result=null;
  try {
    result=anonymizer.anonymize(manager,definition,config);
  }
 catch (  IOException e) {
    throw new RuntimeException("String_Node_Str");
  }
  if (result.optimum == null) {
    return 0;
  }
  TransformedData data=result.checker.applyTransformation(result.optimum,output.getOutputBufferMicroaggregated().getDictionary());
  int newIndex=-1;
  int[][] oldGeneralized=output.getOutputBufferGeneralized().getArray();
  int[][] oldMicroaggregated=output.getOutputBufferMicroaggregated().getArray();
  int[][] newGeneralized=data.bufferGeneralized.getArray();
  int[][] newMicroaggregated=data.bufferMicroaggregated.getArray();
  try {
    int optimized=0;
    for (int oldIndex=0; oldIndex < rowset.length(); oldIndex++) {
      if (rowset.contains(oldIndex)) {
        newIndex++;
        if (oldGeneralized != null && oldGeneralized.length != 0) {
          System.arraycopy(newGeneralized[newIndex],0,oldGeneralized[oldIndex],0,newGeneralized[newIndex].length);
          optimized+=(newGeneralized[newIndex][0] & Data.OUTLIER_MASK) != 0 ? 0 : 1;
        }
        if (oldMicroaggregated != null && oldMicroaggregated.length != 0) {
          System.arraycopy(newMicroaggregated[newIndex],0,oldMicroaggregated[oldIndex],0,newMicroaggregated[newIndex].length);
        }
      }
    }
    output.updateDataTypes(result.optimum.getGeneralization());
    if (optimized != 0) {
      output.setOptimized(true);
    }
    return optimized;
  }
 catch (  Exception e) {
    throw new RollbackRequiredException("String_Node_Str",e);
  }
}

Fixed version (ground truth):
/** 
 * This method optimizes the given data output with local recoding to improve its utility
 * @param handle
 * @param records A fraction [0,1] of records that need to be optimized.
 * @param gsFactor A factor [0,1] weighting generalization and suppression.The default value is 0.5, which means that generalization and suppression will be treated equally. A factor of 0 will favor suppression, and a factor of 1 will favor generalization. The values in between can be used for balancing both methods.
 * @param listener 
 * @return The number of optimized records
 */
public int optimizeFast(DataHandle handle,double records,double gsFactor,ARXListener listener) throws RollbackRequiredException {
  if (listener == null) {
    throw new NullPointerException("String_Node_Str");
  }
  if (handle == null) {
    throw new NullPointerException("String_Node_Str");
  }
  if (!Double.isNaN(records) && (records <= 0d || records > 1d)) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (!Double.isNaN(gsFactor) && (gsFactor < 0d || gsFactor > 1d)) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (!(handle instanceof DataHandleOutput)) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (!isOptimizable(handle)) {
    return 0;
  }
  DataHandleOutput output=(DataHandleOutput)handle;
  if (output.getInputBuffer() == null || !output.getInputBuffer().equals(this.checker.getInputBuffer())) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  RowSet rowset=RowSet.create(output.getNumRows());
  for (int row=0; row < output.getNumRows(); row++) {
    if (output.isOutlier(row)) {
      rowset.add(row);
    }
  }
  ARXConfiguration config=this.config.getInstanceForLocalRecoding(rowset,gsFactor);
  if (!Double.isNaN(records)) {
    double absoluteRecords=records * handle.getNumRows();
    double relativeRecords=absoluteRecords / (double)rowset.size();
    relativeRecords=relativeRecords < 0d ? 0d : relativeRecords;
    relativeRecords=relativeRecords > 1d ? 1d : relativeRecords;
    config.setMaxOutliers(1d - relativeRecords);
  }
  DataDefinition definition=this.definition.clone();
  DataManager manager=this.manager.getSubsetInstance(rowset);
  ARXAnonymizer anonymizer=new ARXAnonymizer();
  if (listener != null) {
    anonymizer.setListener(listener);
  }
  if (this.anonymizer != null) {
    anonymizer.parse(this.anonymizer);
  }
  Result result=null;
  try {
    result=anonymizer.anonymize(manager,definition,config);
  }
 catch (  IOException e) {
    throw new RuntimeException("String_Node_Str");
  }
  if (result.optimum == null) {
    return 0;
  }
  TransformedData data=result.checker.applyTransformation(result.optimum,output.getOutputBufferMicroaggregated().getDictionary());
  int newIndex=-1;
  int[][] oldGeneralized=output.getOutputBufferGeneralized().getArray();
  int[][] oldMicroaggregated=output.getOutputBufferMicroaggregated().getArray();
  int[][] newGeneralized=data.bufferGeneralized.getArray();
  int[][] newMicroaggregated=data.bufferMicroaggregated.getArray();
  try {
    int optimized=0;
    for (int oldIndex=0; oldIndex < rowset.length(); oldIndex++) {
      if (rowset.contains(oldIndex)) {
        newIndex++;
        if (oldGeneralized != null && oldGeneralized.length != 0) {
          System.arraycopy(newGeneralized[newIndex],0,oldGeneralized[oldIndex],0,newGeneralized[newIndex].length);
          optimized+=(newGeneralized[newIndex][0] & Data.OUTLIER_MASK) != 0 ? 0 : 1;
        }
        if (oldMicroaggregated != null && oldMicroaggregated.length != 0) {
          System.arraycopy(newMicroaggregated[newIndex],0,oldMicroaggregated[oldIndex],0,newMicroaggregated[newIndex].length);
        }
      }
    }
    output.updateDataTypes(result.optimum.getGeneralization());
    if (optimized != 0) {
      output.setOptimized(true);
    }
    return optimized;
  }
 catch (  Exception e) {
    throw new RollbackRequiredException("String_Node_Str",e);
  }
}