class_docstr: Base clustering model container class, for easier definition of containers. Ensures consistent format
  before being turned into a dataframe row.
  
  Parameters
  ----------
  id : str
      ID used as index.
  name : str
      Full display name.
  class_def : type
      The class used for the model, eg. LogisticRegression.
  eq_function : type, default = None
      Function to use to check whether an object (model) can be considered equal to the model
      in the container. If None, will be ``is_instance(x, class_def)`` where x is the object.
  args : dict, default = {} (empty dict)
      The arguments to always pass to constructor when initializing object of class_def class.
  is_special : bool, default = False
      Is the model special (not intended to be used on its own, eg. VotingClassifier).
  tune_grid : dict of str : list, default = {} (empty dict)
      The hyperparameters tuning grid for random and grid search.
  tune_distribution : dict of str : Distribution, default = {} (empty dict)
      The hyperparameters tuning grid for other types of searches.
  tune_args : dict, default = {} (empty dict)
      The arguments to always pass to the tuner.
  is_gpu_enabled : bool, default = None
      If None, will try to automatically determine.
  
  Attributes
  ----------
  id : str
      ID used as index.
  name : str
      Full display name.
  class_def : type
      The class used for the model, eg. LogisticRegression.
  eq_function : type
      Function to use to check whether an object (model) can be considered equal to the model
      in the container. If None, will be ``is_instance(x, class_def)`` where x is the object.
  args : dict
      The arguments to always pass to constructor when initializing object of class_def class.
  is_special : bool
      Is the model special (not intended to be used on its own, eg. VotingClassifier).
  tune_grid : dict of str : list
      The hyperparameters tuning grid for random and grid search.
  tune_distribution : dict of str : Distribution
      The hyperparameters tuning grid for other types of searches.
  tune_args : dict
      The arguments to always pass to the tuner.
  is_gpu_enabled : bool
      If None, will try to automatically determine.
code: def __init__(
      self,
      id: str,
      name: str,
      class_def: type,
      eq_function: Optional[type] = None,
      args: Dict[str, Any] = None,
      is_special: bool = False,
      tune_grid: Dict[str, list] = None,
      tune_distribution: Dict[str, Distribution] = None,
      tune_args: Dict[str, Any] = None,
      is_gpu_enabled: Optional[bool] = None,
  ) -> None:
      if not args:
          args = {}
  
      if not tune_grid:
          tune_grid = {}
  
      if not tune_distribution:
          tune_distribution = {}
  
      if not tune_args:
          tune_args = {}
  
      super().__init__(
          id=id,
          name=name,
          class_def=class_def,
          eq_function=eq_function,
          args=args,
          is_special=is_special,
      )
      self.tune_grid = param_grid_to_lists(tune_grid)
      self.tune_distribution = tune_distribution
      self.tune_args = tune_args
  
      if is_gpu_enabled is not None:
          self.is_gpu_enabled = is_gpu_enabled
      else:
          self.is_gpu_enabled = bool(self.get_package_name() == "cuml")
  
imports: from typing import Any, Dict, List, Optional
  import numpy
  import pycaret.containers.base_container
  import pycaret.internal.cuml_wrappers
  from pycaret.containers.models.base_model import ModelContainer
  from pycaret.internal.cuml_wrappers import get_dbscan, get_kmeans
  from pycaret.internal.distributions import Distribution
  from pycaret.utils._dependencies import _check_soft_dependencies
  from pycaret.utils.generic import get_logger, param_grid_to_lists
label_desc: Use image node_id 1 to create a new ClusterContainer object from inherited base classes: ModelContainer with example: obj = ClusterContainer(id, name, class_def, eq_function, args, is_special, tune_grid, tune_distribution, tune_args, is_gpu_enabled)