code: def test_transform_observation_features(self) -> None:
      observation_features = [
          ObservationFeatures(
              parameters={"x": 2.2, "a": 2, "b": "b", "d": 3}
          )
      ]
      obs_ft2 = deepcopy(observation_features)
      obs_ft2 = self.t.transform_observation_features(obs_ft2)
      self.assertEqual(
          obs_ft2,
          [
              ObservationFeatures(
                  parameters={"x": 2.2, "a": 2, "b": "b", "d": 3}
              )
          ],
      )
      self.assertTrue(isinstance(obs_ft2[0].parameters["a"], float))
      self.assertTrue(isinstance(obs_ft2[0].parameters["d"], float))
      obs_ft2 = self.t.untransform_observation_features(obs_ft2)
      self.assertEqual(obs_ft2, observation_features)
  
      # With min_choices. Only d should be transformed.
      obs_ft2 = deepcopy(observation_features)
      obs_ft2 = self.t3.transform_observation_features(obs_ft2)
      self.assertEqual(
          obs_ft2,
          [
              ObservationFeatures(
                  parameters={"x": 2.2, "a": 2, "b": "b", "d": 3}
              )
          ],
      )
      self.assertTrue(isinstance(obs_ft2[0].parameters["a"], int))
      self.assertTrue(isinstance(obs_ft2[0].parameters["d"], float))
      obs_ft2 = self.t3.untransform_observation_features(obs_ft2)
      self.assertEqual(obs_ft2, observation_features)
  
      # With log_scale & min_choices. Both a & d should get transformed.
      obs_ft2 = deepcopy(observation_features)
      obs_ft2 = self.t4.transform_observation_features(obs_ft2)
      self.assertEqual(
          obs_ft2,
          [
              ObservationFeatures(
                  parameters={"x": 2.2, "a": 2, "b": "b", "d": 3}
              )
          ],
      )
      self.assertTrue(isinstance(obs_ft2[0].parameters["a"], float))
      self.assertTrue(isinstance(obs_ft2[0].parameters["d"], float))
      obs_ft2 = self.t4.untransform_observation_features(obs_ft2)
      self.assertEqual(obs_ft2, observation_features)
  
      # Let the transformed space be a float, verify it becomes an int.
      obs_ft3 = [
          ObservationFeatures(
              parameters={"x": 2.2, "a": 2.2, "b": "b", "d": 2.9}
          )
      ]
      obs_ft3 = self.t.untransform_observation_features(obs_ft3)
      self.assertEqual(obs_ft3, observation_features)
  
      # With min_choices. Only d should become an int.
      obs_ft3 = [
          ObservationFeatures(
              parameters={"x": 2.2, "a": 2.2, "b": "b", "d": 2.9}
          )
      ]
      obs_ft3 = self.t3.untransform_observation_features(obs_ft3)
      self.assertEqual(
          obs_ft3,
          [
              ObservationFeatures(
                  parameters={"x": 2.2, "a": 2.2, "b": "b", "d": 3}
              )
          ],
      )
  
      # With log_scale & min_choices. Both a & d should become ints.
      obs_ft3 = [
          ObservationFeatures(
              parameters={"x": 2.2, "a": 2.2, "b": "b", "d": 2.9}
          )
      ]
      obs_ft3 = self.t4.untransform_observation_features(obs_ft3)
      self.assertEqual(
          obs_ft3,
          [
              ObservationFeatures(
                  parameters={"x": 2.2, "a": 2, "b": "b", "d": 3}
              )
          ],
      )
  
      # Test forward transform on partial observation
      obs_ft4 = [ObservationFeatures(parameters={"x": 2.2, "d": 3})]
      obs_ft4 = self.t.transform_observation_features(obs_ft4)
      self.assertEqual(
          obs_ft4, [ObservationFeatures(parameters={"x": 2.2, "d": 3})]
      )
      self.assertTrue(isinstance(obs_ft4[0].parameters["d"], float))
      obs_ft5 = self.t.transform_observation_features(
          [ObservationFeatures({})]
      )
      self.assertEqual(obs_ft5[0], ObservationFeatures({}))
  
      # test untransforming integer params that are outside of the range, but within
      # 0.5 of the range limit
      obs_ft6 = [
          ObservationFeatures(
              parameters={"x": 2.2, "a": 0.6, "b": "b", "d": 3.3}
          )
      ]
      obs_ft6 = self.t.untransform_observation_features(obs_ft6)
      self.assertEqual(
          obs_ft6,
          [
              ObservationFeatures(
                  parameters={"x": 2.2, "a": 1, "b": "b", "d": 3}
              )
          ],
      )
  
imports: from copy import deepcopy
  from unittest import mock
  from ax.core.observation import ObservationFeatures
  from ax.core.parameter import ChoiceParameter, ParameterType, RangeParameter
  from ax.core.parameter_constraint import OrderConstraint, SumConstraint
  from ax.core.search_space import RobustSearchSpace, SearchSpace
  from ax.exceptions.core import UnsupportedError
  from ax.modelbridge.transforms.int_to_float import IntToFloat
  from ax.utils.common.testutils import TestCase
  from ax.utils.common.typeutils import checked_cast
  from ax.utils.testing.core_stubs import get_robust_search_space
label_desc: Use image node_id 3 for calling the IntToFloatTransformTest obj's underlying member method code with example usage: obj.test_transform_observation_features() without return types