class_docstr: GP class for Cartesian Product GPs. 
class_docstr_tok: ["GP","class","for","Cartesian","Product","GPs","."]
docstr: Returns the training kernel matrix. 
docstr_tok: ["Returns","the","training","kernel","matrix","."]
code: def _get_training_kernel_matrix(self):
      """Returns the training kernel matrix."""
      n = len(self.X)
      ret = self.kernel.hyperparams["scale"] * np.ones((n, n))
      for idx, kern in enumerate(self.kernel.kernel_list):
          if self.domain_lists_of_dists[idx] is not None:
              ret *= kern.evaluate_from_dists(
                  self.domain_lists_of_dists[idx]
              )
          else:
              curr_X = get_idxs_from_list_of_lists(self.X, idx)
              ret *= kern(curr_X, curr_X)
      return ret
  
imports: from __future__ import print_function
  from argparse import Namespace
  import numpy
  from ..exd import domains
  from ..exd.cp_domain_utils import load_cp_domain_from_config_file
  from .None import gp_core, mf_gp
  from .euclidean_gp import get_euclidean_integral_gp_kernel_with_scale, prep_euclidean_integral_kernel_hyperparams
  from .kernel import CartesianProductKernel, HammingKernel
  from ..utils.general_utils import get_idxs_from_list_of_lists
  from ..utils.option_handler import get_option_specs, load_options
  from ..utils.reporters import get_reporter
label_desc: Use image node_id 4 for calling the CPGP obj's underlying member method code with example usage: obj._get_training_kernel_matrix() and returns: ret