class_docstr: Apply (natural) log-transform to Y.
  
  This essentially means that we are model the observations as log-normally
  distributed. If `config` specifies `match_ci_width=True`, use a matching
  procedure based on the width of the CIs, otherwise (the default), use the
  delta method,
  
  Transform is applied only for the metrics specified in the transform config.
  Transform is done in-place.
code: def __init__(
      self,
      search_space: Optional[SearchSpace] = None,
      observations: Optional[List[Observation]] = None,
      modelbridge: Optional["base_modelbridge.ModelBridge"] = None,
      config: Optional[TConfig] = None,
  ) -> None:
      if config is None:
          raise ValueError("LogY requires a config.")
      # pyre-fixme[6]: Expected `Iterable[Variable[_T]]` for 1st param but got
      #  `Union[List[Variable[_T]],
      #  botorch.acquisition.acquisition.AcquisitionFunction, float, int, str]`.
      metric_names = list(config.get("metrics", []))
      if len(metric_names) == 0:
          raise ValueError(
              "Must specify at least one metric in the config."
          )
      super().__init__(
          search_space=search_space,
          observations=observations,
          config=config,
      )
      # pyre-fixme[4]: Attribute must be annotated.
      self.metric_names = metric_names
      if config.get("match_ci_width", False):
          # perform moment-matching to compute variance that results in a CI
          # of same width as the when transforming the moments
          # pyre-fixme[4]: Attribute must be annotated.
          self._transform = lambda m, v: match_ci_width(m, v, np.log)
          # pyre-fixme[4]: Attribute must be annotated.
          self._untransform = lambda m, v: match_ci_width(m, v, np.exp)
      else:
          self._transform = lognorm_to_norm
          self._untransform = norm_to_lognorm
  
imports: from __future__ import annotations
  from logging import Logger
  from typing import Callable, List, Optional, Tuple, TYPE_CHECKING
  import numpy
  from ax.core.observation import Observation, ObservationData, ObservationFeatures
  from ax.core.optimization_config import OptimizationConfig
  from ax.core.outcome_constraint import OutcomeConstraint
  from ax.core.search_space import SearchSpace
  from ax.modelbridge.transforms.base import Transform
  from ax.models.types import TConfig
  from ax.utils.common.logger import get_logger
  from scipy.stats import norm
label_desc: Use image node_id 1 to create a new LogY object from inherited base classes: Transform with example: obj = LogY(search_space, observations, modelbridge, config)