public static IEnumerable <ISwitchable <T> > MakeSwitchables <T>(this IRando random, int keyCount) { if (typeof(T) == typeof(uint)) { return((IEnumerable <ISwitchable <T> >)random.ToUintEnumerator(((uint)1) << (keyCount - 1)).ToUintSwitchable(keyCount)); } if (typeof(T) == typeof(ulong)) { return((IEnumerable <ISwitchable <T> >)random.ToUlongEnumerator(((ulong)1) << (keyCount - 1)).ToUlongSwitchable(keyCount)); } if (typeof(T) == typeof(bool[])) { return((IEnumerable <ISwitchable <T> >)random.ToBoolEnumerator(0.5).Chunk(keyCount).Select(b => b.ToSwitchableBitArray())); } if (typeof(T) == typeof(int[])) { return((IEnumerable <ISwitchable <T> >)random.ToRandomEnumerator().Select(r => r.ToSwitchableIntArray(keyCount))); } throw new Exception("unhandled switchable type"); }
public static ISorterGenome ToSorterGenome( this IRando randy, int keyCount, int keyPairCount) { var keyPairSetSize = (uint)KeyPairRepository.KeyPairSetSizeForKeyCount(keyCount); return(new SorterGenomeImpl ( guid: randy.NextGuid(), parentGuid: Guid.Empty, chromosome: randy .ToUintEnumerator(keyPairSetSize) .Take(keyPairCount) .ToList() .ToChromosomeUint ( maxVal: keyPairSetSize ), keyCount: keyCount, keyPairCount: keyPairCount )); }
public static ISwitchableGroupGenome ToSwitchableGroupGenome( this IRando rando, SwitchableGroupGenomeType switchableGroupGenomeType, int keyCount, int groupSize ) { switch (switchableGroupGenomeType) { case SwitchableGroupGenomeType.UInt: return(new SwitchableGroupGenomeImpl ( guid: rando.NextGuid(), parentGuid: Guid.Empty, keyCount: keyCount, chromosome: rando.ToUintEnumerator(((uint)1) << (keyCount - 1)) .Take(groupSize) .ToList() .ToChromosomeUint(((uint)1) << keyCount), groupCount: groupSize )); case SwitchableGroupGenomeType.ULong: return(new SwitchableGroupGenomeImpl ( guid: rando.NextGuid(), parentGuid: Guid.Empty, keyCount: keyCount, chromosome: rando.ToUlongEnumerator(((ulong)1) << (keyCount - 1)) .Take(groupSize) .ToUints() .ToList() .ToChromosomeUlongN(((ulong)1) << keyCount), groupCount: groupSize )); case SwitchableGroupGenomeType.BitArray: return(new SwitchableGroupGenomeImpl ( guid: rando.NextGuid(), parentGuid: Guid.Empty, keyCount: keyCount, chromosome: rando.ToUintEnumerator(2) .Take(groupSize * keyCount) .ToList() .ToChromosomeBits(rando.NextGuid(), keyCount), groupCount: groupSize )); case SwitchableGroupGenomeType.IntArray: return(new SwitchableGroupGenomeImpl ( guid: rando.NextGuid(), parentGuid: Guid.Empty, keyCount: keyCount, chromosome: Enumerable .Range(0, groupSize) .SelectMany(i => Enumerable .Range(0, keyCount) .Select(t => (uint)t) .ToList() .FisherYatesShuffle(rando) ) .ToList() .ToChromosomePermutation(rando.NextGuid(), keyCount, 0.2), groupCount: groupSize )); default: throw new Exception(); } }