code: def parabolic_kernel(x, x_i):
      # TODO: docstring
      N = len(x)
      M = len(x_i)
      k = np.zeros((N, M), dtype=np.double)
  
      # boundary case
      np_idx = np.where(x < x_i[0])
      if len(np_idx) > 0:
          k[np_idx, 0] = 1
  
      for m in range(M - 1):
          np_idx = np.where(np.logical_and(x >= x_i[m], x < x_i[m + 1]))
          total_dist = x_i[m + 1] - x_i[m]
          backward_dist = x[np_idx] - x_i[m]
          forward_dist = x_i[m + 1] - x[np_idx]
          k[np_idx, m] = 0.75 * (1 - (backward_dist / total_dist) ** 2)
          k[np_idx, m + 1] = 0.75 * (
              1 - (forward_dist / total_dist) ** 2
          )
  
      # boundary case
      np_idx = np.where(x >= x_i[M - 1])
      if len(np_idx) > 0:
          k[np_idx, M - 1] = 1
  
      # TODO: it is probably not needed
      k = k / np.sum(k, axis=1, keepdims=True)
  
      return k
  
imports: import numpy
label_desc: Use image node_id 4 for calling a global function with example usage: parabolic_kernel(x, x_i) and returns: k