@Override
    public NumberStatistics.Builder<G, R> evaluate(
        final Iterable<? extends Phenotype<G, R>> population,
        final int generation,
        final Optimize opt) {
      final Builder<G, R> builder = new Builder<>();
      builder.generation(generation);
      builder.optimize(opt);

      final MinMax<Phenotype<G, R>> minMax = new MinMax<>();
      final Variance<Integer> age = new Variance<>();
      final Variance<R> fitness = new Variance<>();

      accumulators.<Phenotype<G, R>>accumulate(
          population,
          minMax,
          age.map(Phenotype.Age(generation)),
          fitness.map(Phenotype.<R>Fitness()));
      builder.bestPhenotype(opt.best(minMax.getMax(), minMax.getMin()));
      builder.worstPhenotype(opt.worst(minMax.getMax(), minMax.getMin()));
      builder.fitnessMean(fitness.getMean());
      builder.fitnessVariance(fitness.getVariance());
      builder.samples((int) minMax.getSamples());
      builder.ageMean(age.getMean());
      builder.ageVariance(age.getVariance());
      builder.standardError(fitness.getStandardError());

      return builder;
    }