code: def test_feasible_hypervolume(self) -> None:
      ma = Metric(name="a", lower_is_better=False)
      mb = Metric(name="b", lower_is_better=True)
      mc = Metric(name="c", lower_is_better=False)
      optimization_config = MultiObjectiveOptimizationConfig(
          objective=MultiObjective(metrics=[ma, mb]),
          outcome_constraints=[
              OutcomeConstraint(
                  mc,
                  op=ComparisonOp.GEQ,
                  bound=0,
                  relative=False,
              )
          ],
          objective_thresholds=[
              ObjectiveThreshold(
                  ma,
                  bound=1.0,
              ),
              ObjectiveThreshold(
                  mb,
                  bound=1.0,
              ),
          ],
      )
      feas_hv = feasible_hypervolume(
          optimization_config,
          values={
              "a": np.array(
                  [
                      1.0,
                      3.0,
                      2.0,
                      2.0,
                  ]
              ),
              "b": np.array(
                  [
                      0.0,
                      1.0,
                      0.0,
                      0.0,
                  ]
              ),
              "c": np.array(
                  [
                      0.0,
                      -0.0,
                      1.0,
                      -2.0,
                  ]
              ),
          },
      )
      self.assertEqual(list(feas_hv), [0.0, 0.0, 1.0, 1.0])
  
imports: from dataclasses import dataclass
  from typing import List, Union
  import numpy
  import torch
  from ax.core.metric import Metric
  from ax.core.objective import MultiObjective
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold, OutcomeConstraint
  from ax.core.parameter import ChoiceParameter, ParameterType, RangeParameter
  from ax.core.risk_measures import RiskMeasure
  from ax.core.search_space import RobustSearchSpace, SearchSpace
  from ax.core.types import ComparisonOp
  from ax.exceptions.core import UserInputError
  from ax.modelbridge.modelbridge_utils import _array_to_tensor, extract_risk_measure, extract_robust_digest, feasible_hypervolume, process_contextual_datasets, RISK_MEASURE_NAME_TO_CLASS, transform_search_space
  from ax.modelbridge.registry import Cont_X_trans, Y_trans
  from ax.utils.common.testutils import TestCase
  from ax.utils.common.typeutils import not_none
  from ax.utils.testing.core_stubs import get_robust_search_space, get_search_space
  from botorch.acquisition.risk_measures import VaR
  from botorch.utils.datasets import ContextualDataset, SupervisedDataset
label_desc: Use image node_id 4 for calling the TestModelBridgeUtils obj's underlying member method code with example usage: obj.test_feasible_hypervolume() without return types