private IScpWorkflow RunCompetitionStep(int seed)
        {
            var newGenomes = SorterLayer1.Genomes
                             .Where(g => SorterLayerEval.GetGenomeEval(g.Guid) == null);

            return(new ScpWorkflowImpl
                   (
                       compWorkflowState: CompWorkflowState.EvaluateResults,
                       sorterLayer0: SorterLayer0,
                       sorterLayer1: _sorterLayer1,
                       compPool: CompPool.AddSorterEvalsParallel(newGenomes.Select(t => t.ToSorter2())),
                       sorterLayerEval: SorterLayerEval,
                       scpParams: ScpParams,
                       generation: Generation,
                       report: string.Empty
                   ));
        }
        private IScpWorkflow UpdateGenomesStepH(int seed)
        {
            var successfulEvals = SorterLayerEval.GenomeEvals
                                  .Where(ev => ev.Success)
                                  .OrderBy(e => e.Score)
                                  .ToList();
            var legacyCount   = 0;
            var cubCount      = 0;
            var leftoverCount = 0;
            var leftoverTotal = ScpParams.PopulationCount - ScpParams.CubCount - ScpParams.LegacyCount;
            //var newGenomes = new List<ISorterGenome>();
            var newGenomes = new Dictionary <string, ISorterGenome>();



            foreach (var evaluatedGenome in successfulEvals)
            {
                var sorterStages = CompPool.SorterEval(evaluatedGenome.Guid)
                                   .Reduce(Guid.NewGuid()).ToStagedSorter()
                                   .SorterStages
                                   .ToList();

                //var hash = evaluatedGenome.Score + " " +
                //sorterStages.Repeat().Skip((Generation / 5) % sorterStages.Count).Take(5)
                //    .Select(s=>s.KeyPairs.Select(kp=>kp.Index)
                //                         .Aggregate(string.Empty, (str,i) => str + "," + i)
                //           )
                //    .Aggregate(string.Empty, (st,i) => st + (String.IsNullOrEmpty(st) ? "" : ",") + i);


                var hash = evaluatedGenome.Score + " " +
                           sorterStages
                           .Take(5)
                           .Select(s => s.KeyPairs.Select(kp => kp.Index)
                                   .Aggregate(string.Empty, (str, i) => str + "," + i)
                                   )
                           .Aggregate(string.Empty, (st, i) => st + (String.IsNullOrEmpty(st) ? "" : ",") + i);


                if (newGenomes.ContainsKey(hash))
                {
                    continue;
                }

                if (
                    SorterLayer0.GetGenome(evaluatedGenome.Guid) != null
                    &&
                    legacyCount < ScpParams.LegacyCount
                    )
                {
                    newGenomes[hash] = evaluatedGenome.Genome;
                    legacyCount++;
                }

                else if (
                    SorterLayer1.GetGenome(evaluatedGenome.Guid) != null
                    &&
                    cubCount < ScpParams.CubCount
                    )
                {
                    newGenomes[hash] = evaluatedGenome.Genome;
                    cubCount++;
                }
                else if (leftoverCount < leftoverTotal)
                {
                    newGenomes[hash] = evaluatedGenome.Genome;
                    leftoverCount++;

                    if (SorterLayer0.GetGenome(evaluatedGenome.Guid) != null)
                    {
                        legacyCount++;
                    }
                    else
                    {
                        cubCount++;
                    }
                }
            }

            return(new ScpWorkflowImpl
                   (
                       compWorkflowState: CompWorkflowState.ReproGenomes,
                       sorterLayer0: Layer.Make(
                           generation: Generation + 1,
                           genomes: newGenomes.Values
                           ),
                       sorterLayer1: null,
                       compPool: CompPool.TrimEvalsToTheseIds(newGenomes.Select(g => g.Value.Guid)),
                       sorterLayerEval: newGenomes.Select(g => SorterLayerEval.GetGenomeEval(g.Value.Guid))
                       .Make <ISorterGenome, IGenomeEval <ISorterGenome> >(),
                       scpParams: ScpParams,
                       generation: Generation + 1,
                       report: JsonConvert.SerializeObject(new Tuple <int, int>(legacyCount, cubCount), Formatting.None)
                   ));
        }
        private IScpWorkflow UpdateGenomesStep(int seed)
        {
            var successfulEvals = SorterLayerEval.GenomeEvals
                                  .Where(ev => ev.Success)
                                  .SubSortShuffle(e => e.Score, seed)
                                  .ToList();
            var legacyCount   = 0;
            var cubCount      = 0;
            var leftoverCount = 0;
            var leftoverTotal = ScpParams.PopulationCount - ScpParams.CubCount - ScpParams.LegacyCount;
            var newGenomes    = new List <ISorterGenome>();


            foreach (var evaluatedGenome in successfulEvals)
            {
                if (
                    SorterLayer0.GetGenome(evaluatedGenome.Guid) != null
                    &&
                    legacyCount < ScpParams.LegacyCount
                    )
                {
                    newGenomes.Add(evaluatedGenome.Genome);
                    legacyCount++;
                }

                else if (
                    SorterLayer1.GetGenome(evaluatedGenome.Guid) != null
                    &&
                    cubCount < ScpParams.CubCount
                    )
                {
                    newGenomes.Add(evaluatedGenome.Genome);
                    cubCount++;
                }
                else if (leftoverCount < leftoverTotal)
                {
                    newGenomes.Add(evaluatedGenome.Genome);
                    leftoverCount++;

                    if (SorterLayer0.GetGenome(evaluatedGenome.Guid) != null)
                    {
                        legacyCount++;
                    }
                    else
                    {
                        cubCount++;
                    }
                }
            }

            return(new ScpWorkflowImpl
                   (
                       compWorkflowState: CompWorkflowState.ReproGenomes,
                       sorterLayer0: Layer.Make(
                           generation: Generation + 1,
                           genomes: newGenomes
                           ),
                       sorterLayer1: null,
                       compPool: CompPool.TrimEvalsToTheseIds(newGenomes.Select(g => g.Guid)),
                       sorterLayerEval: newGenomes.Select(g => SorterLayerEval.GetGenomeEval(g.Guid))
                       .Make <ISorterGenome, IGenomeEval <ISorterGenome> >(),
                       scpParams: ScpParams,
                       generation: Generation + 1,
                       report: JsonConvert.SerializeObject(new Tuple <int, int>(legacyCount, cubCount), Formatting.None)
                   ));
        }