code: def test_constraint_satisfaction(self) -> None:
      metric_values = [
          (0.1, 0.6, 0.1),  # feasible
          (0.2, 0.1, 0.2),  # infeasible
          (0.4, 0.5, 0.6),  # infeasible
          (0.5, 0.2, 0.4),  # infeasible
      ]
      exp = self._create_single_objective_experiment(
          metric_values=metric_values
      )
      self.assertTrue(constraint_satisfaction(exp.trials[0]))
      self.assertFalse(constraint_satisfaction(exp.trials[1]))
      self.assertFalse(constraint_satisfaction(exp.trials[2]))
      self.assertFalse(constraint_satisfaction(exp.trials[3]))
  
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 9 for calling the TestImprovementGlobalStoppingStrategy obj's underlying member method code with example usage: obj.test_constraint_satisfaction() without return types