code: def test_multi_objective(self) -> None:
      metric_values = [
          (0.15, 0.6, 0.1),
          (0.25, 0.5, 0.2),
          (0.4, 0.5, 0.6),
          (0.3, 0.4, 0.0),
          (0.6, 0.1, 0.3),
          (0.9, 0.1, 0.1),
      ]
      exp = self._create_multi_objective_experiment(
          metric_values=metric_values
      )
      gss = ImprovementGlobalStoppingStrategy(
          min_trials=3, window_size=3, improvement_bar=0.1
      )
      stop, message = gss.should_stop_optimization(
          experiment=exp, trial_to_check=4
      )
      self.assertFalse(stop)
      self.assertEqual(message, "")
  
      stop, message = gss.should_stop_optimization(
          experiment=exp, trial_to_check=5
      )
      self.assertTrue(stop)
  
      self.assertEqual(
          message,
          "The improvement in hypervolume in the past 3 trials (=0.000) is "
          "less than improvement_bar (=0.1) times the hypervolume at the "
          "start of the window (=0.055).",
      )
  
      # Now we select a very far custom reference point against which the pareto front
      # has not increased in hypervolume at trial 4. Hence, it should stop the
      # optimization at this trial.
      gss = ImprovementGlobalStoppingStrategy(
          min_trials=3, window_size=3, improvement_bar=0.1
      )
      objectives = (
          exp.optimization_config.objective.objectives
      )  # pyre-ignore
      custom_objective_thresholds = [
          ObjectiveThreshold(
              metric=objectives[0].metric,
              bound=-10,
              op=ComparisonOp.GEQ,
              relative=False,
          ),
          ObjectiveThreshold(
              metric=objectives[1].metric,
              bound=-10,
              op=ComparisonOp.GEQ,
              relative=False,
          ),
      ]
      stop, message = gss.should_stop_optimization(
          experiment=exp,
          trial_to_check=4,
          objective_thresholds=custom_objective_thresholds,
      )
      self.assertTrue(stop)
      self.assertEqual(
          message,
          "The improvement in hypervolume in the past 3 trials (=0.033) is "
          "less than improvement_bar (=0.1) times the hypervolume at the "
          "start of the window (=108.640).",
      )
  
      # Test with no objective thresholds specified.
      checked_cast(
          MultiObjectiveOptimizationConfig, exp._optimization_config
      )._objective_thresholds = []
      stop, message = gss.should_stop_optimization(
          experiment=exp,
          trial_to_check=4,
          objective_thresholds=None,
      )
      self.assertTrue(stop)
  
imports: from typing import List, Tuple
  import numpy
  import pandas
  from ax.core.arm import Arm
  from ax.core.batch_trial import BatchTrial
  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
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold, OutcomeConstraint
  from ax.core.parameter import ParameterType, RangeParameter
  from ax.core.search_space import SearchSpace
  from ax.core.trial import Trial
  from ax.core.types import ComparisonOp
  from ax.global_stopping.strategies.improvement import constraint_satisfaction, ImprovementGlobalStoppingStrategy
  from ax.utils.common.testutils import TestCase
  from ax.utils.common.typeutils import checked_cast, not_none
  from ax.utils.testing.core_stubs import get_experiment, get_experiment_with_data
label_desc: Use image node_id 6 for calling the TestImprovementGlobalStoppingStrategy obj's underlying member method code with example usage: obj.test_multi_objective() without return types