class_docstr: Class for benchmarking multiple ForecastConfig on a rolling window basis.
  
  Attributes
  ----------
  df : `pandas.DataFrame`
      Timeseries data to forecast.
      Contains columns [`time_col`, `value_col`], and optional regressor columns.
      Regressor columns should include future values for prediction.
  
  configs : `Dict` [`str`,  `ForecastConfig`]
      Dictionary of model configurations.
      A model configuration is a ``ForecastConfig``.
      See :class:`~greykite.framework.templates.autogen.forecast_config.ForecastConfig` for details on
      valid ``ForecastConfig``.
      Validity of the ``configs`` for benchmarking is checked via the ``validate`` method.
  
  tscv : `~greykite.sklearn.cross_validation.RollingTimeSeriesSplit`
      Cross-validation object that determines the rolling window evaluation.
      See :class:`~greykite.sklearn.cross_validation.RollingTimeSeriesSplit` for details.
      The ``forecast_horizon`` and ``periods_between_train_test`` parameters of ``configs`` are
      matched against that of ``tscv``. A ValueError is raised if there is a mismatch.
  
  forecaster : `~greykite.framework.templates.forecaster.Forecaster`
      Forecaster used to create the forecasts.
  
  is_run : bool, default False
      Indicator of whether the `run` method is executed.
      After executing `run`, this indicator is set to True.
      Some class methods like ``get_forecast`` requires ``is_run`` to be True
      to be executed.
  
  result : `dict`
      Stores the benchmarking results. Has the same keys as ``configs``.
  
  forecasts : `pandas.DataFrame`, default None
      Merged DataFrame of forecasts, upper and lower confidence interval for all
      input ``configs``. Also stores train end date and forecast step for each prediction.
docstr: Validates the inputs to the class for the method ``run``.
  
  Raises a ValueError if there is a mismatch between the following parameters
  of ``configs`` and ``tscv``:
  
   - ``forecast_horizon``
   - ``periods_between_train_test``
  
  Raises ValueError if all the ``configs`` do not have the same ``coverage`` parameter.
docstr_tok: ["Validates","the","inputs","to","the","class","for","the","method","``","run","``",".","Raises","a","ValueError","if","there","is","a","mismatch","between","the","following","parameters","of","``","configs","``","and","``","tscv","``",":","-","``","forecast_horizon","``","-","``","periods_between_train_test","``","Raises","ValueError","if","all","the","``","configs","``","do","not","have","the","same","``","coverage","``","parameter","."]
code: def validate(self):
      """Validates the inputs to the class for the method ``run``.
  
      Raises a ValueError if there is a mismatch between the following parameters
      of ``configs`` and ``tscv``:
  
       - ``forecast_horizon``
       - ``periods_between_train_test``
  
      Raises ValueError if all the ``configs`` do not have the same ``coverage`` parameter.
      """
      coverage_list = []
      for config_name, config in self.configs.items():
          # Computes pipeline parameters
          pipeline_params = self.forecaster.apply_forecast_config(
              df=self.df, config=config
          )
  
          # Checks forecast_horizon
          if (
              pipeline_params["forecast_horizon"]
              != self.tscv.forecast_horizon
          ):
              raise ValueError(
                  f"{config_name}'s 'forecast_horizon' ({config.forecast_horizon}) does "
                  f"not match that of 'tscv' ({self.tscv.forecast_horizon})."
              )
  
          # Checks periods_between_train_test
          if pipeline_params["periods_between_train_test"] is None:
              pipeline_params["periods_between_train_test"] = 0
          if (
              pipeline_params["periods_between_train_test"]
              != self.tscv.periods_between_train_test
          ):
              raise ValueError(
                  f"{config_name}'s 'periods_between_train_test' ({pipeline_params['periods_between_train_test']}) "
                  f"does not match that of 'tscv' ({self.tscv.periods_between_train_test})."
              )
  
          self.result[config_name] = dict(
              pipeline_params=pipeline_params
          )
          coverage_list.append(config.coverage)
  
      # Checks all coverages are same
      if coverage_list[1:] != coverage_list[:-1]:
          raise ValueError(
              "All forecast configs must have same coverage."
          )
  
imports: from typing import Dict
  from typing import List
  import numpy
  import pandas
  import plotly.graph_objects
  from plotly.colors import DEFAULT_PLOTLY_COLORS
  from tqdm.autonotebook import tqdm
  from greykite.common.constants import ACTUAL_COL
  from greykite.common.constants import PREDICTED_COL
  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.evaluation import EvaluationMetricEnum
  from greykite.common.evaluation import add_finite_filter_to_scorer
  from greykite.common.logging import LoggingLevelEnum
  from greykite.common.logging import log_message
  from greykite.common.python_utils import get_pattern_cols
  from greykite.common.viz.timeseries_plotting import plot_multivariate
  from greykite.common.viz.timeseries_plotting import plot_multivariate_grouped
  from greykite.framework.benchmark.benchmark_class_helper import forecast_pipeline_rolling_evaluation
  from greykite.framework.constants import FORECAST_STEP_COL
  from greykite.framework.templates.autogen.forecast_config import ForecastConfig
  from greykite.framework.templates.forecaster import Forecaster
  from greykite.sklearn.cross_validation import RollingTimeSeriesSplit
label_desc: Use image node_id 2 for calling the BenchmarkForecastConfig obj's underlying member method code with example usage: obj.validate() without return types