Example #1
0
        //public static IEnumerable<ISorterStage> ReplaceAtIndex(this IEnumerable<ISorterStage> source, int index,
        //    ISorterStage replacement)
        //{
        //    var lst = source.ToList();
        //    lst[index] = replacement;
        //    return lst;
        //}

        public static Tuple <bool, IPermutation> Sort(this ISorterStage stage, IPermutation perm)
        {
            var aRet = new uint[stage.Order];

            for (uint i = 0; i < stage.Order; i++)
            {
                aRet[i] = perm[i];
            }

            var wasUsed = false;

            for (uint i = 0; i < stage.Order; i++)
            {
                var m = stage[i];
                if (m > i)
                {
                    var llv = perm[i];
                    var hlv = perm[m];
                    if (llv > hlv)
                    {
                        aRet[m] = llv;
                        aRet[i] = hlv;
                        wasUsed = true;
                    }
                }
            }

            return(new Tuple <bool, IPermutation>(wasUsed, PermutationEx.MakePermutation(aRet)));
        }
Example #2
0
        public void TestMutate()
        {
            const int    seed         = 434;
            const uint   order        = 64;
            const double mutationRate = 0.003;

            var randy     = Rando.Standard(seed);
            var stageBits = randy.ToStageBits(order: order);
            var perm      = stageBits.ToPermutation();

            Stopwatch sw = new Stopwatch();

            sw.Start();

            var sameCount = 0;

            for (var i = 0; i < 100000; i++)
            {
                var stageBitsM = stageBits.Mutate(randy, mutationRate);
                var permM      = stageBitsM.ToPermutation();
                var p2         = perm.Multiply(permM);
                if (p2.IsEqualTo(PermutationEx.Identity(order)))
                {
                    sameCount++;
                }
            }

            sw.Stop();
            Console.WriteLine(sameCount);
            Console.WriteLine("Elapsed={0}", sw.Elapsed);
        }
Example #3
0
        public void TestHc()
        {
            uint orderly = 11;
            var  pd      = PermutationEx.PermutationDictionary(orderly);
            var  randy   = Rando.Standard(51323);

            for (var i = 0; i < 1000; i++)
            {
                var perm  = randy.ToFullSorterStage(orderly, 0);
                var perm2 = randy.RewireSorterStage(perm);

                if (perm.IsEqualTo(perm2))
                {
                    var s = "s";
                }

                if (pd.ContainsKey(perm2))
                {
                    pd[perm2]++;
                }
                else
                {
                    pd.Add(perm2, 1);
                }
            }
        }
Example #4
0
        public void TestRandomTwoCycleSquared()
        {
            const int order = 24;
            var       rando = Rando.Standard(5123);
            var       perm  = rando.ToPermutation(order);

            var p2 = perm.Multiply(perm);

            Assert.IsTrue(p2.IsEqualTo(PermutationEx.Identity(order)));
        }
Example #5
0
        public void TestSingleTwoCyclePermutationConjugateIsATwoCycle()
        {
            const int order = 24;
            var       randy = Rando.Standard(5123);

            for (var i = 0; i < 1000; i++)
            {
                var twoCycle   = randy.ToSingleTwoCyclePermutation(order);
                var twoCycleSq = twoCycle.Multiply(twoCycle);
                Assert.IsTrue(twoCycleSq.IsEqualTo(PermutationEx.Identity(order)));
            }
        }
Example #6
0
        public void TestFullTwoCyclePermutationConjugateIsATwoCycle()
        {
            const int order = 24;
            var       randy = Rando.Standard(5123);

            for (var i = 0; i < 1000; i++)
            {
                var twoCycle  = randy.ToFullTwoCyclePermutation(order);
                var conjugate = twoCycle.ConjugateByRandomPermutation(randy);
                var p2        = conjugate.Multiply(conjugate);
                Assert.IsTrue(p2.IsEqualTo(PermutationEx.Identity(order)));
            }
        }
Example #7
0
        public void TestInverse()
        {
            const int order = 23;
            var       randy = Rando.Standard(5123);

            for (var i = 0; i < 1000; i++)
            {
                var perm  = randy.ToPermutation(order);
                var permI = perm.ToInverse();
                var prod  = perm.Multiply(permI);
                Assert.IsTrue(prod.IsEqualTo(PermutationEx.Identity(order)));
            }
        }
Example #8
0
        public void TestMutatezLoop()
        {
            const int    seed         = 7434;
            const double mutationRate = 0.001;
            const int    reps         = 2000;
            const int    pool         = 2000;

            var randy = Rando.Standard(seed);


            Stopwatch sw = new Stopwatch();

            sw.Start();
            Console.WriteLine($"Order MutationRate P1 P2 Reps");

            for (var p = 0; p < 10; p++)
            {
                for (uint r = 48; r < 100; r++)
                {
                    var stageBits = randy.ToStageBits(order: r);
                    var perm      = stageBits.ToPermutation();

                    var sameCount  = 0;
                    var sameCount2 = 0;
                    for (var i = 0; i < reps; i++)
                    {
                        var stageBitsM = stageBits.Mutate(randy, mutationRate);
                        var permM      = stageBitsM.ToPermutation();
                        var p2         = perm.Multiply(permM);
                        if (p2.IsEqualTo(PermutationEx.Identity(r)))
                        {
                            sameCount++;
                            var stageBitsM2 = stageBitsM.Mutate(randy, mutationRate);
                            var permM2      = stageBitsM2.ToPermutation();
                            var p3          = perm.Multiply(permM2);
                            if (p3.IsEqualTo(PermutationEx.Identity(r)))
                            {
                                sameCount2++;
                            }
                        }
                    }

                    Console.WriteLine($"{r} {mutationRate} {sameCount} {sameCount2} {reps}");
                }
            }



            sw.Stop();
            Console.WriteLine("\nElapsed={0}", sw.Elapsed);
        }
Example #9
0
        public static IPermutation ToPermutation(this StageBits2 stageBits)
        {
            var permArray    = 0u.CountUp(stageBits.Order).ToArray();
            var sbScratchPad = stageBits.ToSbScratchPad2();

            //System.Diagnostics.Debug.WriteLine(sbScratchPad.PrintOverlaps());
            //System.Diagnostics.Debug.WriteLine(sbScratchPad.PrintUsed());

            while (!sbScratchPad.IsSpent())
            {
                var dSbSp = sbScratchPad.BestOnDiag();
                dSbSp.IsUsed = true;
                var bSpSp = sbScratchPad.BestOnCol(dSbSp.Col);
                permArray[bSpSp.Col] = bSpSp.Row;
                permArray[bSpSp.Row] = bSpSp.Col;
                sbScratchPad.Mark(bSpSp, stageBits.Order);

                //  System.Diagnostics.Debug.WriteLine(sbScratchPad.PrintUsed());
            }

            return(PermutationEx.MakePermutation(permArray));
        }
Example #10
0
 public static int GetHashCode(this ISorterStage sorterStage)
 {
     return(PermutationEx.GetHashCode(sorterStage));
 }
Example #11
0
 public static IPermutation GetPermutation(this ISortable sortable)
 {
     return(PermutationEx.MakePermutation(
                sortable.GetMap()
                ));
 }