class SuppressedAtomHashGenerator extends AbstractAtomHashGenerator implements AtomHashGenerator {

    long next(int[][] graph, int v, long[] current, long[] unique, long[] included, Suppressed suppressed) {

        if (suppressed.contains(v)) return current[v];

        long invariant = distribute(current[v]);
        int nUnique = 0;

        for (int w : graph[v]) {

            // skip suppressed atom
            if (suppressed.contains(w)) continue;

            long adjInv = current[w];

            // find index of already included neighbor
            int i = 0;
            while (i < nUnique && unique[i] != adjInv) {
                ++i;
            }

            // no match, then the value is unique, use adjInv
            // match, then rotate the previously included value
            included[i] = (i == nUnique) ? unique[nUnique++] = adjInv : rotate(included[i]);

            invariant ^= included[i];
        }

        return invariant;
    }

    public  SuppressedAtomHashGenerator(AtomHashGenerator seedGenerator, Pseudorandom pseudorandom,
            StereoEncoderFactory factory, AtomSuppression suppression, int depth);
    public  SuppressedAtomHashGenerator(AtomHashGenerator seedGenerator, Pseudorandom pseudorandom,
            AtomSuppression suppression, int depth);

}