public static <G extends NumericGene<?, G>> Predicate<EvolutionResult<G, ?>>
	byGeneConvergence(
		final Predicate<DoubleMoments> geneConvergence,
		final double convergedGeneRate
	) {
		return new GeneConvergenceLimit<>(geneConvergence, convergedGeneRate);
	}
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]}
jenetics/src/main/java/io/jenetics/engine/Limits.java