class_docstr: A metric defined by a generic deterministic function, with normal noise
  with mean 0 and mean_sd scale added to the result.
code: def fetch_trial_data(
      self, trial: BaseTrial, noisy: bool = True, **kwargs: Any
  ) -> MetricFetchResult:
      try:
          noise_sd = self.noise_sd if noisy else 0.0
          arm_names = []
          mean = []
          for name, arm in trial.arms_by_name.items():
              arm_names.append(name)
              val = self._evaluate(params=arm.parameters)
              if noise_sd:
                  val = val + noise_sd * np.random.randn()
              mean.append(val)
          # indicate unknown noise level in data
          if noise_sd is None:
              noise_sd = float("nan")
          df = pd.DataFrame(
              {
                  "arm_name": arm_names,
                  "metric_name": self.name,
                  "mean": mean,
                  "sem": noise_sd,
                  "trial_index": trial.index,
                  "n": 10000 / len(arm_names),
                  "frac_nonnull": mean,
              }
          )
  
          return Ok(value=Data(df=df))
  
      except Exception as e:
          return Err(
              MetricFetchE(
                  message=f"Failed to fetch {self.name}", exception=e
              )
          )
  
imports: from __future__ import annotations
  from typing import Any, Callable, List, Optional
  import numpy
  import pandas
  from ax.core.base_trial import BaseTrial
  from ax.core.data import Data
  from ax.core.metric import Metric, MetricFetchE, MetricFetchResult
  from ax.core.types import TParameterization
  from ax.utils.common.result import Err, Ok
label_desc: Use image node_id 4 for calling the NoisyFunctionMetric obj's underlying member method code with example usage: obj.fetch_trial_data(trial, noisy) and returns: Ok, Err