code: def test_config_bad_combiner_types_enums():
      config = {
          "input_features": [
              category_feature(
                  encoder={"type": "dense", "vocab_size": 2},
                  reduce_input="sum",
              ),
              number_feature(),
          ],
          "output_features": [binary_feature()],
          "combiner": {
              "type": "concat",
              "weights_initializer": "zeros",
          },
      }
  
      # config is valid at this point
      check_schema(config)
  
      # Test weights initializer:
      config["combiner"]["weights_initializer"] = {"test": "fail"}
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["weights_initializer"] = "fail"
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["weights_initializer"] = {}
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["weights_initializer"] = {"type": "fail"}
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["weights_initializer"] = {
          "type": "normal",
          "stddev": 0,
      }
      check_schema(config)
  
      # Test bias initializer:
      del config["combiner"]["weights_initializer"]
      config["combiner"]["bias_initializer"] = "kaiming_uniform"
      check_schema(config)
      config["combiner"]["bias_initializer"] = "fail"
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["bias_initializer"] = {}
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["bias_initializer"] = {"type": "fail"}
      with pytest.raises(ConfigValidationError):
          check_schema(config)
      config["combiner"]["bias_initializer"] = {
          "type": "zeros",
          "stddev": 0,
      }
      check_schema(config)
  
      # Test norm:
      del config["combiner"]["bias_initializer"]
      config["combiner"]["norm"] = "batch"
      check_schema(config)
      config["combiner"]["norm"] = "fail"
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
      # Test activation:
      del config["combiner"]["norm"]
      config["combiner"]["activation"] = "relu"
      check_schema(config)
      config["combiner"]["activation"] = 123
      with pytest.raises(ConfigValidationError):
          check_schema(config)
  
      # Test reduce_output:
      del config["combiner"]["activation"]
      config2 = {**config}
      config2["combiner"]["type"] = "tabtransformer"
      config2["combiner"]["reduce_output"] = "sum"
      check_schema(config)
      config2["combiner"]["reduce_output"] = "fail"
      with pytest.raises(ConfigValidationError):
          check_schema(config2)
  
      # Test reduce_output = None:
      config2["combiner"]["reduce_output"] = None
      check_schema(config2)
  
file_path: ludwig/tests/ludwig/config_validation/test_validate_config_combiner.py
imports: import pytest
  from ludwig.config_validation.validation import check_schema, get_schema
  from ludwig.constants import MODEL_ECD, TRAINER
  from ludwig.error import ConfigValidationError
  from tests.integration_tests.utils import binary_feature, category_feature, number_feature
label_desc: Use image node_id 4 for calling a global function with example usage: test_config_bad_combiner_types_enums() without return types