//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))); }
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); }
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); } } }
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))); }
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))); } }
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))); } }
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))); } }
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); }
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)); }
public static int GetHashCode(this ISorterStage sorterStage) { return(PermutationEx.GetHashCode(sorterStage)); }
public static IPermutation GetPermutation(this ISortable sortable) { return(PermutationEx.MakePermutation( sortable.GetMap() )); }