code: public static <G extends NumericGene<?, G>> Predicate<EvolutionResult<G, ?>>
  	byGeneConvergence(
  		final Predicate<DoubleMoments> geneConvergence,
  		final double convergedGeneRate
  	) {
  		return new GeneConvergenceLimit<>(geneConvergence, 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,
  if the {@code geneConvergence} {@code Predicate<DoubleMoments>} for this
  gene returns {@code true}.
  
  @since 4.0
  @see #byGeneConvergence(double, double)
  
  @param geneConvergence predicate which defines when a gene is deemed as
  converged, by using the statistics of this gene over all genotypes
  of the population
  @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 NullPointerException if the given gene convergence predicate is
  {@code null}
  @throws IllegalArgumentException if the {@code convergedGeneRate} is not
  within the range {@code [0, 1]}