/// <summary>
        /// Mutates an individual by choosing an index at random and randomizing
        /// its training point among possible individuals.
        /// </summary>
        protected internal override GAIndividual ReproduceByMutation(int inIndex)
        {
            FloatRegFitPredictionIndividual i = (FloatRegFitPredictionIndividual)ReproduceByClone(inIndex);
            int index = Rng.Next(FloatRegFitPredictionIndividual._sampleSize);

            i.SetSampleIndex(index, Rng.Next(_solutionGA._testCases.Count));
            return(i);
        }
        /// <summary>Evaluates a solution individual using the best predictor so far.</summary>
        protected internal virtual void PredictIndividual(GAIndividual inIndividual, bool duringSimplify)
        {
            FloatRegFitPredictionIndividual predictor = (FloatRegFitPredictionIndividual)_predictorGA.GetBestPredictor();
            float fitness = predictor.PredictSolutionFitness((PushGPIndividual)inIndividual);

            inIndividual.SetFitness(fitness);
            inIndividual.SetErrors(new List <float>());
        }
        protected internal override void InitIndividual(GAIndividual inIndividual)
        {
            FloatRegFitPredictionIndividual i = (FloatRegFitPredictionIndividual)inIndividual;

            int[] samples = new int[FloatRegFitPredictionIndividual._sampleSize];
            for (int j = 0; j < samples.Length; j++)
            {
                samples[j] = Rng.Next(_solutionGA._testCases.Count);
            }
            i.SetSampleIndicesAndSolutionGA(_solutionGA, samples);
        }
        protected internal override GAIndividual ReproduceByCrossover(int inIndex)
        {
            FloatRegFitPredictionIndividual a = (FloatRegFitPredictionIndividual)ReproduceByClone(inIndex);
            FloatRegFitPredictionIndividual b = (FloatRegFitPredictionIndividual)TournamentSelect(_tournamentSize, inIndex);
            // crossoverPoint is the first index of a that will be changed to the
            // gene from b.
            int crossoverPoint = Rng.Next(FloatRegFitPredictionIndividual._sampleSize - 1) + 1;

            for (int i = crossoverPoint; i < FloatRegFitPredictionIndividual._sampleSize; i++)
            {
                a.SetSampleIndex(i, b.GetSampleIndex(i));
            }
            return(a);
        }
        protected internal override void EvaluateIndividual(GAIndividual inIndividual)
        {
            FloatRegFitPredictionIndividual predictor = (FloatRegFitPredictionIndividual)inIndividual;
            List <float> errors = new List <float>();

            for (int i = 0; i < _trainerPopulationSize; i++)
            {
                float predictedError = predictor.PredictSolutionFitness(_trainerPopulation[i]);
                // Error is difference between predictedError and the actual fitness
                // of the trainer.
                float error = Math.Abs(predictedError) - Math.Abs(_trainerPopulation[i].GetFitness());
                errors.Add(error);
            }
            predictor.SetFitness(AbsoluteAverageOfErrors(errors));
            predictor.SetErrors(errors);
        }