docstr: Creates a synthetic experiments with 2 parameters, two objectives and
  one outcome constraint for testing different components. It also
  populates the experiment with trials and their data.
  
  Args:
      metric_values: A list of triples representing the mean values for three
          metrics in trials.
  
  Retruns:
      An experiment with len(metric_values) trials.
docstr_tok: ["Creates","a","synthetic","experiments","with","2","parameters",",","two","objectives","and","one","outcome","constraint","for","testing","different","components",".","It","also","populates","the","experiment","with","trials","and","their","data",".","Args",":","metric_values",":","A","list","of","triples","representing","the","mean","values","for","three","metrics","in","trials",".","Retruns",":","An","experiment","with","len","(","metric_values",")","trials","."]
code: def _create_multi_objective_experiment(
      self, metric_values: List[Tuple[float, float, float]]
  ) -> Experiment:
      """
      Creates a synthetic experiments with 2 parameters, two objectives and
      one outcome constraint for testing different components. It also
      populates the experiment with trials and their data.
  
      Args:
          metric_values: A list of triples representing the mean values for three
              metrics in trials.
  
      Retruns:
          An experiment with len(metric_values) trials.
      """
      search_space = SearchSpace(
          [
              RangeParameter("x", ParameterType.FLOAT, 0.0, 1.0),
              RangeParameter("y", ParameterType.FLOAT, 0.0, 1.0),
          ]
      )
  
      objectives = [
          Objective(metric=Metric(name="m1"), minimize=False),
          Objective(metric=Metric(name="m2"), minimize=False),
      ]
      objective_thresholds = [
          ObjectiveThreshold(
              metric=objectives[0].metric,
              bound=0.1,
              op=ComparisonOp.GEQ,
              relative=False,
          ),
          ObjectiveThreshold(
              metric=objectives[1].metric,
              bound=0.2,
              op=ComparisonOp.GEQ,
              relative=False,
          ),
      ]
  
      outcome_constraints = [
          OutcomeConstraint(
              metric=Metric(name="m3"),
              op=ComparisonOp.LEQ,
              bound=0.5,
              relative=False,
          ),
      ]
      optimization_config = MultiObjectiveOptimizationConfig(
          objective=MultiObjective(objectives),
          outcome_constraints=outcome_constraints,
          objective_thresholds=objective_thresholds,
      )
  
      exp = Experiment(
          name="test_experiment",
          search_space=search_space,
          optimization_config=optimization_config,
      )
  
      # Adding trials to the experiment
      for metric_value in metric_values:
          trial = exp.new_trial().add_arm(arm=self._get_arm())
          _ = trial.mark_running(no_runner_required=True)
          data = self._get_data_for_trial(
              trial=trial, values=metric_value
          )
          _ = exp.attach_data(data)
          trial.mark_completed()
  
      return exp
  
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 5 for calling the TestImprovementGlobalStoppingStrategy obj's underlying member method code with example usage: obj._create_multi_objective_experiment(metric_values) and returns: exp