protected void analyzeAtoms(List<ArrayListMultimap<Atom, Integer>> candidatesResult) {
        for (ArrayListMultimap<Atom, Integer> line : candidatesResult) {
            Multiset<List<Integer>> atomCandidates = HashMultiset.create();
            for (Atom key : line.keySet()) {
                atomCandidates.add(line.get(key));
            }

            for (List<Integer> candidates : atomCandidates) {
                if (candidates.size() == atomCandidates.count(candidates)) {
                    for (Atom atom : line.keySet()) {
                        List<Integer> integers = line.get(atom);
                        if (integers.equals(candidates)) {
                            continue;
                        }

                        Iterator<Integer> iterator = integers.iterator();
                        while (iterator.hasNext()) {
                            if (candidates.contains(iterator.next())) {
                                iterator.remove();
                            }
                        }
                    }
                }
            }

            ArrayListMultimap<Integer, Atom> updatedDate = ArrayListMultimap.create();
            for (Map.Entry<Atom, Integer> entry : line.entries()) {
                updatedDate.put(entry.getValue(), entry.getKey());
            }

            super.processCandidateLine(updatedDate);
        }
    }