class_docstr: A BenchmarkProblem support multiple objectives. Rather than knowing each
  objective's optimal value we track a known maximum hypervolume computed from a
  given reference point.
docstr: Create a BenchmarkProblem from a BoTorch BaseTestProblem using specialized
  Metrics and Runners. The test problem's result will be computed on the Runner
  once per trial and each Metric will retrieve its own result by index.
code: def from_botorch_multi_objective(
      cls,
      test_problem_class: Type[MultiObjectiveTestProblem],
      test_problem_kwargs: Dict[str, Any],
      num_trials: int,
      infer_noise: bool = True,
  ) -> "MultiObjectiveBenchmarkProblem":
      """Create a BenchmarkProblem from a BoTorch BaseTestProblem using specialized
      Metrics and Runners. The test problem's result will be computed on the Runner
      once per trial and each Metric will retrieve its own result by index.
      """
  
      # pyre-fixme [45]: Invalid class instantiation
      test_problem = test_problem_class(**test_problem_kwargs)
  
      problem = BenchmarkProblem.from_botorch(
          test_problem_class=test_problem_class,
          test_problem_kwargs=test_problem_kwargs,
          num_trials=num_trials,
          infer_noise=infer_noise,
      )
  
      dim = test_problem_kwargs.get("dim", None)
      name = _get_name(test_problem, infer_noise, dim)
  
      n_obj = test_problem.num_objectives
      if infer_noise:
          noise_sds = [None] * n_obj
      elif isinstance(test_problem.noise_std, list):
          noise_sds = test_problem.noise_std
      else:
          noise_sds = [
              checked_cast(float, test_problem.noise_std or 0.0)
          ] * n_obj
  
      metrics = [
          BotorchTestProblemMetric(
              name=f"{name}_{i}",
              noise_sd=noise_sd,
              index=i,
          )
          for i, noise_sd in enumerate(noise_sds)
      ]
      optimization_config = MultiObjectiveOptimizationConfig(
          objective=MultiObjective(
              objectives=[
                  Objective(
                      metric=metric,
                      minimize=True,
                  )
                  for metric in metrics
              ]
          ),
          objective_thresholds=[
              ObjectiveThreshold(
                  metric=metrics[i],
                  bound=test_problem.ref_point[i].item(),
                  relative=False,
                  op=ComparisonOp.LEQ,
              )
              for i in range(test_problem.num_objectives)
          ],
      )
  
      return cls(
          name=name,
          search_space=problem.search_space,
          optimization_config=optimization_config,
          runner=problem.runner,
          num_trials=num_trials,
          infer_noise=infer_noise,
          maximum_hypervolume=test_problem.max_hv,
          reference_point=test_problem._ref_point,
      )
  
imports: import abc
  from typing import Any, Dict, List, Optional, Protocol, runtime_checkable, Type
  from ax.core.metric import Metric
  from ax.core.objective import MultiObjective, Objective
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, ObjectiveThreshold, OptimizationConfig
  from ax.core.outcome_constraint import OutcomeConstraint
  from ax.core.parameter import ParameterType, RangeParameter
  from ax.core.runner import Runner
  from ax.core.search_space import SearchSpace
  from ax.core.types import ComparisonOp
  from ax.metrics.botorch_test_problem import BotorchTestProblemMetric
  from ax.runners.botorch_test_problem import BotorchTestProblemRunner
  from ax.utils.common.base import Base
  from ax.utils.common.typeutils import checked_cast
  from botorch.test_functions.base import BaseTestProblem, ConstrainedBaseTestProblem
  from botorch.test_functions.multi_objective import MultiObjectiveTestProblem
  from botorch.test_functions.synthetic import SyntheticTestFunction
label_desc: Use image node_id 3 for calling the MultiObjectiveBenchmarkProblem obj's underlying member method code with example usage: obj.from_botorch_multi_objective(cls, test_problem_class, test_problem_kwargs, num_trials, infer_noise) and returns: cls