class_docstr: Replaces the search space with a single range parameter, whose values
  are derived from the signature of the arms.
  
  NOTE: This will have collisions and so should not be used whenever unique
  observation features need to be preserved. Its purpose is to enable
  forward transforms for any search space regardless of parameterization.
  
  Transform is done in-place.
code: def transform_observation_features(
      self, observation_features: List[ObservationFeatures]
  ) -> List[ObservationFeatures]:
      for obsf in observation_features:
          sig = Arm(parameters=obsf.parameters).signature
          val = float(int(sig, 16) % 1_000_000_000_000)
          obsf.parameters = {"HASH_PARAM": val}
      return observation_features
  
file_path: Ax/ax/modelbridge/transforms/search_space_to_float.py
imports: from typing import List
  from ax.core.arm import Arm
  from ax.core.observation import ObservationFeatures
  from ax.core.parameter import ParameterType, RangeParameter
  from ax.core.search_space import SearchSpace
  from ax.modelbridge.transforms.base import Transform
label_desc: Use image node_id 2 for calling the SearchSpaceToFloat obj's underlying member method code with example usage: obj.transform_observation_features(observation_features) and returns: observation_features