class_docstr: Implementation of HpoExecutor Interface, where our custom logic is used as the backend
code: def execute(self, model_trial, train_fn_kwargs, **kwargs):
      assert (
          self.scheduler_options is not None
      ), "Call `initialize()` before execute"
      (
          scheduler_cls,
          scheduler_params,
      ) = self.scheduler_options  # Unpack tuple
      if scheduler_cls is None or scheduler_params is None:
          raise ValueError(
              "scheduler_cls and scheduler_params cannot be None for hyperparameter tuning"
          )
      train_fn_kwargs["fit_kwargs"].update(
          scheduler_params["resource"].copy()
      )
      scheduler = scheduler_cls(
          model_trial,
          search_space=self.search_space,
          train_fn_kwargs=train_fn_kwargs,
          **scheduler_params,
      )
      self.scheduler = scheduler
  
      scheduler.run()
      scheduler.join_jobs()
  
imports: from __future__ import annotations
  import copy
  import logging
  import math
  import os
  import time
  from abc import ABC, abstractmethod
  from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union
  import pandas
  from autogluon.common import space
  from autogluon.common.utils.resource_utils import ResourceManager
  from autogluon.common.utils.s3_utils import is_s3_url
  from ..ray.resources_calculator import ResourceCalculator
  from ..scheduler.scheduler_factory import scheduler_factory
  from ..utils.savers import save_pkl
  from .constants import CUSTOM_BACKEND, RAY_BACKEND
  from .exceptions import EmptySearchSpace
label_desc: Use image node_id 8 for calling the CustomHpoExecutor obj's underlying member method code with example usage: obj.execute(model_trial, train_fn_kwargs) without return types