code: def expand_param_grid(
      model: base.Estimator, grid: dict
  ) -> list[base.Estimator]:
      """Expands a grid of parameters.
  
      This method can be used to generate a list of model parametrizations from a dictionary where
      each parameter is associated with a list of possible parameters. In other words, it expands a
      grid of parameters.
  
      Typically, this method can be used to create copies of a given model with different parameter
      choices. The models can then be used as part of a model selection process, such as a
      `selection.SuccessiveHalvingClassifier` or a `selection.EWARegressor`.
  
      The syntax for the parameter grid is quite flexible. It allows nesting parameters and can
      therefore be used to generate parameters for a pipeline.
  
      Parameters
      ----------
      model
      grid
          The grid of parameters to expand. The provided dictionary can be nested. The only
          requirement is that the values at the leaves need to be lists.
  
      Examples
      --------
  
      As an initial example, we can expand a grid of parameters for a single model.
  
      >>> from river import linear_model
      >>> from river import optim
      >>> from river import utils
  
      >>> model = linear_model.LinearRegression()
  
      >>> grid = {'optimizer': [optim.SGD(.1), optim.SGD(.01), optim.SGD(.001)]}
      >>> models = utils.expand_param_grid(model, grid)
      >>> len(models)
      3
  
      >>> models[0]
      LinearRegression (
        optimizer=SGD (
          lr=Constant (
            learning_rate=0.1
          )
        )
        loss=Squared ()
        l2=0.
        l1=0.
        intercept_init=0.
        intercept_lr=Constant (
          learning_rate=0.01
        )
        clip_gradient=1e+12
        initializer=Zeros ()
      )
  
      You can expand parameters for multiple choices like so:
  
      >>> grid = {
      ...     'optimizer': [
      ...         (optim.SGD, {'lr': [.1, .01, .001]}),
      ...         (optim.Adam, {'lr': [.1, .01, .01]})
      ...     ]
      ... }
      >>> models = utils.expand_param_grid(model, grid)
      >>> len(models)
      6
  
      You may specify a grid of parameters for a pipeline via nesting:
  
      >>> from river import feature_extraction
  
      >>> model = (
      ...     feature_extraction.BagOfWords() |
      ...     linear_model.LinearRegression()
      ... )
  
      >>> grid = {
      ...     'BagOfWords': {
      ...         'strip_accents': [False, True]
      ...     },
      ...     'LinearRegression': {
      ...         'optimizer': [
      ...             (optim.SGD, {'lr': [.1, .01]}),
      ...             (optim.Adam, {'lr': [.1, .01]})
      ...         ]
      ...     }
      ... }
  
      >>> models = utils.expand_param_grid(model, grid)
      >>> len(models)
      8
  
      """
  
      return [
          model.clone(params) for params in _expand_param_grid(grid)
      ]
  
imports: from __future__ import annotations
  import itertools
  import typing
  import numpy
  from river import base
label_desc: Use image node_id 1 for calling a global function with example usage: expand_param_grid(model, grid) and returns: unknown