code: def test_TransformObservations(self) -> None:
      # test default transform
      obsd1_t = ObservationData(
          metric_names=["m1", "m2", "m3"],
          means=np.array([0.5, 1.0, -0.5]),
          covariance=np.diag(np.array([1.0, 1.0, 1.0])),
      )
      tf = LogY(
          search_space=None,
          observations=[],
          config={"metrics": ["m3"]},  # pyre-ignore
      )
      obsd1 = deepcopy(self.obsd1)
      obsd1_ = tf._transform_observation_data([obsd1])
      self.assertTrue(np.allclose(obsd1_[0].means, obsd1_t.means))
      self.assertTrue(
          np.allclose(obsd1_[0].covariance, obsd1_t.covariance)
      )
  
      obsd1 = tf._untransform_observation_data(obsd1_)
      self.assertTrue(np.allclose(obsd1[0].means, self.obsd1.means))
      self.assertTrue(
          np.allclose(obsd1[0].covariance, self.obsd1.covariance)
      )
  
      # test raise on non-independent noise
      obsd1_ = deepcopy(self.obsd1)
      obsd1_.covariance[0, 2] = 0.1
      obsd1_.covariance[2, 0] = 0.1
      with self.assertRaises(NotImplementedError):
          tf._transform_observation_data([obsd1_])
      # test full covariance for single metric
      Z = np.zeros((3, 3))
      Z[0, 2] = np.sqrt(np.exp(1)) - 1
      Z[2, 0] = np.sqrt(np.exp(1)) - 1
      obsd1 = ObservationData(
          metric_names=["m3", "m3", "m3"],
          means=np.ones(3),
          covariance=np.diag(np.ones(3) * (np.exp(1) - 1)) + Z,
      )
      obsd1_ = tf._transform_observation_data([obsd1])
      cov_expected = np.array(
          [[1.0, 0.0, 0.5], [0.0, 1.0, 0.0], [0.5, 0.0, 1.0]]
      )
      self.assertTrue(np.allclose(obsd1_[0].means, -0.5 * np.ones(3)))
      self.assertTrue(np.allclose(obsd1_[0].covariance, cov_expected))
  
imports: import math
  from copy import deepcopy
  import numpy
  from ax.core.metric import Metric
  from ax.core.objective import MultiObjective, Objective
  from ax.core.observation import Observation, ObservationData, ObservationFeatures
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold, OutcomeConstraint
  from ax.core.types import ComparisonOp
  from ax.modelbridge.transforms.log_y import lognorm_to_norm, LogY, match_ci_width, norm_to_lognorm
  from ax.utils.common.testutils import TestCase
label_desc: Use image node_id 4 for calling the LogYTransformTest obj's underlying member method code with example usage: obj.test_TransformObservations() without return types