code: def __init__(
      self,
      name: str,
      surrogate: Surrogate,
      datasets: List[SupervisedDataset],
      search_space: SearchSpace,
      metric_names: List[str],
  ) -> None:
      self.name = name
      self.surrogate = surrogate
      self.metric_names = metric_names
      self.datasets = datasets
      self.search_space = search_space
  
      self.results: Dict[int, float] = {}
      self.statuses: Dict[int, TrialStatus] = {}
  
      # If there are log scale parameters, these need to be transformed.
      if any(
          isinstance(p, RangeParameter) and p.log_scale
          for p in search_space.parameters.values()
      ):
          int_to_float_tf = IntToFloat(search_space=search_space)
          log_tf = Log(
              search_space=int_to_float_tf.transform_search_space(
                  search_space.clone()
              )
          )
          self.transforms: Optional[Tuple[IntToFloat, Log]] = (
              int_to_float_tf,
              log_tf,
          )
      else:
          self.transforms = None
  
imports: from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Tuple
  import pandas
  import torch
  from ax.benchmark.benchmark_problem import BenchmarkProblemBase
  from ax.core.base_trial import BaseTrial, TrialStatus
  from ax.core.data import Data
  from ax.core.metric import Metric, MetricFetchE, MetricFetchResult
  from ax.core.observation import ObservationFeatures
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.parameter import RangeParameter
  from ax.core.runner import Runner
  from ax.core.search_space import SearchSpace
  from ax.core.types import TParameterization
  from ax.modelbridge.transforms.int_to_float import IntToFloat
  from ax.modelbridge.transforms.log import Log
  from ax.models.torch.botorch_modular.surrogate import Surrogate
  from ax.utils.common.base import Base
  from ax.utils.common.equality import equality_typechecker
  from ax.utils.common.result import Err, Ok
  from ax.utils.common.serialization import TClassDecoderRegistry, TDecoderRegistry
  from ax.utils.common.typeutils import not_none
  from botorch.utils.datasets import SupervisedDataset
label_desc: Use image node_id 1 to create a new SurrogateRunner object from inherited base classes: Runner with example: obj = SurrogateRunner(name, surrogate, datasets, search_space, metric_names)