Program: 169245
Project: 169245
Buggy source:
@Override public List<MatchResult> findMatches(SequenceMinHashes seqHashes,boolean toSelf){
  MinHash minHash=seqHashes.getMinHashes();
  if (this.hashes.length != minHash.numHashes())   throw new FastAlignRuntimeException("String_Node_Str" + this.hashes.length + "String_Node_Str"+ minHash.numHashes()+ "String_Node_Str");
  HashMap<SequenceId,HitInfo> bestSequenceHit=new HashMap<SequenceId,HitInfo>(this.numberSequencesMinHashed.intValue() / 5 + 1);
  int[] minHashes=minHash.getMinHashArray();
  int hashIndex=0;
  for (  ArrayList<SequenceId>[] currHash : this.hashes) {
    ArrayList<SequenceId> currentHashMatchList=currHash[UnsignedInts.remainder(minHashes[hashIndex],currHash.length)];
    if (currentHashMatchList != null) {
      this.numberElementsProcessed.getAndAdd(currentHashMatchList.size());
      for (      SequenceId sequenceId : currentHashMatchList) {
        HitInfo currentHitInfo=bestSequenceHit.get(sequenceId);
        if (currentHitInfo == null) {
          currentHitInfo=new HitInfo();
          bestSequenceHit.put(sequenceId,currentHitInfo);
        }
        currentHitInfo.addHit();
      }
    }
    hashIndex++;
  }
  this.numberSequencesHit.getAndAdd(bestSequenceHit.size());
  this.numberSubSequencesHit.getAndAdd(bestSequenceHit.size());
  ArrayList<MatchResult> matches=new ArrayList<MatchResult>(32);
  for (  Entry<SequenceId,HitInfo> match : bestSequenceHit.entrySet()) {
    SequenceId matchId=match.getKey();
    if (toSelf && matchId.getHeaderId() == seqHashes.getSequenceId().getHeaderId())     continue;
    if (match.getValue().count >= this.numMinMatches) {
      SequenceMinHashes matchedHashes=this.sequenceVectorsHash.get(match.getKey());
      if (matchedHashes == null)       throw new FastAlignRuntimeException("String_Node_Str");
      if (matchedHashes.getSequenceLength() < this.minStoreLength && seqHashes.getSequenceLength() < this.minStoreLength)       continue;
      if (toSelf && matchId.getHeaderId() > seqHashes.getSequenceId().getHeaderId() && matchedHashes.getSequenceLength() >= this.minStoreLength && seqHashes.getSequenceLength() >= this.minStoreLength)       continue;
      if (toSelf && matchedHashes.getSequenceLength() < this.minStoreLength && seqHashes.getSequenceLength() >= this.minStoreLength)       continue;
      OverlapInfo result=seqHashes.getOrderedHashes().getFullScore(matchedHashes.getOrderedHashes(),this.maxShift);
      this.numberSequencesFullyCompared.getAndIncrement();
      if (result.score >= this.acceptScore) {
        MatchResult currResult=new MatchResult(seqHashes.getSequenceId(),matchId,result,seqHashes.getSequenceLength(),matchedHashes.getSequenceLength());
        matches.add(currResult);
      }
    }
  }
  return matches;
}

Fixed version (ground truth):
@Override public List<MatchResult> findMatches(SequenceMinHashes seqHashes,boolean toSelf){
  long startTime=System.currentTimeMillis();
  MinHash minHash=seqHashes.getMinHashes();
  if (this.hashes.length != minHash.numHashes())   throw new FastAlignRuntimeException("String_Node_Str" + this.hashes.length + "String_Node_Str"+ minHash.numHashes()+ "String_Node_Str");
  HashMap<SequenceId,HitInfo> bestSequenceHit=new HashMap<SequenceId,HitInfo>(this.numberSequencesMinHashed.intValue() / 5 + 1);
  int[] minHashes=minHash.getMinHashArray();
  int hashIndex=0;
  for (  ArrayList<SequenceId>[] currHash : this.hashes) {
    ArrayList<SequenceId> currentHashMatchList=currHash[UnsignedInts.remainder(minHashes[hashIndex],currHash.length)];
    if (currentHashMatchList != null) {
      this.numberElementsProcessed.getAndAdd(currentHashMatchList.size());
      for (      SequenceId sequenceId : currentHashMatchList) {
        HitInfo currentHitInfo=bestSequenceHit.get(sequenceId);
        if (currentHitInfo == null) {
          currentHitInfo=new HitInfo();
          bestSequenceHit.put(sequenceId,currentHitInfo);
        }
        currentHitInfo.addHit();
      }
    }
    hashIndex++;
  }
  this.minhashSearchTime.getAndAdd(System.currentTimeMillis() - startTime);
  this.numberSequencesHit.getAndAdd(bestSequenceHit.size());
  this.numberSubSequencesHit.getAndAdd(bestSequenceHit.size());
  ArrayList<MatchResult> matches=new ArrayList<MatchResult>(32);
  for (  Entry<SequenceId,HitInfo> match : bestSequenceHit.entrySet()) {
    SequenceId matchId=match.getKey();
    if (toSelf && matchId.getHeaderId() == seqHashes.getSequenceId().getHeaderId())     continue;
    if (match.getValue().count >= this.numMinMatches) {
      SequenceMinHashes matchedHashes=this.sequenceVectorsHash.get(match.getKey());
      if (matchedHashes == null)       throw new FastAlignRuntimeException("String_Node_Str");
      if (matchedHashes.getSequenceLength() < this.minStoreLength && seqHashes.getSequenceLength() < this.minStoreLength)       continue;
      if (toSelf && matchId.getHeaderId() > seqHashes.getSequenceId().getHeaderId() && matchedHashes.getSequenceLength() >= this.minStoreLength && seqHashes.getSequenceLength() >= this.minStoreLength)       continue;
      if (toSelf && matchedHashes.getSequenceLength() < this.minStoreLength && seqHashes.getSequenceLength() >= this.minStoreLength)       continue;
      OverlapInfo result=seqHashes.getOrderedHashes().getFullScore(matchedHashes.getOrderedHashes(),this.maxShift);
      this.numberSequencesFullyCompared.getAndIncrement();
      if (result.score >= this.acceptScore) {
        MatchResult currResult=new MatchResult(seqHashes.getSequenceId(),matchId,result,seqHashes.getSequenceLength(),matchedHashes.getSequenceLength());
        matches.add(currResult);
      }
    }
  }
  return matches;
}