class_docstr: `SMAC <https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf>`__ is based on Sequential Model-Based Optimization (SMBO).
  It adapts the most prominent previously used model class (Gaussian stochastic process models)
  and introduces the model class of random forests to SMBO in order to handle categorical parameters.
  
  The SMAC supported by nni is a wrapper on `the SMAC3 github repo <https://github.com/automl/SMAC3>`__,
  following NNI tuner interface :class:`nni.tuner.Tuner`. For algorithm details of SMAC, please refer to the paper
  :footcite:t:`hutter2011sequential`.
  
  Note that SMAC on nni only supports a subset of the types in
  :doc:`search space </hpo/search_space>`:
  ``choice``, ``randint``, ``uniform``, ``loguniform``, and ``quniform``.
  
  Note that SMAC needs additional installation using the following command:
  
  .. code-block:: bash
  
      pip install nni[SMAC]
  
  ``swig`` is required for SMAC. for Ubuntu ``swig`` can be installed with ``apt``.
  
  Examples
  --------
  
  .. code-block::
  
      config.tuner.name = 'SMAC'
      config.tuner.class_args = {
          'optimize_mode': 'maximize'
      }
  
  Parameters
  ----------
  optimize_mode : str
      Optimize mode, 'maximize' or 'minimize', by default 'maximize'
  config_dedup : bool
      If True, the tuner will not generate a configuration that has been already generated.
      If False, a configuration may be generated twice, but it is rare for relatively large search space.
docstr: Generate mutiple instances of hyperparameters. If it is a first request,
  retrieve the instances from initial challengers. While if it is not, request
  new challengers and retrieve instances from the requested challengers.
  
  Parameters
  ----------
  parameter_id_list: list of int
      Unique identifiers for each set of requested hyper-parameters.
      These will later be used in :meth:`receive_trial_result`.
  **kwargs
      Not used
  
  Returns
  -------
  list
      a list of newly generated configurations
docstr_tok: ["Generate","mutiple","instances","of","hyperparameters",".","If","it","is","a","first","request",",","retrieve","the","instances","from","initial","challengers",".","While","if","it","is","not",",","request","new","challengers","and","retrieve","instances","from","the","requested","challengers",".","Parameters","--","--","--","--","--","parameter_id_list",":","list","of","int","Unique","identifiers","for","each","set","of","requested","hyper-parameters",".","These","will","later","be","used","in",":","meth",":","`","receive_trial_result","`",".","*","*","kwargs","Not","used","Returns","--","--","--","-","list","a","list","of","newly","generated","configurations"]
code: def generate_multiple_parameters(self, parameter_id_list, **kwargs):
      """
      Generate mutiple instances of hyperparameters. If it is a first request,
      retrieve the instances from initial challengers. While if it is not, request
      new challengers and retrieve instances from the requested challengers.
  
      Parameters
      ----------
      parameter_id_list: list of int
          Unique identifiers for each set of requested hyper-parameters.
          These will later be used in :meth:`receive_trial_result`.
      **kwargs
          Not used
  
      Returns
      -------
      list
          a list of newly generated configurations
      """
      if self.first_one:
          params = []
          for one_id in parameter_id_list:
              init_challenger = self.smbo_solver.nni_smac_start()
              self.total_data[one_id] = init_challenger
              params.append(
                  self.param_postprocess(
                      init_challenger.get_dictionary()
                  )
              )
      else:
          challengers = self.smbo_solver.nni_smac_request_challengers()
          cnt = 0
          params = []
          for challenger in challengers:
              if cnt >= len(parameter_id_list):
                  break
              if self.dedup:
                  match = [
                      v
                      for k, v in self.total_data.items()
                      if v.get_dictionary()
                      == challenger.get_dictionary()
                  ]
                  if match:
                      continue
              self.total_data[parameter_id_list[cnt]] = challenger
              params.append(
                  self.param_postprocess(challenger.get_dictionary())
              )
              cnt += 1
          if self.dedup and not params:
              self.logger.info(
                  "In generate_multiple_parameters: No more new parameters."
              )
      return params
  
imports: import logging
  import sys
  import numpy
  from schema import Schema, Optional
  from smac.facade.epils_facade import EPILS
  from smac.facade.roar_facade import ROAR
  from smac.facade.smac_facade import SMAC
  from smac.scenario.scenario import Scenario
  from smac.utils.io.cmd_reader import CMDReader
  from ConfigSpaceNNI import Configuration
  import nni
  from nni import ClassArgsValidator
  from nni.common.hpo_utils import validate_search_space
  from nni.tuner import Tuner
  from nni.utils import OptimizeMode, extract_scalar_reward
  from .convert_ss_to_scenario import generate_scenario
label_desc: Use image node_id 7 for calling the SMACTuner obj's underlying member method code with example usage: obj.generate_multiple_parameters(parameter_id_list) and returns: params