code: def fill_missing_thresholds_from_nadir(
      experiment: Experiment, optimization_config: OptimizationConfig
  ) -> List[ObjectiveThreshold]:
      r"""Get the objective thresholds from the optimization config and
      fill the missing thresholds based on the nadir point.
  
      Args:
          experiment: The experiment, whose data is used to calculate the nadir point.
          optimization_config: Optimization config to get the objective thresholds
              and the objective directions from.
  
      Returns:
          A list of objective thresholds, one for each objective in
          optimization config.
      """
      objectives = checked_cast(
          MultiObjective, optimization_config.objective
      ).objectives
      optimization_config = checked_cast(
          MultiObjectiveOptimizationConfig, optimization_config
      )
      provided_thresholds = {
          obj_t.metric.name: obj_t
          for obj_t in optimization_config.objective_thresholds
      }
      objective_thresholds = [
          provided_thresholds[objective.metric.name]
          if objective.metric.name in provided_thresholds
          else _objective_threshold_from_nadir(
              experiment=experiment,
              objective=objective,
              optimization_config=optimization_config,
          )
          for objective in objectives
      ]
      return objective_thresholds
  
imports: from collections import OrderedDict
  from functools import reduce
  from logging import Logger
  from typing import Dict, Iterable, List, Optional, Tuple, Type
  import pandas
  import torch
  from ax.core.base_trial import 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, Objective, ScalarizedObjective
  from ax.core.observation import Observation
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold, OutcomeConstraint
  from ax.core.trial import Trial
  from ax.core.types import ComparisonOp, TModelPredictArm, TParameterization
  from ax.exceptions.core import UnsupportedError, UserInputError
  from ax.modelbridge.base import ModelBridge
  from ax.modelbridge.cross_validation import assess_model_fit, compute_diagnostics, cross_validate
  from ax.modelbridge.generation_strategy import GenerationStrategy
  from ax.modelbridge.modelbridge_utils import observed_pareto_frontier, predicted_pareto_frontier
  from ax.modelbridge.registry import get_model_from_generator_run, ModelRegistryBase, Models
  from ax.modelbridge.torch import TorchModelBridge
  from ax.modelbridge.transforms.utils import derelativize_optimization_config_with_raw_status_quo
  from ax.plot.pareto_utils import get_tensor_converter_model
  from ax.utils.common.logger import get_logger
  from ax.utils.common.typeutils import checked_cast, not_none
  from numpy import NaN
  from torch import Tensor
label_desc: Use image node_id 20 for calling a global function with example usage: fill_missing_thresholds_from_nadir(experiment, optimization_config) and returns: objective_thresholds