code: def test_load_config_missing_hyperopt():
      old_valid_config = {
          "input_features": [
              {"name": "feature_1", "type": "category"},
              {"name": "Sex", "type": "category", "encoder": "dense"},
          ],
          "output_features": [
              {"name": "Survived", "type": "category"},
          ],
          "combiner": {"type": "concat"},
          "trainer": {},
          "hyperopt": {},
      }
  
      config_obj = ModelConfig.from_dict(old_valid_config)
      assert config_obj.hyperopt is None
      assert config_obj.to_dict()[HYPEROPT] is None
  
imports: import copy
  import math
  from typing import Any, Dict
  import pytest
  from ludwig.constants import BATCH_SIZE, BFILL, CLASS_WEIGHTS, DEFAULTS, EVAL_BATCH_SIZE, EXECUTOR, HYPEROPT, INPUT_FEATURES, LEARNING_RATE_SCHEDULER, LOSS, NUMBER, OUTPUT_FEATURES, PREPROCESSING, SCHEDULER, SPLIT, TRAINER, TYPE
  from ludwig.schema.model_config import ModelConfig
  from ludwig.schema.trainer import ECDTrainerConfig
  from ludwig.utils.backward_compatibility import _update_backend_cache_credentials, _upgrade_encoder_decoder_params, _upgrade_feature, _upgrade_preprocessing_split, upgrade_config_dict_to_latest_version, upgrade_missing_value_strategy, upgrade_model_progress
  from ludwig.utils.trainer_utils import TrainerMetric
label_desc: Use image node_id 15 for calling a global function with example usage: test_load_config_missing_hyperopt() without return types