code: def _evaluate_linear(self, indices, norm_distances):
      # slice for broadcasting over trailing dimensions in self.values
      vslice = (slice(None),) + (None,) * (
          self.values.ndim - len(indices)
      )
  
      # find relevant values
      # each i and i+1 represents a edge
      edges = product(*[[i, i + 1] for i in indices])
      values = asarray(0.0)
      for edge_indices in edges:
          weight = asarray(1.0)
          for ei, i, yi in zip(edge_indices, indices, norm_distances):
              weight *= where(ei == i, 1 - yi, yi)
          values += self.values[edge_indices] * weight[vslice]
      return values
  
file_path: jax/jax/_src/third_party/scipy/interpolate.py
imports: from itertools import product
  import scipy.interpolate
  from jax.numpy import asarray, broadcast_arrays, can_cast, empty, nan, searchsorted, where, zeros
  from jax._src.tree_util import register_pytree_node
  from jax._src.numpy.util import check_arraylike, promote_dtypes_inexact, _wraps
label_desc: Use image node_id 3 for calling the RegularGridInterpolator obj's underlying member method code with example usage: obj._evaluate_linear(indices, norm_distances) and returns: values