code: def get_mf_hartmann_function_data(fidel_dim, domain_dim):
      """Returns a function f(z, x). z refers to the fidelity and x is the point in the
      domain."""
      A, P, alpha, opt_pt, domain_bounds, max_val = _get_hartmann_data(
          domain_dim
      )
      # This is how much we will perturb the alphas
      delta = np.array([0.1] * fidel_dim + [0] * (4 - fidel_dim))
  
      # Define a wrapper for the mf objective
      def mf_hart_obj(z, x):
          """Wrapper for the mf hartmann objective. z is fidelity and x is domain."""
          assert len(z) == fidel_dim
          z_extended = np.append(z, [0] * (4 - fidel_dim))
          alpha_z = alpha - (1 - z_extended) * delta
          return hartmann(x, alpha_z, A, P, max_val)
  
      # Define a wrapper for the sf objective
      def hart_obj(x):
          """Wrapper for the hartmann objective. z is fidelity and x is domain."""
          return hartmann(x, alpha, A, P, max_val)
  
      # Define the optimum fidelity and the fidelity bounds
      fidel_to_opt = np.ones(fidel_dim)
      fidel_bounds = [[0, 1]] * fidel_dim
      opt_val = hart_obj(opt_pt)
      return (
          mf_hart_obj,
          hart_obj,
          opt_pt,
          opt_val,
          fidel_to_opt,
          fidel_bounds,
          domain_bounds,
      )
  
imports: from __future__ import division
  import numpy
  from .general_utils import map_to_cube
  from ..exd.experiment_caller import EuclideanFunctionCaller
label_desc: Use image node_id 3 for calling a global function with example usage: get_mf_hartmann_function_data(fidel_dim, domain_dim) and returns: mf_hart_obj,  hart_obj,  opt_pt,  opt_val,  fidel_to_opt,  fidel_bounds,  domain_bounds, hartmann, hartmann