code: def evaluate_bound(
          distribution,
          x_data,
          parameters=None,
          cache=None,
  ):
      
      assert len(x_data) == len(distribution)
      assert len(x_data.shape) == 2
  
      cache = cache if cache is not None else {}
  
      parameters = load_parameters(
          distribution, "_bnd", parameters=parameters, cache=cache)
  
      out = numpy.zeros((2,) + x_data.shape)
  
      lower, upper = distribution._bnd(x_data.copy(), **parameters)
      out.T[:, :, 0] = numpy.asfarray(lower).T
      out.T[:, :, 1] = numpy.asfarray(upper).T
  
      cache[distribution] = out
  
      return out
docs: Evaluate lower and upper bounds.
  
      Args:
          distribution (Dist):
              Distribution to evaluate.
          x_data (numpy.ndarray):
              Locations for where evaluate bounds at. Relevant in the case of
              multivariate distributions where the bounds are affected by the
              output of other distributions.
          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 lower and upper bounds of ``distribution`` at location
          ``x_data`` using parameters ``parameters``.