public static ISorter ToSorter(this GenomeSorterConjOrbit genomeConjOrbit, uint maxOrbitSize)
        {
            var orbs = genomeConjOrbit.TwoCycle
                       .GetConjOrbit(genomeConjOrbit.Conj, maxOrbitSize)
                       .Keys.ToRoundRobin().Take((int)maxOrbitSize)
                       .Select(p => p.ToSorterStage(0u));

            return(new global::Utils.Sorter.Sorter(
                       id: Guid.NewGuid(),
                       genomeId: genomeConjOrbit.Id,
                       stages: orbs));
        }
        public static GenomeSorterConjOrbit Mutate(this GenomeSorterConjOrbit genomeConjOrbit, IRando randy)
        {
            var newTs   = genomeConjOrbit.TwoCycle;
            var newPerm = genomeConjOrbit.Conj;

            if (randy.NextBool(0.5))
            {
                newTs = newTs.ConjugateByRandomSingleTwoCycle(randy);
            }
            else
            {
                newPerm = newPerm.ConjugateByRandomPermutation(randy);
            }

            return(new GenomeSorterConjOrbit(
                       id: Guid.NewGuid(),
                       twoCycle: newTs,
                       conj: newPerm,
                       order: genomeConjOrbit.Order,
                       stageCount: genomeConjOrbit.Stagecount));
        }