code: def test_upper_bound_few_inducing_points() -> None:
      """
      Test for upper bound for regression marginal likelihood
      """
      model_vfe = gpflow.models.SGPR(
          (DatumUpper.X, DatumUpper.Y),
          gpflow.kernels.SquaredExponential(),
          inducing_variable=DatumUpper.X[:10, :].copy(),
          mean_function=Constant(),
          likelihood=gpflow.likelihoods.Gaussian(
              scale=gpflow.functions.Linear()
          ),
      )
      opt = gpflow.optimizers.Scipy()
  
      opt.minimize(
          model_vfe.training_loss,
          variables=model_vfe.trainable_variables,
          options=dict(maxiter=500),
      )
  
      full_gp = gpflow.models.GPR(
          (DatumUpper.X, DatumUpper.Y),
          kernel=model_vfe.kernel,
          mean_function=model_vfe.mean_function,
          likelihood=model_vfe.likelihood,
      )
  
      lml_upper = model_vfe.upper_bound()
      lml_vfe = model_vfe.elbo()
      lml_full_gp = full_gp.log_marginal_likelihood()
  
      assert lml_vfe < lml_full_gp
      assert lml_full_gp < lml_upper
  
imports: from typing import Optional, Tuple
  import numpy
  import pytest
  from check_shapes import ShapeChecker
  from numpy.testing import assert_allclose
  import gpflow
  from gpflow.base import AnyNDArray, TensorType
  from gpflow.config import default_jitter
  from gpflow.kernels import Kernel
  from gpflow.likelihoods import Likelihood
  from gpflow.mean_functions import Constant
  from gpflow.models import GPModel, maximum_log_likelihood_objective, training_loss_closure
label_desc: Use image node_id 9 for calling a global function with example usage: test_upper_bound_few_inducing_points() without return types