code: def test_run_forecast_config_with_single_simple_silverkite_template():
      # The generic name of single simple silverkite templates are not added to `ModelTemplateEnum`,
      # therefore we test if these are recognized.
      data = generate_df_for_tests(freq="D", periods=365)
      df = data["df"]
      metric = EvaluationMetricEnum.MeanAbsoluteError
      evaluation_metric = EvaluationMetricParam(
          cv_selection_metric=metric.name,
          agg_periods=7,
          agg_func=np.max,
          null_model_params={
              "strategy": "quantile",
              "constant": None,
              "quantile": 0.5,
          },
      )
  
      evaluation_period = EvaluationPeriodParam(
          test_horizon=10,
          periods_between_train_test=5,
          cv_horizon=4,
          cv_min_train_periods=80,
          cv_expanding_window=False,
          cv_periods_between_splits=20,
          cv_periods_between_train_test=3,
          cv_max_splits=2,
      )
  
      model_components = ModelComponentsParam(
          hyperparameter_override=[
              {"estimator__yearly_seasonality": 1},
              {"estimator__yearly_seasonality": 2},
          ]
      )
      computation = ComputationParam(verbose=2)
      forecast_horizon = 27
      coverage = 0.90
  
      single_template_class = SimpleSilverkiteTemplateOptions(
          freq=SILVERKITE_COMPONENT_KEYWORDS.FREQ.value.DAILY,
          seas=SILVERKITE_COMPONENT_KEYWORDS.SEAS.value.NONE,
      )
  
      forecast_config = ForecastConfig(
          model_template=[
              single_template_class,
              "DAILY_ALGO_SGD",
              "SILVERKITE_DAILY_90",
          ],
          computation_param=computation,
          coverage=coverage,
          evaluation_metric_param=evaluation_metric,
          evaluation_period_param=evaluation_period,
          forecast_horizon=forecast_horizon,
          model_components_param=model_components,
      )
  
      forecaster = Forecaster()
      result = forecaster.run_forecast_config(
          df=df, config=forecast_config
      )
  
      summary = summarize_grid_search_results(result.grid_search)
      # single_template_class is 1 template,
      # "DAILY_ALGO_SGD" is 1 template and "SILVERKITE_DAILY_90" has 4 templates.
      # With 2 items in `hyperparameter_override, there should be a total of 12 cases.
      assert summary.shape[0] == 12
  
      # Tests functionality for single template class only.
      forecast_config = ForecastConfig(
          model_template=single_template_class,
          computation_param=computation,
          coverage=coverage,
          evaluation_metric_param=evaluation_metric,
          evaluation_period_param=evaluation_period,
          forecast_horizon=forecast_horizon,
      )
  
      forecaster = Forecaster()
      pipeline_parameters = forecaster.apply_forecast_config(
          df=df, config=forecast_config
      )
      assert_equal(
          actual=pipeline_parameters["hyperparameter_grid"],
          expected={
              "estimator__time_properties": [None],
              "estimator__origin_for_time_vars": [None],
              "estimator__train_test_thresh": [None],
              "estimator__training_fraction": [None],
              "estimator__fit_algorithm_dict": [
                  {
                      "fit_algorithm": "linear",
                      "fit_algorithm_params": None,
                  }
              ],
              "estimator__auto_holiday": [False],
              "estimator__holidays_to_model_separately": [[]],
              "estimator__holiday_lookup_countries": [[]],
              "estimator__holiday_pre_num_days": [0],
              "estimator__holiday_post_num_days": [0],
              "estimator__holiday_pre_post_num_dict": [None],
              "estimator__daily_event_df_dict": [None],
              "estimator__auto_holiday_params": [None],
              "estimator__daily_event_neighbor_impact": [None],
              "estimator__daily_event_shifted_effect": [None],
              "estimator__auto_growth": [False],
              "estimator__changepoints_dict": [None],
              "estimator__seasonality_changepoints_dict": [None],
              "estimator__auto_seasonality": [False],
              "estimator__yearly_seasonality": [0],
              "estimator__quarterly_seasonality": [0],
              "estimator__monthly_seasonality": [0],
              "estimator__weekly_seasonality": [0],
              "estimator__daily_seasonality": [0],
              "estimator__max_daily_seas_interaction_order": [0],
              "estimator__max_weekly_seas_interaction_order": [2],
              "estimator__autoreg_dict": [None],
              "estimator__simulation_num": [10],
              "estimator__fast_simulation": [False],
              "estimator__lagged_regressor_dict": [None],
              "estimator__min_admissible_value": [None],
              "estimator__max_admissible_value": [None],
              "estimator__normalize_method": ["zero_to_one"],
              "estimator__uncertainty_dict": [None],
              "estimator__growth_term": ["linear"],
              "estimator__regressor_cols": [[]],
              "estimator__feature_sets_enabled": [False],
              "estimator__extra_pred_cols": [[]],
              "estimator__drop_pred_cols": [None],
              "estimator__explicit_pred_cols": [None],
              "estimator__regression_weight_col": [None],
              "estimator__remove_intercept": [False],
          },
          ignore_keys={"estimator__time_properties": None},
      )
  
imports: import sys
  import warnings
  from enum import Enum
  import numpy
  import pandas
  import pytest
  from testfixtures import LogCapture
  from greykite.common.constants import LOGGER_NAME
  from greykite.common.constants import PREDICTED_LOWER_COL
  from greykite.common.constants import PREDICTED_UPPER_COL
  from greykite.common.constants import TIME_COL
  from greykite.common.constants import VALUE_COL
  from greykite.common.data_loader import DataLoader
  from greykite.common.evaluation import EvaluationMetricEnum
  from greykite.common.python_utils import assert_equal
  from greykite.common.testing_utils import generate_df_for_tests
  from greykite.common.testing_utils import generate_df_with_reg_for_tests
  from greykite.framework.templates.autogen.forecast_config import ComputationParam
  from greykite.framework.templates.autogen.forecast_config import EvaluationMetricParam
  from greykite.framework.templates.autogen.forecast_config import EvaluationPeriodParam
  from greykite.framework.templates.autogen.forecast_config import ForecastConfig
  from greykite.framework.templates.autogen.forecast_config import MetadataParam
  from greykite.framework.templates.autogen.forecast_config import ModelComponentsParam
  from greykite.framework.templates.forecaster import Forecaster
  from greykite.framework.templates.model_templates import ModelTemplate
  from greykite.framework.templates.model_templates import ModelTemplateEnum
  from greykite.framework.templates.prophet_template import ProphetTemplate
  from greykite.framework.templates.silverkite_template import SilverkiteTemplate
  from greykite.framework.templates.simple_silverkite_template import SimpleSilverkiteTemplate
  from greykite.framework.templates.simple_silverkite_template_config import SILVERKITE_COMPONENT_KEYWORDS
  from greykite.framework.templates.simple_silverkite_template_config import SimpleSilverkiteTemplateOptions
  from greykite.framework.utils.framework_testing_utils import assert_basic_pipeline_equal
  from greykite.framework.utils.framework_testing_utils import assert_forecast_pipeline_result_equal
  from greykite.framework.utils.framework_testing_utils import check_forecast_pipeline_result
  from greykite.framework.utils.result_summary import summarize_grid_search_results
label_desc: Use image node_id 9 for calling a global function with example usage: test_run_forecast_config_with_single_simple_silverkite_template() without return types