code: def setUp(self) -> None:
      self.outcomes = ["outcome_1", "outcome_2"]
      self.mll_class = ExactMarginalLogLikelihood
      self.dtype = torch.double
      self.task_features = [0]
      (
          Xs1,
          Ys1,
          Yvars1,
          self.bounds,
          _,
          self.feature_names,
          _,
      ) = get_torch_test_data(
          dtype=self.dtype, task_features=self.task_features, offset=1.0
      )
      self.search_space_digest = SearchSpaceDigest(
          feature_names=self.feature_names,
          bounds=self.bounds,
          task_features=self.task_features,
      )
      self.ds1 = SupervisedDataset(
          X=Xs1[0],
          Y=Ys1[0],
          Yvar=Yvars1[0],
          feature_names=self.feature_names,
          outcome_names=self.outcomes[:1],
      )
      Xs2, Ys2, Yvars2, _, _, _, _ = get_torch_test_data(
          dtype=self.dtype,
          task_features=self.search_space_digest.task_features,
      )
      ds2 = SupervisedDataset(
          X=Xs2[0],
          Y=Ys2[0],
          Yvar=Yvars2[0],
          feature_names=self.feature_names,
          outcome_names=self.outcomes[1:],
      )
      self.botorch_submodel_class_per_outcome = {
          self.outcomes[0]: choose_model_class(
              datasets=[self.ds1],
              search_space_digest=self.search_space_digest,
          ),
          self.outcomes[1]: choose_model_class(
              datasets=[ds2],
              search_space_digest=self.search_space_digest,
          ),
      }
      self.botorch_model_class = MultiTaskGP
      for (
          submodel_cls
      ) in self.botorch_submodel_class_per_outcome.values():
          self.assertEqual(submodel_cls, MultiTaskGP)
      self.ds3 = SupervisedDataset(
          X=Xs1[0],
          Y=Ys2[0],
          Yvar=Yvars2[0],
          feature_names=self.feature_names,
          outcome_names=self.outcomes[1:],
      )
      self.Xs = Xs1 + Xs2
      self.Ys = Ys1 + Ys2
      self.Yvars = Yvars1 + Yvars2
      self.fixed_noise_training_data = [self.ds1, ds2]
      self.supervised_training_data = [
          SupervisedDataset(
              X=ds.X,
              Y=ds.Y,
              feature_names=ds.feature_names,
              outcome_names=ds.outcome_names,
          )
          for ds in self.fixed_noise_training_data
      ]
      self.submodel_options_per_outcome = {
          RANK: 1,
      }
      self.surrogate = Surrogate(
          botorch_model_class=MultiTaskGP,
          mll_class=self.mll_class,
          model_options=self.submodel_options_per_outcome,
      )
  
imports: import dataclasses
  import math
  from typing import Any, Dict, OrderedDict, Tuple, Type
  from unittest.mock import MagicMock, Mock, patch
  import numpy
  import torch
  from ax.core.search_space import RobustSearchSpaceDigest, SearchSpaceDigest
  from ax.exceptions.core import UserInputError
  from ax.models.torch.botorch_modular.acquisition import Acquisition
  from ax.models.torch.botorch_modular.surrogate import Surrogate
  from ax.models.torch.botorch_modular.utils import choose_model_class, fit_botorch_model
  from ax.models.torch_base import TorchOptConfig
  from ax.utils.common.constants import Keys
  from ax.utils.common.testutils import TestCase
  from ax.utils.common.typeutils import checked_cast, not_none
  from ax.utils.testing.mock import fast_botorch_optimize
  from ax.utils.testing.torch_stubs import get_torch_test_data
  from ax.utils.testing.utils import generic_equals
  from botorch.acquisition.monte_carlo import qSimpleRegret
  from botorch.models import ModelListGP, SaasFullyBayesianSingleTaskGP, SingleTaskGP
  from botorch.models.deterministic import GenericDeterministicModel
  from botorch.models.fully_bayesian_multitask import SaasFullyBayesianMultiTaskGP
  from botorch.models.gp_regression_mixed import MixedSingleTaskGP
  from botorch.models.model import Model, ModelList
  from botorch.models.multitask import MultiTaskGP
  from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood
  from botorch.models.transforms.input import InputPerturbation, Normalize
  from botorch.models.transforms.outcome import Standardize
  from botorch.sampling.normal import SobolQMCNormalSampler
  from botorch.utils.datasets import SupervisedDataset
  from gpytorch.constraints import GreaterThan, Interval
  from gpytorch.kernels import Kernel, MaternKernel, RBFKernel, ScaleKernel
  from gpytorch.likelihoods import FixedNoiseGaussianLikelihood, GaussianLikelihood
  from gpytorch.mlls import ExactMarginalLogLikelihood, LeaveOneOutPseudoLikelihood
  from torch import Tensor
  from torch.nn import ModuleList
label_desc: Use image node_id 1 for calling the SurrogateWithModelListTest obj's underlying member method code with example usage: obj.setUp() without return types