<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def evaluate_forward( distribution, x_data, parameters=None, cache=None, ):
 """ Evaluate forward Rosenblatt transformation. Args: distribution (Dist):
 Distribution to evaluate. x_data (numpy.ndarray):
 Locations for where evaluate forward transformation at. parameters (:py:data:typing.Any):
 Collection of parameters to override the default ones in the distribution. cache (:py:data:typing.Any):
 A collection of previous calculations in case the same distribution turns up on more than one occasion. Returns: The cumulative distribution values of ``distribution`` at location ``x_data`` using parameters ``parameters``. """

    assert len(x_data) == len(distribution), (
        "distribution %s is not of length %d" % (distribution, len(x_data)))
    assert hasattr(distribution, "_cdf"), (
        "distribution require the `_cdf` method to function.")

    cache = cache if cache is not None else {}

    parameters = load_parameters(
        distribution, "_cdf", parameters=parameters, cache=cache)

    # Store cache.
    cache[distribution] = x_data

    # Evaluate forward function.
    out = numpy.zeros(x_data.shape)
    out[:] = distribution._cdf(x_data, **parameters)

    return out