code: def _base_test_lb_moo_joint_entropy_search(self, estimation_type):
      torch.manual_seed(1)
      tkwargs = {"device": self.device}
  
      for (
          dtype,
          num_objectives,
          use_model_list,
          standardize_model,
      ) in product(
          (torch.float, torch.double),
          (1, 2, 3),
          (False, True),
          (False, True),
      ):
          tkwargs["dtype"] = dtype
          input_dim = 2
          train_X = torch.rand(4, input_dim, **tkwargs)
          train_Y = torch.rand(4, num_objectives, **tkwargs)
  
          model = get_model(
              train_X, train_Y, use_model_list, standardize_model
          )
  
          num_pareto_samples = 3
          num_pareto_points = 4
  
          pareto_sets = dummy_sample_pareto_sets(
              model, num_pareto_samples, num_pareto_points
          )
          pareto_fronts = dummy_sample_pareto_fronts(
              model, num_pareto_samples, num_pareto_points
          )
          hypercell_bounds = compute_sample_box_decomposition(
              pareto_fronts
          )
  
          # test acquisition
          X_pending_list = [None, torch.rand(2, input_dim, **tkwargs)]
          for X_pending in X_pending_list:
              acq = qLowerBoundMultiObjectiveJointEntropySearch(
                  model=model,
                  pareto_sets=pareto_sets,
                  pareto_fronts=pareto_fronts,
                  hypercell_bounds=hypercell_bounds,
                  estimation_type=estimation_type,
                  num_samples=64,
                  X_pending=X_pending,
              )
              self.assertIsInstance(acq.sampler, SobolQMCNormalSampler)
  
              test_Xs = [
                  torch.rand(4, 1, input_dim, **tkwargs),
                  torch.rand(4, 3, input_dim, **tkwargs),
                  torch.rand(4, 5, 1, input_dim, **tkwargs),
                  torch.rand(4, 5, 3, input_dim, **tkwargs),
              ]
  
              for test_X in test_Xs:
                  acq_X = acq(test_X)
                  # assess shape
                  self.assertTrue(acq_X.shape == test_X.shape[:-2])
  
imports: from itertools import product
  import torch
  from botorch.acquisition.multi_objective.joint_entropy_search import LowerBoundMultiObjectiveEntropySearch, qLowerBoundMultiObjectiveJointEntropySearch
  from botorch.acquisition.multi_objective.utils import compute_sample_box_decomposition
  from botorch.exceptions import UnsupportedError
  from botorch.models.gp_regression import SingleTaskGP
  from botorch.models.model_list_gp_regression import ModelListGP
  from botorch.models.transforms.outcome import Standardize
  from botorch.sampling.normal import SobolQMCNormalSampler
  from botorch.utils.testing import BotorchTestCase
label_desc: Use image node_id 1 for calling the TestQLowerBoundMultiObjectiveJointEntropySearch obj's underlying member method code with example usage: obj._base_test_lb_moo_joint_entropy_search(estimation_type) without return types