code: def ecd_trainer_config_generator(
      static_schema: Dict[str, Any] = None
  ) -> Tuple[ModelConfigDict, pd.DataFrame]:
      """Generate combinatorial configs for the ECD trainer section of the Ludwig config."""
      schema = get_schema() if not static_schema else static_schema
      properties = schema["properties"]
  
      raw_entry = deque([ConfigOption(dict(), False)])
      explored = explore_properties(
          properties,
          parent_parameter_path="",
          dq=raw_entry,
          allow_list=["trainer"],
      )
      config = ECD_CONFIG_SECTION_TO_CONFIG["trainer"]
      config = yaml.safe_load(config)
      config["model_type"] = "ecd"
      config["trainer"] = {"train_steps": 1}
  
      combined_configs = combine_configs(explored, config)
  
      # HACK(Arnav): Remove configs that have LARS, LAMB or Lion optimizers, or Paged or 8-bit optimizers.
      # This is because they require GPUs.
      filtered_configs = []
  
      for config, dataset in combined_configs:
          optimizer_type = (
              config.get("trainer", {})
              .get("optimizer", "")
              .get("type", "")
          )
  
          if optimizer_type not in {"lars", "lamb", "lion"} and not (
              "paged" in optimizer_type or "8bit" in optimizer_type
          ):
              filtered_configs.append((config, dataset))
  
      # Replace combined_configs with the filtered_configs
      combined_configs = filtered_configs
  
      logging.info(
          f"Generated {len(combined_configs)} for ECD trainer combinatorial tests."
      )
  
      for config, dataset in combined_configs:
          yield config, dataset
  
imports: import logging
  from collections import deque
  from pprint import pprint
  from typing import Any, Dict, Tuple
  import pandas
  import pytest
  import yaml
  from ludwig.api import LudwigModel
  from ludwig.config_sampling.explore_schema import combine_configs, ConfigOption, explore_properties
  from ludwig.config_validation.validation import get_schema
  from ludwig.types import ModelConfigDict
  from .configs import COMBINER_TYPE_TO_COMBINE_FN_MAP, ECD_CONFIG_SECTION_TO_CONFIG, FEATURE_TYPE_TO_CONFIG_FOR_DECODER_LOSS, FEATURE_TYPE_TO_CONFIG_FOR_ENCODER_PREPROCESSING
label_desc: Use image node_id 2 for calling a global function with example usage: ecd_trainer_config_generator(static_schema) without return types