code: def _create_vgp_model(
      kernel: Kernel,
      likelihood: Likelihood,
      q_mu: Optional[TensorType] = None,
      q_sqrt: Optional[TensorType] = None,
  ) -> gpflow.models.VGP:
      model_vgp = gpflow.models.VGP(
          (DatumVGP.X, DatumVGP.Y), kernel, likelihood
      )
      if q_mu is not None and q_sqrt is not None:
          model_vgp.q_mu.assign(q_mu)
          model_vgp.q_sqrt.assign(q_sqrt)
      return model_vgp
  
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 3 for calling a global function with example usage: _create_vgp_model(kernel, likelihood, q_mu, q_sqrt) and returns: model_vgp