code: def check_concat_combiner_requirements(
      config: "ModelConfig",
  ) -> None:  # noqa: F821
      """Checks that if the concat combiner receives a mixture of sequence and non-sequence features, that all
      sequence features are configured with reduce_output to be 2D tensors.
      """
      if config.model_type != MODEL_ECD:
          return
      if config.combiner.type != "concat":
          return
  
      has_unreduced_sequence_feature = False
      has_non_sequence_feature = False
      for input_feature in config.input_features:
          if (
              input_feature.type in {SEQUENCE, TEXT, TIMESERIES}
              and hasattr(input_feature.encoder, "reduce_output")
              and input_feature.encoder.reduce_output is None
          ):
              has_unreduced_sequence_feature = True
          else:
              has_non_sequence_feature = True
  
      if has_unreduced_sequence_feature and has_non_sequence_feature:
          raise ConfigValidationError(
              "The concat combiner cannot receive a mix of unreduced sequence features (3D) and non-sequence features "
              "(2D). Options: 1) Set reduce_output in sequence feature encoders to a value other than None to ensure 2D "
              "encoder outputs, 2) Choose a different combiner like `sequence_concat` which can handle a mix of 2D and "
              "3D encoder output shapes, or 3) Remove features to ensure that output shapes from all encoders are the "
              "same dimension (all 2D or all 3D)."
          )
  
imports: from abc import ABC, abstractmethod
  from re import findall
  from typing import Callable, TYPE_CHECKING
  from transformers import AutoConfig
  from ludwig.api_annotations import DeveloperAPI
  from ludwig.constants import AUDIO, BINARY, CATEGORY, IMAGE, IN_MEMORY, MIN_QUANTIZATION_BITS_FOR_MERGE_AND_UNLOAD, MODEL_ECD, MODEL_GBM, MODEL_LLM, NUMBER, SEQUENCE, SET, TEXT, TIMESERIES, VECTOR
  from ludwig.error import ConfigValidationError
  from ludwig.utils.metric_utils import get_feature_to_metric_names_map_from_feature_collection
  from ludwig.utils.misc_utils import merge_dict
label_desc: Use image node_id 22 for calling a global function with example usage: check_concat_combiner_requirements(config) without return types