code: def test_check_min_max_scaling(self):
      with settings.debug(True):
          # check unscaled input in unit cube
          X = 0.1 + 0.8 * torch.rand(4, 2, 3)
          with warnings.catch_warnings(record=True) as ws:
              check_min_max_scaling(X=X)
              self.assertFalse(
                  any(
                      issubclass(w.category, InputDataWarning)
                      for w in ws
                  )
              )
          check_min_max_scaling(X=X, raise_on_fail=True)
          with self.assertWarnsRegex(
              expected_warning=InputDataWarning,
              expected_regex="not scaled",
          ):
              check_min_max_scaling(X=X, strict=True)
          with self.assertRaises(InputDataError):
              check_min_max_scaling(
                  X=X, strict=True, raise_on_fail=True
              )
          # check proper input
          Xmin, Xmax = (
              X.min(dim=-1, keepdim=True)[0],
              X.max(dim=-1, keepdim=True)[0],
          )
          Xstd = (X - Xmin) / (Xmax - Xmin)
          with warnings.catch_warnings(record=True) as ws:
              check_min_max_scaling(X=Xstd)
              self.assertFalse(
                  any(
                      issubclass(w.category, InputDataWarning)
                      for w in ws
                  )
              )
          check_min_max_scaling(X=Xstd, raise_on_fail=True)
          with warnings.catch_warnings(record=True) as ws:
              check_min_max_scaling(X=Xstd, strict=True)
              self.assertFalse(
                  any(
                      issubclass(w.category, InputDataWarning)
                      for w in ws
                  )
              )
          check_min_max_scaling(X=Xstd, strict=True, raise_on_fail=True)
          # check violation
          X[0, 0, 0] = 2
          with warnings.catch_warnings(record=True) as ws:
              check_min_max_scaling(X=X)
              self.assertTrue(
                  any(
                      issubclass(w.category, InputDataWarning)
                      for w in ws
                  )
              )
              self.assertTrue(
                  any("not contained" in str(w.message) for w in ws)
              )
          with self.assertRaises(InputDataError):
              check_min_max_scaling(X=X, raise_on_fail=True)
          with warnings.catch_warnings(record=True) as ws:
              check_min_max_scaling(X=X, strict=True)
              self.assertTrue(
                  any(
                      issubclass(w.category, InputDataWarning)
                      for w in ws
                  )
              )
              self.assertTrue(
                  any("not contained" in str(w.message) for w in ws)
              )
          with self.assertRaises(InputDataError):
              check_min_max_scaling(
                  X=X, strict=True, raise_on_fail=True
              )
          # check ignore_dims
          with warnings.catch_warnings(record=True) as ws:
              check_min_max_scaling(X=X, ignore_dims=[0])
              self.assertFalse(
                  any(
                      issubclass(w.category, InputDataWarning)
                      for w in ws
                  )
              )
  
imports: import warnings
  import torch
  from botorch import settings
  from botorch.exceptions import InputDataError, InputDataWarning
  from botorch.models.utils import add_output_dim, check_min_max_scaling, check_no_nans, check_standardization, fantasize, gpt_posterior_settings, multioutput_to_batch_mode_transform, validate_input_scaling
  from botorch.models.utils.assorted import consolidate_duplicates, detect_duplicates
  from botorch.utils.testing import BotorchTestCase
  from gpytorch import settings
label_desc: Use image node_id 3 for calling the TestInputDataChecks obj's underlying member method code with example usage: obj.test_check_min_max_scaling() without return types