code: def _create_approximate_models() -> (
      Tuple[
          gpflow.models.VGP,
          gpflow.models.SVGP,
          gpflow.models.SVGP,
          gpflow.models.SGPR,
          gpflow.models.GPRFITC,
      ]
  ):
      """
      1) Variational GP (with the likelihood set to Gaussian)
      2) Sparse variational GP (likelihood is Gaussian, inducing points
         at the data)
      3) Sparse variational GP (as above, but with the whitening rotation
         of the inducing variables)
      4) Sparse variational GP Regression (as above, but there the inducing
         variables are 'collapsed' out, as in Titsias 2009)
      5) FITC Sparse GP Regression
      """
      model_1 = gpflow.models.VGP(
          (Datum.X, Datum.Y),
          kernel=gpflow.kernels.SquaredExponential(),
          likelihood=gpflow.likelihoods.Gaussian(),
          mean_function=gpflow.mean_functions.Constant(),
      )
  
      model_2 = gpflow.models.SVGP(
          kernel=gpflow.kernels.SquaredExponential(),
          likelihood=gpflow.likelihoods.Gaussian(),
          inducing_variable=Datum.X.copy(),
          q_diag=False,
          whiten=False,
          mean_function=gpflow.mean_functions.Constant(),
          num_latent_gps=Datum.Y.shape[1],
      )
      gpflow.set_trainable(model_2.inducing_variable, False)
  
      model_3 = gpflow.models.SVGP(
          kernel=gpflow.kernels.SquaredExponential(),
          likelihood=gpflow.likelihoods.Gaussian(),
          inducing_variable=Datum.X.copy(),
          q_diag=False,
          whiten=True,
          mean_function=gpflow.mean_functions.Constant(),
          num_latent_gps=Datum.Y.shape[1],
      )
      gpflow.set_trainable(model_3.inducing_variable, False)
  
      model_4 = gpflow.models.SGPR(
          (Datum.X, Datum.Y),
          kernel=gpflow.kernels.SquaredExponential(),
          inducing_variable=Datum.X.copy(),
          mean_function=Constant(),
      )
      gpflow.set_trainable(model_4.inducing_variable, False)
  
      model_5 = gpflow.models.GPRFITC(
          (Datum.X, Datum.Y),
          kernel=gpflow.kernels.SquaredExponential(),
          inducing_variable=Datum.X.copy(),
          mean_function=Constant(),
      )
      gpflow.set_trainable(model_5.inducing_variable, False)
  
      return model_1, model_2, model_3, model_4, model_5
  
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 2 for calling a global function with example usage: _create_approximate_models() and returns: model_1,  model_2,  model_3,  model_4,  model_5