docstr: Check candidate compatibility with `model_init_params` template guidelines when a
  guideline hyperparameter is directly affected by another hyperparameter that is given as
  a space choice
  
  Parameters
  ----------
  exp_id: String
      Candidate Experiment ID
  params: Dict
      Candidate "model_init_params" to compare to the template in :attr:`model_params`
  score: Number
      Value of the candidate Experiment's target metric
  location: Tuple
      Location of the hyperparameter space choice that affects the acceptable guideline values
      of a particular hyperparameter. In other words, this is the path of a hyperparameter,
      which, if changed, would change the expected default value of another hyperparameter
  
  Returns
  -------
  Boolean
      True if candidate `params` match `model_init_params` guidelines. Else, False
  
  Notes
  -----
  This is used for Keras Experiments when the `optimizer` value in a model's `compile_params`
  is given as a hyperparameter space choice. Each possible value of `optimizer` prescribes
  different default values for the `optimizer_params` argument, so special measures need to be
  taken to ensure the correct Experiments are declared to fit within the constraints
docstr_tok: ["Check","candidate","compatibility","with","`","model_init_params","`","template","guidelines","when","a","guideline","hyperparameter","is","directly","affected","by","another","hyperparameter","that","is","given","as","a","space","choice","Parameters","--","--","--","--","--","exp_id",":","String","Candidate","Experiment","ID","params",":","Dict","Candidate","``","model_init_params","''","to","compare","to","the","template","in",":","attr",":","`","model_params","`","score",":","Number","Value","of","the","candidate","Experiment","'s","target","metric","location",":","Tuple","Location","of","the","hyperparameter","space","choice","that","affects","the","acceptable","guideline","values","of","a","particular","hyperparameter",".","In","other","words",",","this","is","the","path","of","a","hyperparameter",",","which",",","if","changed",",","would","change","the","expected","default","value","of","another","hyperparameter","Returns","--","--","--","-","Boolean","True","if","candidate","`","params","`","match","`","model_init_params","`","guidelines",".","Else",",","False","Notes","--","--","-","This","is","used","for","Keras","Experiments","when","the","`","optimizer","`","value","in","a","model","'s","`","compile_params","`","is","given","as","a","hyperparameter","space","choice",".","Each","possible","value","of","`","optimizer","`","prescribes","different","default","values","for","the","`","optimizer_params","`","argument",",","so","special","measures","need","to","be","taken","to","ensure","the","correct","Experiments","are","declared","to","fit","within","the","constraints"]
code: def does_match_init_params_guidelines_multi(
      self, exp_id, params, score, location
  ) -> bool:
      """Check candidate compatibility with `model_init_params` template guidelines when a
      guideline hyperparameter is directly affected by another hyperparameter that is given as
      a space choice
  
      Parameters
      ----------
      exp_id: String
          Candidate Experiment ID
      params: Dict
          Candidate "model_init_params" to compare to the template in :attr:`model_params`
      score: Number
          Value of the candidate Experiment's target metric
      location: Tuple
          Location of the hyperparameter space choice that affects the acceptable guideline values
          of a particular hyperparameter. In other words, this is the path of a hyperparameter,
          which, if changed, would change the expected default value of another hyperparameter
  
      Returns
      -------
      Boolean
          True if candidate `params` match `model_init_params` guidelines. Else, False
  
      Notes
      -----
      This is used for Keras Experiments when the `optimizer` value in a model's `compile_params`
      is given as a hyperparameter space choice. Each possible value of `optimizer` prescribes
      different default values for the `optimizer_params` argument, so special measures need to be
      taken to ensure the correct Experiments are declared to fit within the constraints
      """
      _model_params = deepcopy(self.model_params["model_init_params"])
  
      if location == ("compile_params", "optimizer"):
          from keras.optimizers import get as k_opt_get
  
          update_location = ("compile_params", "optimizer_params")
          # `update_location` = Path to hyperparameter whose default value depends on `location`
          allowed_values = get_path(_model_params, location).bounds
          # `allowed_values` = Good `("model_init_params", "compile_params", "optimizer")` values
  
          #################### Handle First Value (Dummy) ####################
          is_match = self.does_match_init_params_guidelines(
              exp_id, params, score
          )
          # The first value gets handled separately from the rest because the value at
          #   `update_location` is set according to `allowed_values[0]`. For the remaining
          #   `allowed_values`, we need to manually set `update_location` for each
  
          # If the first value was a match, the below `while` loop will never be entered because
          #   `is_match` is already True
  
          #################### Handle Remaining Values ####################
          allowed_val_index = 1
          while is_match is not True and allowed_val_index < len(
              allowed_values
          ):
              allowed_val = allowed_values[allowed_val_index]
              # Determine current default value for the dependent hyperparameter
              updated_val = k_opt_get(allowed_val).get_config()
  
              # Set value at `update_location` to `updated_val`, then check if params match
              def _visit(path, key, value):
                  """If `path` + `key` == `update_location`, return default for this choice. Else,
                  default_visit"""
                  if path + (key,) == update_location:
                      return (key, updated_val)
                  return (key, value)
  
              is_match = self.does_match_init_params_guidelines(
                  exp_id,
                  params,
                  score,
                  template_params=remap(_model_params, visit=_visit),
              )
              # If `is_match` is True, the loop stops and :attr:`match_status`'s value at `exp_id`
              #   for `does_match_init_params_guidelines` remains truthy
  
              allowed_val_index += 1
          return is_match
      else:
          raise ValueError(
              "Received unhandled location: {}".format(location)
          )
  
imports: from hyperparameter_hunter.feature_engineering import EngineerStep, FeatureEngineer
  from hyperparameter_hunter.i_o.exceptions import IncompatibleCandidateError
  from hyperparameter_hunter.compat.keras_helper import keras_callback_to_dict, keras_initializer_to_dict
  from hyperparameter_hunter.settings import G
  from hyperparameter_hunter.space.dimensions import Categorical, RejectedOptional
  from hyperparameter_hunter.space.space_core import Space
  from hyperparameter_hunter.utils.boltons_utils import remap, get_path
  from hyperparameter_hunter.utils.general_utils import multi_visit
  from hyperparameter_hunter.utils.optimization_utils import does_fit_in_space, get_ids_by, get_scored_params
  from copy import deepcopy
  from numbers import Number
  from pathlib import Path
  from typing import Dict, List, Tuple, Union
  import wrapt
label_desc: Use image node_id 8 for calling the ResultFinder obj's underlying member method code with example usage: obj.does_match_init_params_guidelines_multi(exp_id, params, score, location) and returns: is_match, key,  value, key,  updated_val