static HashMap<IntPair, HashSet<AAAtom>> generateAll(int aCount, int archCount) {

        HashMap<IntPair, HashSet<AAAtom>> result = new HashMap<>();

        result.put(new IntPair(0, 0), new HashSet<AAAtom>());
        HashSet<AAAtom> aSet = new HashSet<>();

        aSet.add(new AAAtom());
        result.put(new IntPair(1, 0), aSet);

        for (int i = 2; i <= aCount; i++) {
            result.put(new IntPair(i, 0), new HashSet<AAAtom>());
        }

        HashSet<AAAtom> ASet = new HashSet<>();
        ASet.add(new AAAtom(new AASystem()));
        result.put(new IntPair(0, 1), ASet);

        for (int a = 1; a <= aCount; a++) {
            ArrayList<AAAtom> as = new ArrayList<>();
            for (int i = 0; i < a; i++) {
                as.add(new AAAtom());
            }
            HashSet<AAAtom> t = new HashSet<>();
            t.add(new AAAtom(new AASystem(as)));
            result.put(new IntPair(a, 1), t);
        }

        for (int arch = 2; arch <= archCount; arch++) {
            for (int a = 0; a <= aCount; a++) {
                HashSet<AAAtom> t = new HashSet<>();
                for (int preArch = 1; preArch <= arch; preArch++) {
                    for (int preA = 0; preA <= a; preA++) {
                        int postArch = arch - preArch;
                        int postA = a - preA;
                        for (AAAtom postAtom : result.get(new IntPair(postA, postArch))) {
                            for (AAAtom preAtom : result.get(new IntPair(preA, preArch))) {
                                ArrayList<AAAtom> newContents = (ArrayList<AAAtom>) preAtom.contents.atoms.clone();
                                newContents.add(postAtom);
                                t.add(new AAAtom(new AASystem(newContents)));
                            }
                        }
                    }
                }
                result.put(new IntPair(a, arch), t);
            }

        }

        return result;
    

}