public int GetMinimumLettersConsidered(IPermutationDictionary <ExtensionMap> permExMaps,
                                               Permutation permutation,
                                               IPosition positions, int maximumLettersConsidered)
        {
            IPermutationBuilderExternal permutationBuilderExternal = permutationBuilder.Clone();

            int length = permutation.Length;
            NumSequenceExtended numSequenceExtended =
                numSeqExtFactory.GetNumSequenceDefault(1, length, false);

            Permutation permutationUpfix = permutationBuilderExternal.CreatePattern(new ulong[] { 0 },
                                                                                    permutation.LetterSize, 0);

            int minimumLettersConsidered = 0;
            int index;
            int popCount;

            for (int i = 0; i < maximumLettersConsidered; i++)
            {
                minimumLettersConsidered++;
                index = positions.GetPosition(length - i - 1);
                numSequenceExtended.SetLetterMutable(index, 1);
                popCount         = numSequenceExtended.PopCount(index);
                permutationUpfix = permutationUpfix.InsertPosition(i + 1 - popCount);
                if (!permutationsUpfixes[i].Contains(permutationUpfix))
                {
                    break;
                }
            }

            return(minimumLettersConsidered);
        }
        public ExtensionMapNumSeq GetExtensionMapNumSeq(NumSequenceExtended numSequenceExtended)
        {
            if (numSequenceExtended != null && numSequenceExtended.LetterSize == 1)
            {
                return(new ExtensionMapNumSeq(numSequenceExtended));
            }

            if (numSequenceExtended == null)
            {
                throw new ArgumentNullException();
            }
            else
            {
                throw new ArgumentException();
            }
        }
        private void ComputeUpfixes(Permutation permutation, IPosition positions)
        {
            IPermutationBuilderExternal permutationBuilderExternal = permutationBuilder.Clone();

            Permutation permutationUpfix = permutationBuilderExternal.CreatePattern(new ulong[] { 0 },
                                                                                    permutation.LetterSize, 0);

            int length = permutation.Length;

            NumSequenceExtended numSequenceExtended =
                numSeqExtFactory.GetNumSequenceDefault(1, length, false);

            int index;
            int popCount;

            for (int i = 0; i < length - 1; i++)
            {
                index = positions.GetPosition(length - i - 2);
                numSequenceExtended.SetLetterMutable(index, 1);
                popCount         = numSequenceExtended.PopCount(index);
                permutationUpfix = permutationUpfix.InsertPosition(i + 1 - popCount);
                permutationsUpfixes[i].Add(permutationUpfix);
            }
        }
        public override ExtensionMap GetExtensionMapDefault(int length, bool set)
        {
            NumSequenceExtended numSequenceExtended = factory.GetNumSequenceDefault(1, length, set);

            return(new ExtensionMapNumSeq(numSequenceExtended));
        }
        public override ExtensionMap GetExtensionMap(ulong[] words, int length)
        {
            NumSequenceExtended numSequenceExtended = factory.GetNumSequence(words, 1, length);

            return(new ExtensionMapNumSeq(numSequenceExtended));
        }
 internal ExtensionMapNumSeq(NumSequenceExtended numSequenceExtended)
 {
     this.numSequenceExtended = numSequenceExtended;
 }