code: def test_get_Y_normalization_bounds(self):
      # Error if batched.
      with self.assertRaisesRegex(UnsupportedError, "Batched"):
          MARS._get_Y_normalization_bounds(Y=torch.rand(3, 5, 2))
      for dtype in (torch.float, torch.double):
          tkwargs = {"dtype": dtype, "device": self.device}
          # Empty Y.
          bounds = MARS._get_Y_normalization_bounds(
              Y=torch.empty(0, 3, **tkwargs)
          )
          expected = torch.zeros(2, 3, **tkwargs)
          expected[1] = 1.0
          self.assertAllClose(bounds, expected)
  
          # Single point in pareto_Y.
          bounds = MARS._get_Y_normalization_bounds(
              Y=torch.zeros(1, 3, **tkwargs)
          )
          self.assertAllClose(bounds, expected)
  
          # With reference point.
          bounds = MARS._get_Y_normalization_bounds(
              Y=torch.zeros(1, 3, **tkwargs), ref_point=-torch.ones(3)
          )
          self.assertAllClose(bounds, expected - 1)
  
          # Check that dominated points are ignored.
          Y = torch.tensor(
              [[0.0, 0.0], [0.5, 1.0], [1.0, 0.5]], **tkwargs
          )
          expected = expected[:, :2]
          expected[0] = 0.5
          bounds = MARS._get_Y_normalization_bounds(Y=Y)
          self.assertAllClose(bounds, expected)
  
          # Multiple pareto with ref point.
          # Nothing better than ref.
          bounds = MARS._get_Y_normalization_bounds(
              Y=Y, ref_point=torch.ones(2) * 0.75
          )
          self.assertAllClose(bounds, expected)
  
          # W/ points better than ref.
          Y = torch.tensor(
              [[0.5, 1.0], [1.0, 0.5], [0.8, 0.8], [0.9, 0.7]],
              **tkwargs,
          )
          bounds = MARS._get_Y_normalization_bounds(
              Y=Y, ref_point=torch.ones(2) * 0.6
          )
          expected = torch.tensor([[0.6, 0.6], [0.9, 0.8]], **tkwargs)
          self.assertAllClose(bounds, expected)
  
imports: import warnings
  from typing import Optional
  import torch
  from botorch import settings
  from botorch.acquisition.multi_objective.multi_output_risk_measures import IndependentCVaR, IndependentVaR, MARS, MultiOutputExpectation, MultiOutputRiskMeasureMCObjective, MultiOutputWorstCase, MVaR
  from botorch.acquisition.multi_objective.objective import IdentityMCMultiOutputObjective, WeightedMCMultiOutputObjective
  from botorch.exceptions.errors import UnsupportedError
  from botorch.exceptions.warnings import BotorchWarning
  from botorch.models.deterministic import GenericDeterministicModel
  from botorch.models.transforms.input import InputPerturbation
  from botorch.utils.multi_objective.pareto import is_non_dominated
  from botorch.utils.testing import BotorchTestCase
  from torch import Tensor
label_desc: Use image node_id 3 for calling the TestMARS obj's underlying member method code with example usage: obj.test_get_Y_normalization_bounds() without return types