static <T> Error<T> of(
		final LossFunction<T> loss,
		final Complexity<T> complexity,
		final DoubleBinaryOperator compose
	) {
		requireNonNull(loss);
		requireNonNull(complexity);
		requireNonNull(compose);

		return (p, c, e) ->
			compose.applyAsDouble(loss.apply(c, e), complexity.apply(p));
	}
Creates an error function by combining the given {@code loss} function
and program {@code complexity}. The loss function and program complexity
is combined in the following way: {@code error = loss + loss*complexity}.
The complexity function penalizes programs which grow to big.

@param <T> the sample type
@param loss the loss function
@param complexity the program complexity measure
@param compose the function which composes the {@code loss} and
       {@code complexity} function
@return a new error function by combining the given loss and complexity
        function
@throws NullPointerException if one of the functions is {@code null}
jenetics.prog/src/main/java/io/jenetics/prog/regression/Error.java