code: def obs_preprocessor(self, obs: np.ndarray) -> rlt.FeatureData:
      dense_val, id_list_val, id_score_list_val = self._split_state(obs)
      return rlt.FeatureData(
          # dense value
          float_features=dense_val,
          # (offset, value)
          id_list_features_raw={
              "legal": (
                  torch.tensor([0], dtype=torch.long),
                  id_list_val,
              )
          },
          # (offset, key, value)
          id_score_list_features_raw={
              "mu_changes": (
                  torch.tensor([0], dtype=torch.long),
                  torch.arange(self.num_arms, dtype=torch.long),
                  id_score_list_val,
              )
          },
      )
  
imports: import random
  import gym
  import numpy
  import reagent.core.types
  import torch
  from reagent.core.dataclasses import dataclass
  from reagent.core.parameters import NormalizationData, NormalizationKey
  from reagent.gym.envs.env_wrapper import EnvWrapper
  from reagent.gym.normalizers import only_continuous_normalizer
label_desc: Use image node_id 3 for calling the ChangingArms obj's underlying member method code with example usage: obj.obs_preprocessor(obs) and returns: rlt