Program: 20160
Project: 20160
Buggy source:
public ValuedNodeSetList mergeOverlapping(ValuedNodeSetList nodeSets,SimilarityFunction<NodeSet> similarityFunc,double threshold){
  int i, j, n=nodeSets.size();
  long stepsTotal=n * (n - 1) / 2, stepsTaken=0;
  double similarity;
  ValuedNodeSetList result=new ValuedNodeSetList();
  HashSet<ValuedNodeSet> activeNodesets=new HashSet<ValuedNodeSet>();
  if (n == 0)   return result;
  if (verificationMode) {
    prepareForVerification(nodeSets);
  }
  Graph graph=nodeSets.get(0).getGraph();
  PriorityQueue<NodeSetPair> pairs=new PriorityQueue<NodeSetPair>();
  HashMultimap<ValuedNodeSet,NodeSetPair> nodesetsToPairs=new HashMultimap<ValuedNodeSet,NodeSetPair>();
  if (taskMonitor != null) {
    taskMonitor.setPercentCompleted(0);
    taskMonitor.setStatus("String_Node_Str");
  }
  for (i=0; i < n; i++) {
    ValuedNodeSet v1=nodeSets.get(i);
    for (j=i + 1; j < n; j++) {
      ValuedNodeSet v2=nodeSets.get(j);
      similarity=similarityFunc.getSimilarity(v1,v2);
      if (similarity > 0) {
        NodeSetPair pair=new NodeSetPair(v1,v2,similarity);
        pairs.add(pair);
        debug("String_Node_Str" + pair + "String_Node_Str"+ v1);
        nodesetsToPairs.put(v1,pair);
        debug("String_Node_Str" + v1 + "String_Node_Str"+ nodesetsToPairs.get(v1));
        debug("String_Node_Str" + pair + "String_Node_Str"+ v2);
        nodesetsToPairs.put(v2,pair);
        debug("String_Node_Str" + v2 + "String_Node_Str"+ nodesetsToPairs.get(v2));
      }
    }
    if (!nodesetsToPairs.containsKey(v1)) {
      result.add(v1);
    }
    stepsTaken+=(n - i - 1);
    if (stepsTaken > stepsTotal)     stepsTaken=stepsTotal;
    if (taskMonitor != null) {
      taskMonitor.setPercentCompleted((int)(100 * (((float)stepsTaken) / stepsTotal)));
    }
  }
  activeNodesets.addAll(nodesetsToPairs.keySet());
  if (debugging) {
    System.err.println("String_Node_Str");
    System.err.println(result);
    System.err.println("String_Node_Str");
    System.err.println(pairs);
  }
  if (isVerificationMode()) {
    ValuedNodeSetList tmpResult=new ValuedNodeSetList();
    tmpResult.addAll(result);
    tmpResult.addAll(activeNodesets);
    verifyResult(tmpResult,similarityFunc,-1);
  }
  if (taskMonitor != null) {
    taskMonitor.setPercentCompleted(-1);
    taskMonitor.setStatus("String_Node_Str");
  }
  stepsTotal=pairs.size();
  stepsTaken=0;
  while (!pairs.isEmpty()) {
    NodeSetPair pair=pairs.poll();
    ValuedNodeSet v1=pair.getLeft();
    ValuedNodeSet v2=pair.getRight();
    if (pair.similarity < threshold)     break;
    debug("String_Node_Str" + pair);
    debug("String_Node_Str" + activeNodesets);
    if (!activeNodesets.contains(v1)) {
      debug("String_Node_Str" + v1 + "String_Node_Str");
      nodesetsToPairs.remove(v2,pair);
      continue;
    }
    if (!activeNodesets.contains(v2)) {
      debug("String_Node_Str" + v2 + "String_Node_Str");
      nodesetsToPairs.remove(v1,pair);
      continue;
    }
    nodesetsToPairs.remove(v1,pair);
    nodesetsToPairs.remove(v2,pair);
    Multiset<Integer> unionMembers=new TreeMultiset<Integer>();
    unionMembers.addAll(v1.getMembers());
    unionMembers.addAll(v2.getMembers());
    ValuedNodeSet unionNodeset=new ValuedNodeSet(graph,unionMembers.elementSet());
    for (    Multiset.Entry<Integer> entry : unionMembers.entrySet()) {
      Integer elt=entry.getElement();
      int count=v1.getValue(elt,0) + v2.getValue(elt,0);
      unionNodeset.setValue(elt,count);
    }
    boolean v1SubsetOfv2=unionNodeset.equals(v2);
    boolean v2SubsetOfv1=unionNodeset.equals(v1);
    if (!v1SubsetOfv2 && !v2SubsetOfv1) {
      debug("String_Node_Str");
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v1)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v1);
        similarity=similarityFunc.getSimilarity(unionNodeset,v3);
        nodesetsToPairs.remove(v3,oldPair);
        if (similarity < threshold)         continue;
        NodeSetPair newPair=new NodeSetPair(unionNodeset,v3,similarity);
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(unionNodeset,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      debug("String_Node_Str" + nodesetsToPairs.get(v1));
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v2)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v2);
        if (unionNodeset == v3) {
          continue;
        }
        similarity=similarityFunc.getSimilarity(unionNodeset,v3);
        nodesetsToPairs.remove(v3,oldPair);
        if (similarity < threshold)         continue;
        NodeSetPair newPair=new NodeSetPair(unionNodeset,v3,similarity);
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(unionNodeset,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      nodesetsToPairs.removeAll(v1);
      nodesetsToPairs.removeAll(v2);
      activeNodesets.remove(v1);
      activeNodesets.remove(v2);
      activeNodesets.add(unionNodeset);
    }
 else     if (v1SubsetOfv2 && !v2SubsetOfv1) {
      debug("String_Node_Str");
      for (      int member : v1)       v2.setValue(member,v1.getValue(member) + v2.getValue(member));
      Collection<NodeSetPair> v2Pairs=nodesetsToPairs.get(v2);
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v1)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v1);
        similarity=similarityFunc.getSimilarity(v2,v3);
        nodesetsToPairs.remove(v3,oldPair);
        debug("String_Node_Str" + v2 + "String_Node_Str"+ v3+ "String_Node_Str"+ similarity);
        if (similarity == 0)         continue;
        NodeSetPair newPair=new NodeSetPair(v2,v3,similarity);
        if (v2Pairs.contains(newPair)) {
          debug("String_Node_Str");
          continue;
        }
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(v2,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      nodesetsToPairs.removeAll(v1);
      activeNodesets.remove(v1);
    }
 else     if (v2SubsetOfv1 && !v1SubsetOfv2) {
      debug("String_Node_Str");
      for (      int member : v2)       v1.setValue(member,v2.getValue(member) + v1.getValue(member));
      Collection<NodeSetPair> v1Pairs=nodesetsToPairs.get(v1);
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v2)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v2);
        similarity=similarityFunc.getSimilarity(v1,v3);
        nodesetsToPairs.remove(v3,oldPair);
        if (similarity == 0)         continue;
        NodeSetPair newPair=new NodeSetPair(v1,v3,similarity);
        if (v1Pairs.contains(newPair))         continue;
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(v1,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      nodesetsToPairs.removeAll(v2);
      activeNodesets.remove(v2);
    }
 else {
      debug("String_Node_Str");
      for (      int member : v2)       v1.setValue(member,v2.getValue(member) + v1.getValue(member));
      nodesetsToPairs.removeAll(v2);
      activeNodesets.remove(v2);
    }
    debug("String_Node_Str" + activeNodesets);
    debug("String_Node_Str" + pairs);
    if (isVerificationMode()) {
      ValuedNodeSetList tmpResult=new ValuedNodeSetList();
      tmpResult.addAll(result);
      tmpResult.addAll(activeNodesets);
      debug("String_Node_Str" + tmpResult);
      try {
        verifyResult(tmpResult,similarityFunc,-1);
      }
 catch (      RuntimeException ex) {
        System.err.println("String_Node_Str" + stepsTaken + "String_Node_Str"+ "String_Node_Str"+ v1+ "String_Node_Str"+ v2);
        throw ex;
      }
    }
  }
  result.addAll(activeNodesets);
  if (verificationMode) {
    verifyResult(result,similarityFunc,threshold);
  }
  if (taskMonitor != null) {
    taskMonitor.setPercentCompleted(100);
  }
  return result;
}

Fixed version (ground truth):
public ValuedNodeSetList mergeOverlapping(ValuedNodeSetList nodeSets,SimilarityFunction<NodeSet> similarityFunc,double threshold){
  int i, j, n=nodeSets.size();
  long stepsTotal=n * (n - 1) / 2, stepsTaken=0;
  double similarity;
  ValuedNodeSetList result=new ValuedNodeSetList();
  HashSet<ValuedNodeSet> activeNodesets=new HashSet<ValuedNodeSet>();
  if (n == 0)   return result;
  if (verificationMode) {
    prepareForVerification(nodeSets);
  }
  Graph graph=nodeSets.get(0).getGraph();
  PriorityQueue<NodeSetPair> pairs=new PriorityQueue<NodeSetPair>();
  HashMultimap<ValuedNodeSet,NodeSetPair> nodesetsToPairs=new HashMultimap<ValuedNodeSet,NodeSetPair>();
  if (taskMonitor != null) {
    taskMonitor.setPercentCompleted(0);
    taskMonitor.setStatus("String_Node_Str");
  }
  for (i=0; i < n; i++) {
    ValuedNodeSet v1=nodeSets.get(i);
    for (j=i + 1; j < n; j++) {
      ValuedNodeSet v2=nodeSets.get(j);
      similarity=similarityFunc.getSimilarity(v1,v2);
      if (similarity > 0) {
        NodeSetPair pair=new NodeSetPair(v1,v2,similarity);
        pairs.add(pair);
        debug("String_Node_Str" + pair + "String_Node_Str"+ v1);
        nodesetsToPairs.put(v1,pair);
        debug("String_Node_Str" + pair + "String_Node_Str"+ v2);
        nodesetsToPairs.put(v2,pair);
      }
    }
    if (!nodesetsToPairs.containsKey(v1)) {
      result.add(v1);
    }
    stepsTaken+=(n - i - 1);
    if (stepsTaken > stepsTotal)     stepsTaken=stepsTotal;
    if (taskMonitor != null) {
      taskMonitor.setPercentCompleted((int)(100 * (((float)stepsTaken) / stepsTotal)));
    }
  }
  activeNodesets.addAll(nodesetsToPairs.keySet());
  if (debugging) {
    System.err.println("String_Node_Str");
    System.err.println(result);
    System.err.println("String_Node_Str");
    System.err.println(pairs);
  }
  if (isVerificationMode()) {
    ValuedNodeSetList tmpResult=new ValuedNodeSetList();
    tmpResult.addAll(result);
    tmpResult.addAll(activeNodesets);
    verifyResult(tmpResult,similarityFunc,-1);
  }
  if (taskMonitor != null) {
    taskMonitor.setPercentCompleted(-1);
    taskMonitor.setStatus("String_Node_Str");
  }
  stepsTotal=pairs.size();
  stepsTaken=0;
  while (!pairs.isEmpty()) {
    NodeSetPair pair=pairs.poll();
    ValuedNodeSet v1=pair.getLeft();
    ValuedNodeSet v2=pair.getRight();
    if (pair.similarity < threshold)     break;
    debug("String_Node_Str" + pair);
    if (!activeNodesets.contains(v1)) {
      debug("String_Node_Str" + v1 + "String_Node_Str");
      nodesetsToPairs.remove(v2,pair);
      continue;
    }
    if (!activeNodesets.contains(v2)) {
      debug("String_Node_Str" + v2 + "String_Node_Str");
      nodesetsToPairs.remove(v1,pair);
      continue;
    }
    nodesetsToPairs.remove(v1,pair);
    nodesetsToPairs.remove(v2,pair);
    Multiset<Integer> unionMembers=new TreeMultiset<Integer>();
    unionMembers.addAll(v1.getMembers());
    unionMembers.addAll(v2.getMembers());
    ValuedNodeSet unionNodeset=new ValuedNodeSet(graph,unionMembers.elementSet());
    for (    Multiset.Entry<Integer> entry : unionMembers.entrySet()) {
      Integer elt=entry.getElement();
      int count=v1.getValue(elt,0) + v2.getValue(elt,0);
      unionNodeset.setValue(elt,count);
    }
    boolean v1SubsetOfv2=unionNodeset.equals(v2);
    boolean v2SubsetOfv1=unionNodeset.equals(v1);
    if (!v1SubsetOfv2 && !v2SubsetOfv1) {
      debug("String_Node_Str");
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v1)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v1);
        similarity=similarityFunc.getSimilarity(unionNodeset,v3);
        nodesetsToPairs.remove(v3,oldPair);
        if (similarity < threshold)         continue;
        NodeSetPair newPair=new NodeSetPair(unionNodeset,v3,similarity);
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(unionNodeset,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      debug("String_Node_Str" + nodesetsToPairs.get(v1));
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v2)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v2);
        if (unionNodeset == v3) {
          continue;
        }
        similarity=similarityFunc.getSimilarity(unionNodeset,v3);
        nodesetsToPairs.remove(v3,oldPair);
        if (similarity < threshold)         continue;
        NodeSetPair newPair=new NodeSetPair(unionNodeset,v3,similarity);
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(unionNodeset,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      nodesetsToPairs.removeAll(v1);
      nodesetsToPairs.removeAll(v2);
      activeNodesets.remove(v1);
      activeNodesets.remove(v2);
      activeNodesets.add(unionNodeset);
    }
 else     if (v1SubsetOfv2 && !v2SubsetOfv1) {
      debug("String_Node_Str");
      for (      int member : v1)       v2.setValue(member,v1.getValue(member) + v2.getValue(member));
      Collection<NodeSetPair> v2Pairs=nodesetsToPairs.get(v2);
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v1)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v1);
        if (v3 == v2)         continue;
        similarity=similarityFunc.getSimilarity(v2,v3);
        nodesetsToPairs.remove(v3,oldPair);
        debug("String_Node_Str" + v2 + "String_Node_Str"+ v3+ "String_Node_Str"+ similarity);
        if (similarity == 0)         continue;
        NodeSetPair newPair=new NodeSetPair(v2,v3,similarity);
        if (v2Pairs.contains(newPair)) {
          debug("String_Node_Str");
          continue;
        }
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(v2,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      nodesetsToPairs.removeAll(v1);
      activeNodesets.remove(v1);
    }
 else     if (v2SubsetOfv1 && !v1SubsetOfv2) {
      debug("String_Node_Str");
      for (      int member : v2)       v1.setValue(member,v2.getValue(member) + v1.getValue(member));
      Collection<NodeSetPair> v1Pairs=nodesetsToPairs.get(v1);
      for (      NodeSetPair oldPair : nodesetsToPairs.get(v2)) {
        ValuedNodeSet v3=oldPair.getOtherThan(v2);
        if (v3 == v1)         continue;
        similarity=similarityFunc.getSimilarity(v1,v3);
        nodesetsToPairs.remove(v3,oldPair);
        if (similarity == 0)         continue;
        NodeSetPair newPair=new NodeSetPair(v1,v3,similarity);
        if (v1Pairs.contains(newPair))         continue;
        debug("String_Node_Str" + oldPair + "String_Node_Str"+ newPair);
        pairs.add(newPair);
        nodesetsToPairs.put(v1,newPair);
        nodesetsToPairs.put(v3,newPair);
      }
      nodesetsToPairs.removeAll(v2);
      activeNodesets.remove(v2);
    }
 else {
      debug("String_Node_Str");
      for (      int member : v2)       v1.setValue(member,v2.getValue(member) + v1.getValue(member));
      nodesetsToPairs.removeAll(v2);
      activeNodesets.remove(v2);
    }
    if (isVerificationMode()) {
      ValuedNodeSetList tmpResult=new ValuedNodeSetList();
      tmpResult.addAll(result);
      tmpResult.addAll(activeNodesets);
      try {
        verifyResult(tmpResult,similarityFunc,-1);
      }
 catch (      RuntimeException ex) {
        System.err.println("String_Node_Str" + stepsTaken + "String_Node_Str"+ "String_Node_Str"+ v1+ "String_Node_Str"+ v2);
        throw ex;
      }
    }
    stepsTaken++;
  }
  result.addAll(activeNodesets);
  if (verificationMode) {
    verifyResult(result,similarityFunc,threshold);
  }
  if (taskMonitor != null) {
    taskMonitor.setPercentCompleted(100);
  }
  return result;
}