code: def test_hyperopt_executor(
      scenario, csv_filename, tmpdir, ray_cluster_4cpu
  ):
      search_alg = scenario["search_alg"]
      executor = scenario["executor"]
      # When using the hb_bohb scheduler, num_epochs must equal max_t (which is 81 by default)
      epochs = (
          2
          if scenario["executor"].get("scheduler", {}).get("type", {})
          != "hb_bohb"
          else 81
      )
      run_hyperopt_executor(
          search_alg, executor, epochs, csv_filename, tmpdir
      )
  
imports: import json
  import logging
  import os.path
  from typing import Dict, List
  import mlflow
  import pandas
  import pytest
  from mlflow.tracking import MlflowClient
  from ludwig.backend import initialize_backend
  from ludwig.callbacks import Callback
  from ludwig.constants import ACCURACY, AUTO, BATCH_SIZE, EXECUTOR, MAX_CONCURRENT_TRIALS, TRAINER
  from ludwig.contribs.mlflow import MlflowCallback
  from ludwig.globals import HYPEROPT_STATISTICS_FILE_NAME, MODEL_HYPERPARAMETERS_FILE_NAME
  from ludwig.hyperopt.results import HyperoptResults
  from ludwig.hyperopt.run import hyperopt
  from ludwig.hyperopt.utils import update_hyperopt_params_with_defaults
  from ludwig.schema.model_config import ModelConfig
  from ludwig.utils.automl.utils import get_model_type
  from tests.integration_tests.utils import category_feature, generate_data, text_feature
label_desc: Use image node_id 3 for calling a global function with example usage: test_hyperopt_executor(scenario, csv_filename, tmpdir, ray_cluster_4cpu) without return types