code: def _get_auto_winsorization_cutoffs_multi_objective(
      optimization_config: OptimizationConfig,
      metric_name: str,
      metric_values: List[float],
  ) -> Tuple[float, float]:
      # We approach a multi-objective metric the same as output constraints. It may be
      # worth investigating setting the winsorization cutoffs based on the Pareto
      # frontier in the future.
      optimization_config = checked_cast(
          MultiObjectiveOptimizationConfig, optimization_config
      )
      objective_threshold = _get_objective_threshold_from_moo_config(
          optimization_config=optimization_config,
          metric_name=metric_name,
      )
      if objective_threshold:
          return _get_auto_winsorization_cutoffs_outcome_constraint(
              metric_values=metric_values,
              outcome_constraints=objective_threshold,
          )
      else:
          warnings.warn(
              "Encountered a `MultiObjective` without objective thresholds. We will "
              "winsorize each objective separately. We strongly recommend specifying "
              "the objective thresholds when using multi-objective optimization."
          )
          objectives = checked_cast(
              MultiObjective, optimization_config.objective
          )
          minimize = [
              objective.minimize
              for objective in objectives.objectives
              if objective.metric.name == metric_name
          ][0]
          return _get_auto_winsorization_cutoffs_single_objective(
              metric_values=metric_values,
              minimize=minimize,
          )
  
imports: import warnings
  from logging import Logger
  from typing import Dict, List, Optional, Tuple, TYPE_CHECKING, Union
  import numpy
  from ax.core.objective import MultiObjective, ScalarizedObjective
  from ax.core.observation import Observation, ObservationData
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ComparisonOp, ObjectiveThreshold, OutcomeConstraint, ScalarizedOutcomeConstraint
  from ax.core.search_space import SearchSpace
  from ax.exceptions.core import DataRequiredError, UnsupportedError, UserInputError
  from ax.modelbridge.transforms.base import Transform
  from ax.modelbridge.transforms.utils import derelativize_optimization_config_with_raw_status_quo, get_data
  from ax.models.types import TConfig, WinsorizationConfig
  from ax.utils.common.logger import get_logger
  from ax.utils.common.typeutils import checked_cast
label_desc: Use image node_id 2 for calling a global function with example usage: _get_auto_winsorization_cutoffs_multi_objective(optimization_config, metric_name, metric_values) and returns: _get_auto_winsorization_cutoffs_outcome_constraint, _get_auto_winsorization_cutoffs_single_objective