code: def _get_missing_arm_trial_pairs(
      data: Data, metric_name: str
  ) -> Set[TArmTrial]:
      """Return arm_name and trial_index pairs missing a specified metric."""
      metric_df = data.df[data.df.metric_name == metric_name]
      present_metric_df = metric_df[metric_df["mean"].notnull()]
      arm_trial_pairs = set(
          zip(data.df["arm_name"], data.df["trial_index"])
      )
      arm_trial_pairs_with_metric = set(
          zip(
              present_metric_df["arm_name"],
              present_metric_df["trial_index"],
          )
      )
      missing_arm_trial_pairs = arm_trial_pairs.difference(
          arm_trial_pairs_with_metric
      )
      return missing_arm_trial_pairs
  
imports: from collections import defaultdict
  from typing import Dict, Iterable, List, NamedTuple, Optional, Set, Tuple
  import numpy
  from ax.core.arm import Arm
  from ax.core.base_trial import BaseTrial, TrialStatus
  from ax.core.batch_trial import BatchTrial
  from ax.core.data import Data
  from ax.core.experiment import Experiment
  from ax.core.generator_run import GeneratorRun
  from ax.core.objective import MultiObjective
  from ax.core.observation import ObservationFeatures
  from ax.core.optimization_config import OptimizationConfig
  from ax.core.trial import Trial
  from ax.core.types import ComparisonOp
  from ax.utils.common.typeutils import not_none
  from pyre_extensions import none_throws
label_desc: Use image node_id 3 for calling a global function with example usage: _get_missing_arm_trial_pairs(data, metric_name) and returns: missing_arm_trial_pairs