protected List<List<Match>> filterOutlierTranspositions( VariantGraph into, List<List<Match>> transpositions) { into.rank(); LOG.debug("{}: Registering transpositions", into); List<List<Match>> filteredTranspositions = Lists.newArrayList(transpositions); for (List<Match> transposedPhrase : transpositions) { Match firstMatch = transposedPhrase.get(0); VariantGraphVertex from = firstMatch.vertex; Token token = firstMatch.token; VariantGraphVertex to = witnessTokenVertices.get(token); LOG.info("matchPhrase={}", transposedPhrase); int fromRank = from.getRank(); // LOG.info("from={}, rank={}", from, fromRank); int toRank = to.getRank(); // LOG.info("to={}, rank={}", to, toRank); int diff = Math.abs(toRank - fromRank); int size = transposedPhrase.size(); int relDiff = diff / size; boolean acceptTransposition = relDiff < 5; LOG.info( "accept={}, relDiff={}, size={}, diff={}, from={}, to={}\n", new Object[] {acceptTransposition, relDiff, size, diff, from, to}); if (acceptTransposition) { for (Match match : transposedPhrase) { into.transpose(match.vertex, witnessTokenVertices.get(match.token)); } } else { filteredTranspositions.remove(transposedPhrase); } } return filteredTranspositions; }