code: def test_winsorize_outcome_constraints(self) -> None:
      metric_values = [-100, 0, 1, 2, 3, 4, 5, 6, 7, 50]
      ma, mb = Metric(name="a"), Metric(name="b")
      outcome_constraint_leq = OutcomeConstraint(
          metric=ma, op=ComparisonOp.LEQ, bound=10, relative=False
      )
      outcome_constraint_geq = OutcomeConstraint(
          metric=mb, op=ComparisonOp.GEQ, bound=-9, relative=False
      )
      # From above with a loose bound
      cutoffs = _get_auto_winsorization_cutoffs_outcome_constraint(
          # pyre-fixme[6]: For 1st param expected `List[float]` but got `List[int]`.
          metric_values=metric_values,
          outcome_constraints=[outcome_constraint_leq],
      )
      self.assertEqual(cutoffs, (-INF, 23.5))
      # From above with a tight bound
      outcome_constraint_leq.bound = 2
      cutoffs = _get_auto_winsorization_cutoffs_outcome_constraint(
          # pyre-fixme[6]: For 1st param expected `List[float]` but got `List[int]`.
          metric_values=metric_values,
          outcome_constraints=[outcome_constraint_leq],
      )
      self.assertEqual(cutoffs, (-INF, 13.5))
      # From below with a loose bound
      cutoffs = _get_auto_winsorization_cutoffs_outcome_constraint(
          # pyre-fixme[6]: For 1st param expected `List[float]` but got `List[int]`.
          metric_values=metric_values,
          outcome_constraints=[outcome_constraint_geq],
      )
      self.assertEqual(cutoffs, (-31.5, INF))
      # From below with a tight bound
      outcome_constraint_geq.bound = 5
      cutoffs = _get_auto_winsorization_cutoffs_outcome_constraint(
          # pyre-fixme[6]: For 1st param expected `List[float]` but got `List[int]`.
          metric_values=metric_values,
          outcome_constraints=[outcome_constraint_geq],
      )
      self.assertEqual(cutoffs, (-6.5, INF))
      # Both with the tight bounds
      outcome_constraint_geq.bound = 5
      cutoffs = _get_auto_winsorization_cutoffs_outcome_constraint(
          # pyre-fixme[6]: For 1st param expected `List[float]` but got `List[int]`.
          metric_values=metric_values,
          outcome_constraints=[
              outcome_constraint_leq,
              outcome_constraint_geq,
          ],
      )
      self.assertEqual(cutoffs, (-6.5, 13.5))
  
imports: import warnings
  from copy import deepcopy
  from typing import Dict, Optional, Tuple
  from unittest import mock
  import numpy
  from ax.core.data import Data
  from ax.core.experiment import Experiment
  from ax.core.metric import Metric
  from ax.core.objective import MultiObjective, Objective, ScalarizedObjective
  from ax.core.observation import Observation, ObservationData, ObservationFeatures
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ComparisonOp, ObjectiveThreshold, OutcomeConstraint, ScalarizedOutcomeConstraint
  from ax.core.parameter import ParameterType, RangeParameter
  from ax.core.search_space import SearchSpace
  from ax.exceptions.core import DataRequiredError, UnsupportedError, UserInputError
  from ax.modelbridge.base import ModelBridge
  from ax.modelbridge.transforms.winsorize import _get_auto_winsorization_cutoffs_outcome_constraint, _get_auto_winsorization_cutoffs_single_objective, _get_tukey_cutoffs, AUTO_WINS_QUANTILE, Winsorize
  from ax.models.winsorization_config import WinsorizationConfig
  from ax.utils.common.testutils import TestCase
  from ax.utils.testing.core_stubs import get_optimization_config
  from typing_extensions import SupportsIndex
label_desc: Use image node_id 10 for calling the WinsorizeTransformTest obj's underlying member method code with example usage: obj.test_winsorize_outcome_constraints() without return types