docstr: Check that preprocessed features fall within range of valid output.
  :param batch: torch tensor
  :param norm_params: list of normalization parameters
code: def _check_preprocessing_output(self, batch, norm_params):
      """
      Check that preprocessed features fall within range of valid output.
      :param batch: torch tensor
      :param norm_params: list of normalization parameters
      """
      if not self.training:
          return
      feature_type = norm_params[0].feature_type
      min_value, max_value = batch.min(), batch.max()
  
      if feature_type in (
          "BOXCOX",
          "CONTINUOUS",
          "DO_NOT_PREPROCESS",
          "CLIP_LOG",
      ):
          # Continuous features may be in range (-inf, inf)
          pass
      elif max_value.item() > MAX_FEATURE_VALUE:
          raise Exception(
              f"A {feature_type} feature type has max value {max_value} which is >"
              f" than accepted post pre-processing max of {MAX_FEATURE_VALUE}"
          )
      elif min_value.item() < MIN_FEATURE_VALUE:
          raise Exception(
              f"A {feature_type} feature type has min value {min_value} which is <"
              f" accepted post pre-processing min of {MIN_FEATURE_VALUE}"
          )
  
imports: import logging
  from typing import cast, Dict, List, Optional, Tuple
  import torch
  from reagent.core.parameters import NormalizationParameters
  from reagent.preprocessing.identify_types import DO_NOT_PREPROCESS, ENUM, FEATURE_TYPES
  from reagent.preprocessing.normalization import EPS, MAX_FEATURE_VALUE, MIN_FEATURE_VALUE
  from torch.nn import Module, Parameter
label_desc: Use image node_id 30 for calling the Preprocessor obj's underlying member method code with example usage: obj._check_preprocessing_output(batch, norm_params) without return types