code: public static <G extends NumericGene<?, G>> Predicate<EvolutionResult<G, ?>>
  	byGeneConvergence(
  		final double convergenceRate,
  		final double convergedGeneRate
  	) {
  		return byGeneConvergence(
  			stat -> stat.getMax()*convergenceRate <= stat.getMean(),
  			convergedGeneRate
  		);
  	}
docs: A termination method that stops the evolution when a user-specified
  percentage of the genes ({@code convergedGeneRage}) that make up a
  {@code Genotype} are deemed as converged. A gene is deemed as converged
  when the average value of that gene across all of the genotypes in the
  current population is less than a user-specified percentage
  ({@code convergenceRate}) away from the maximum gene value across the
  genotypes.
  <p>
  This method is equivalent the following code snippet:
  <pre>{@code
  final Predicate<EvolutionResult<DoubleGene, ?>> limit =
  byGeneConvergence(
  stat -> stat.getMax()*convergenceRate <= stat.getMean(),
  convergedGeneRate
  );
  }</pre>
  
  @since 4.0
  @see #byGeneConvergence(Predicate, double)
  
  @param convergenceRate the relative distance of the average gene value
  to its maximum value
  @param convergedGeneRate the percentage of genes which must be converged
  for truncating the evolution stream
  @param <G> the gene type
  @return a new gene convergence predicate
  @throws IllegalArgumentException if the {@code convergedGeneRate} or
  {@code convergenceRate} are not within the range {@code [0, 1]}