code: def test_preprocessing_disabled_modelv2(self):
      config = (
          ppo.PPOConfig()
          .environment(
              "ray.rllib.examples.env.random_env.RandomEnv",
              env_config={
                  "config": {
                      "observation_space": Dict(
                          {
                              "a": Discrete(5),
                              "b": Dict(
                                  {
                                      "ba": Discrete(4),
                                      "bb": Box(
                                          -1.0,
                                          1.0,
                                          (2, 3),
                                          dtype=np.float32,
                                      ),
                                  }
                              ),
                              "c": Tuple(
                                  (MultiDiscrete([2, 3]), Discrete(1))
                              ),
                              "d": Box(-1.0, 1.0, (1,), dtype=np.int32),
                          }
                      ),
                  },
              },
          )
          # Speed things up a little.
          .rollouts(rollout_fragment_length=5)
          .training(
              train_batch_size=100,
              sgd_minibatch_size=10,
              num_sgd_iter=1,
          )
          .debugging(seed=42)
          # Set this to True to enforce no preprocessors being used.
          # Complex observations now arrive directly in the model as
          # structures of batches, e.g. {"a": tensor, "b": [tensor, tensor]}
          # for obs-space=Dict(a=..., b=Tuple(..., ...)).
          .experimental(_disable_preprocessor_api=True)
      )
  
      # (Artur): This test only works under the old ModelV2 API because we
      # don't offer arbitrarily complex Models under the RLModules API without
      # preprocessors. Such input spaces require custom implementations of the
      # input space.
  
      num_iterations = 1
      # Only supported for tf so far.
      for _ in framework_iterator(config):
          algo = config.build()
          for i in range(num_iterations):
              results = algo.train()
              check_train_results(results)
              print(results)
          check_compute_single_action(algo)
          algo.stop()
  
imports: import gymnasium
  from gymnasium.spaces import Box, Dict, Discrete, MultiDiscrete, Tuple, MultiBinary
  import numpy
  import unittest
  import ray
  import ray.rllib.algorithms.ppo
  from ray.rllib.models.catalog import ModelCatalog
  from ray.rllib.models.preprocessors import DictFlatteningPreprocessor, get_preprocessor, NoPreprocessor, TupleFlatteningPreprocessor, OneHotPreprocessor, AtariRamPreprocessor, GenericPixelPreprocessor, MultiBinaryPreprocessor
  from ray.rllib.utils.test_utils import check, check_compute_single_action, check_train_results, framework_iterator
  from ray.rllib.utils.framework import try_import_tf
label_desc: Use image node_id 4 for calling the TestPreprocessors obj's underlying member method code with example usage: obj.test_preprocessing_disabled_modelv2() without return types