code: def test_get_pareto_frontier_and_configs_input_validation(
      self,
  ) -> None:
      exp = get_branin_experiment_with_multi_objective(
          has_optimization_config=True, with_batch=True
      )
      for trial in exp.trials.values():
          trial.mark_running(no_runner_required=True).mark_completed()
      metrics_dict = not_none(exp.optimization_config).metrics
      objective_thresholds = [
          ObjectiveThreshold(
              metric=metrics_dict[f"branin_{letter}"],
              bound=5.0,
              relative=False,
              op=ComparisonOp.LEQ,
          )
          for letter in "ab"
      ]
      # appease Pyre (this condition is True)
      if isinstance(
          exp.optimization_config, MultiObjectiveOptimizationConfig
      ):
          exp.optimization_config = (
              exp.optimization_config.clone_with_args(
                  objective_thresholds=objective_thresholds,
              )
          )
  
      exp.attach_data(
          get_branin_data_multi_objective(
              trial_indices=exp.trials.keys(), num_objectives=2
          ),
      )
      modelbridge = TorchModelBridge(
          experiment=exp,
          search_space=exp.search_space,
          data=exp.fetch_data(),
          model=MultiObjectiveBotorchModel(),
          transforms=[],
      )
      observation_features = [
          ObservationFeatures(parameters={"x1": 0.0, "x2": 1.0}),
          ObservationFeatures(parameters={"x1": 1.0, "x2": 0.0}),
      ]
  
      with self.assertWarns(
          Warning,
          msg="FYI: The default behavior of `get_pareto_frontier_and_configs` when "
          "`transform_outcomes_and_configs` is not specified has changed. Previously,"
          " the default was `transform_outcomes_and_configs=True`; now this argument "
          "is deprecated and behavior is as if "
          "`transform_outcomes_and_configs=False`. You did not specify "
          "`transform_outcomes_and_configs`, so this warning requires no action.",
      ):
          res = get_pareto_frontier_and_configs(
              modelbridge=modelbridge,
              observation_features=observation_features,
          )
          self.assertEqual(len(res), 4)
  
      with self.assertRaises(UnsupportedError):
          get_pareto_frontier_and_configs(
              modelbridge=modelbridge,
              observation_features=observation_features,
              transform_outcomes_and_configs=True,
          )
  
      with self.assertWarns(
          DeprecationWarning,
          msg="You passed `transform_outcomes_and_configs=False`. Specifying "
          "`transform_outcomes_and_configs` at all is deprecated because `False` is "
          "now the only allowed behavior. In the future, this will become an error.",
      ):
          res = get_pareto_frontier_and_configs(
              modelbridge=modelbridge,
              observation_features=observation_features,
              transform_outcomes_and_configs=False,
          )
          self.assertEqual(len(res), 4)
  
      with self.assertWarns(
          Warning,
          msg="You provided `observation_data` when `use_model_predictions` is True; "
          "`observation_data` will not be used.",
      ):
          res = get_pareto_frontier_and_configs(
              modelbridge,
              observation_features=observation_features,
              use_model_predictions=True,
              observation_data=[],
          )
          self.assertEqual(len(res), 4)
  
      with self.assertRaises(ValueError):
          get_pareto_frontier_and_configs(
              modelbridge,
              observation_features=[],
              use_model_predictions=False,
          )
  
imports: from contextlib import ExitStack
  from typing import List, Optional
  from unittest.mock import patch
  import numpy
  import torch
  from ax.core.metric import Metric
  from ax.core.observation import ObservationData, ObservationFeatures
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig
  from ax.core.outcome_constraint import ComparisonOp, ObjectiveThreshold, OutcomeConstraint
  from ax.core.parameter_constraint import ParameterConstraint
  from ax.exceptions.core import UnsupportedError
  from ax.modelbridge.factory import get_sobol
  from ax.modelbridge.modelbridge_utils import get_pareto_frontier_and_configs, observed_hypervolume, observed_pareto_frontier, pareto_frontier, predicted_hypervolume, predicted_pareto_frontier
  from ax.modelbridge.registry import Cont_X_trans, ST_MTGP_trans, Y_trans
  from ax.modelbridge.torch import TorchModelBridge
  from ax.models.torch.botorch_modular.model import BoTorchModel
  from ax.models.torch.botorch_moo import MultiObjectiveBotorchModel
  from ax.models.torch.botorch_moo_defaults import infer_objective_thresholds, pareto_frontier_evaluator
  from ax.service.utils.report_utils import exp_to_df
  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_branin_data_multi_objective, get_branin_experiment_with_multi_objective, get_hierarchical_search_space, get_hss_trials_with_fixed_parameter, get_non_monolithic_branin_moo_data, TEST_SOBOL_SEED
  from ax.utils.testing.mock import fast_botorch_optimize
  from ax.utils.testing.modeling_stubs import transform_1, transform_2
  from botorch.utils.multi_objective.pareto import is_non_dominated
label_desc: Use image node_id 3 for calling the MultiObjectiveTorchModelBridgeTest obj's underlying member method code with example usage: obj.test_get_pareto_frontier_and_configs_input_validation() without return types