code: def test_multi_scale_inducing_equivalence_inducing_points(
      N: int, M: int, D: int
  ) -> None:
      # Multiscale must be equivalent to inducing points when variance is zero
      Xnew, Z = np.random.randn(N, D), np.random.randn(M, D)
      rbf = gpflow.kernels.SquaredExponential(
          1.3441, lengthscales=np.random.uniform(0.5, 3.0, D)
      )
      inducing_variable_zero_lengthscales = Multiscale(
          Z, scales=np.zeros(Z.shape) + 1e-10
      )
      inducing_variable_inducing_point = InducingPoints(Z)
  
      multi_scale_Kuf = Kuf(
          inducing_variable_zero_lengthscales, rbf, Xnew
      )
      inducing_point_Kuf = Kuf(
          inducing_variable_inducing_point, rbf, Xnew
      )
  
      relative_error_Kuf = (
          np.abs(multi_scale_Kuf - inducing_point_Kuf)
          / inducing_point_Kuf
      )
      assert np.max(relative_error_Kuf) < 0.1e-2  # 0.1 %
  
      multi_scale_Kuu = Kuu(inducing_variable_zero_lengthscales, rbf)
      inducing_point_Kuu = Kuu(inducing_variable_inducing_point, rbf)
  
      relative_error_Kuu = (
          np.abs(multi_scale_Kuu - inducing_point_Kuu)
          / inducing_point_Kuu
      )
      assert np.max(relative_error_Kuu) < 0.1e-2
  
file_path: GPflow/tests/gpflow/covariances/test_base_covariances.py
imports: import numpy
  import pytest
  from numpy.testing import assert_allclose
  import gpflow
  from gpflow.config import default_jitter
  from gpflow.covariances import Kuf, Kuu
  from gpflow.inducing_variables import InducingPatches, InducingPoints, InducingVariables, Multiscale
  from gpflow.kernels import Kernel
label_desc: Use image node_id 3 for calling a global function with example usage: test_multi_scale_inducing_equivalence_inducing_points(N, M, D) without return types