code: def test_recsim_interest_evolution(self) -> None:
      num_candidate = 10
      # pyre-fixme[16]: Module `envs` has no attribute `RecSim`.
      env = RecSim(
          num_candidates=num_candidate,
          slate_size=3,
          resample_documents=False,
      )
      obs_preprocessor = env.get_obs_preprocessor()
      obs = env.reset()
      state = obs_preprocessor(obs)
      self.assertFalse(state.has_float_features_only)
      self.assertEqual(
          state.float_features.shape, (1, obs["user"].shape[0])
      )
      self.assertEqual(state.float_features.dtype, torch.float32)
      self.assertEqual(state.float_features.device, torch.device("cpu"))
      npt.assert_array_almost_equal(
          obs["user"], state.float_features.squeeze(0)
      )
      doc_float_features = state.candidate_docs.float_features
      self.assertIsNotNone(doc_float_features)
      self.assertEqual(
          doc_float_features.shape,
          (1, num_candidate, obs["doc"]["0"].shape[0]),
      )
      self.assertEqual(doc_float_features.dtype, torch.float32)
      self.assertEqual(doc_float_features.device, torch.device("cpu"))
      for i, v in enumerate(obs["doc"].values()):
          npt.assert_array_almost_equal(v, doc_float_features[0, i])
  
file_path: ReAgent/reagent/gym/tests/preprocessors/test_default_preprocessors.py
imports: import unittest
  import numpy.testing
  import torch
  import torch.nn.functional
  from reagent.gym.envs import Gym
label_desc: Use image node_id 3 for calling the TestMakeDefaultObsPreprocessor obj's underlying member method code with example usage: obj.test_recsim_interest_evolution() without return types