class_docstr: Does Bayesian optimization with Latent Context Embedding Additive (LCE-A) GP.
  The parameter space decomposition must be provided.
  
  Args:
      decomposition: Keys are context names. Values are the lists of parameter
          names belong to the context, e.g.
          {'context1': ['p1_c1', 'p2_c1'],'context2': ['p1_c2', 'p2_c2']}.
      gp_model_args: Dictionary of kwargs to pass to GP model training.
          - train_embedding: Boolen. If true, we will train context embedding;
          otherwise, we use pre-trained embeddings from embds_feature_dict only.
          Default is True.
code: def fit(
      self,
      datasets: List[SupervisedDataset],
      metric_names: List[str],
      search_space_digest: SearchSpaceDigest,
      candidate_metadata: Optional[
          List[List[TCandidateMetadata]]
      ] = None,
  ) -> None:
      if len(search_space_digest.feature_names) == 0:
          raise ValueError("feature names are required for LCEABO")
      self.feature_names = search_space_digest.feature_names
      super().fit(
          datasets=datasets,
          metric_names=metric_names,
          search_space_digest=search_space_digest,
      )
  
imports: from logging import Logger
  from typing import Any, cast, Dict, List, Optional, Tuple, Union
  from ax.core.search_space import SearchSpaceDigest
  from ax.core.types import TCandidateMetadata
  from ax.models.torch.alebo import ei_or_nei
  from ax.models.torch.botorch import BotorchModel
  from ax.models.torch.cbo_sac import generate_model_space_decomposition
  from ax.models.torch_base import TorchModel, TorchOptConfig
  from ax.utils.common.docutils import copy_doc
  from ax.utils.common.logger import get_logger
  from botorch.fit import fit_gpytorch_mll
  from botorch.models.contextual import LCEAGP
  from botorch.models.gpytorch import GPyTorchModel
  from botorch.models.model_list_gp_regression import ModelListGP
  from botorch.utils.datasets import SupervisedDataset
  from gpytorch.mlls.exact_marginal_log_likelihood import ExactMarginalLogLikelihood
  from torch import Tensor
label_desc: Use image node_id 2 for calling the LCEABO obj's underlying member method code with example usage: obj.fit(datasets, metric_names, search_space_digest, candidate_metadata) without return types