public static Func <IReadOnlyList <T>, IReadOnlyList <T> > StandardMutator <T> ( double deletionRate, double insertionRate, double mutationRate, Func <T> geneMutator, IRando rando ) { return(list => { var lp = new ListPropigator <T> ( deletor: (l, i) => l.RemoveAt(i), deletionFrequency: deletionRate, inserter: (l, i) => l.Insert(i, geneMutator.Invoke()), insertionFrequency: insertionRate, mutator: (l, i) => l.SetItem(i, geneMutator.Invoke()), mutationFrequency: mutationRate, finalIndex: list.Count ); return list.Mutate(lp, rando); }); }
public void TestListPropigatorMutate() { const int startLen = 40; const int finalLen = 40; var lp = new ListPropigator <int> ( deletor: Deletor, deletionFrequency: 0.0, inserter: Inserter, insertionFrequency: 0.0, mutator: Mutator, mutationFrequency: 1.0, finalIndex: finalLen ); var randy = Rando.Fast(123); var track = new Tuple <IImmutableList <int>, int> ( ImmutableList <int> .Empty.AddRange(Enumerable.Range(0, startLen)), 0 ); while (track.Item2 < lp.FinalIndex) { track = lp.Propigate(track.Item1, randy, track.Item2); } Assert.AreEqual(track.Item1.Count, finalLen); Assert.IsTrue(track.Item1.All(t => t == 55)); }