class_docstr: GP class for Cartesian Product GPs. 
class_docstr_tok: ["GP","class","for","Cartesian","Product","GPs","."]
docstr: Constructor
  X, Y: data
  kernel: a kernel object
docstr_tok: ["Constructor","X",",","Y",":","data","kernel",":","a","kernel","object"]
code: def __init__(
      self,
      X,
      Y,
      kernel,
      mean_func,
      noise_var,
      domain_lists_of_dists=None,
      build_posterior=True,
      reporter=None,
      handle_non_psd_kernels="project_first",
  ):
      """
      Constructor
      X, Y: data
      kernel: a kernel object
      """
      if domain_lists_of_dists is None:
          domain_lists_of_dists = [None] * kernel.num_kernels
      self.domain_lists_of_dists = domain_lists_of_dists
      super(CPGP, self).__init__(
          X,
          Y,
          kernel,
          mean_func,
          noise_var,
          build_posterior,
          reporter,
          handle_non_psd_kernels,
      )
  
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 1 to create a new CPGP object from inherited base classes: gp_core with example: obj = CPGP(X, Y, kernel, mean_func, noise_var, domain_lists_of_dists, build_posterior, reporter, handle_non_psd_kernels)