private <T> void addPropertyOutliers(
String name, Function<Configuration, T> accessor, SortedSet<OutlierSet<T>> rankedOutliers) {
Map<T, SortedSet<String>> equivSets = new HashMap<>();
for (String node : _nodes) {
T definition = accessor.apply(_configurations.get(node));
SortedSet<String> matchingNodes = equivSets.getOrDefault(definition, new TreeSet<>());
matchingNodes.add(node);
equivSets.put(definition, matchingNodes);
}
Map.Entry<T, SortedSet<String>> max =
equivSets.entrySet().stream()
.max(Comparator.comparingInt(e -> e.getValue().size()))
.orElseThrow(
() -> new BatfishException("Set " + name + " has no equivalence classes"));
SortedSet<String> conformers = max.getValue();
T definition = max.getKey();
equivSets.remove(definition);
SortedSet<String> outliers = new TreeSet<>();
for (SortedSet<String> nodes : equivSets.values()) {
outliers.addAll(nodes);
}
if (_verbose || isWithinThreshold(conformers, outliers)) {
rankedOutliers.add(new OutlierSet<>(name, definition, conformers, outliers));
}
}