class_docstr: Benchmark problem, represented in terms of Ax search space, optimization
  config, and runner.
code: def __init__(
      self,
      name: str,
      search_space: SearchSpace,
      optimization_config: OptimizationConfig,
      runner: Runner,
      num_trials: int,
      infer_noise: bool,
      tracking_metrics: Optional[List[Metric]] = None,
  ) -> None:
      self.name = name
      self.search_space = search_space
      self.optimization_config = optimization_config
      self._runner = runner
      self.num_trials = num_trials
      self.infer_noise = infer_noise
      self.tracking_metrics: List[Metric] = (
          [] if tracking_metrics is None else tracking_metrics
      )
  
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 1 to create a new BenchmarkProblem object from inherited base classes: Base with example: obj = BenchmarkProblem(name, search_space, optimization_config, runner, num_trials, infer_noise, tracking_metrics)