docstr: Check candidate compatibility with `feature_engineer` template guidelines and space
  choices. This method is different from the other "does_match..." methods in two important
  aspects:
  
  1. It checks both guidelines and choices in a single method
  2. It returns an updated `feature_engineer` for compatible candidates, rather than True
  
  Parameters
  ----------
  exp_id: String
      Candidate Experiment ID
  params: Dict
      Candidate "feature_engineer" to compare to the template in :attr:`model_params`. This
      should always be a dict, not an instance of `FeatureEngineer`, which is not the case
      for the template "feature_engineer" in :attr:`model_params`
  score: Number
      Value of the candidate Experiment's target metric
  
  Returns
  -------
  Boolean, dict, or FeatureEngineer
      Expanding on the second difference noted in the description, False will still be
      returned if the candidate is deemed incompatible with the template (as is the case with
      the other "does_match..." methods). The return value differs with compatible candidates
      in order to provide a `feature_engineer` with reinitialized
      :class:`~hyperparameter_hunter.feature_engineering.EngineerStep` steps and to fill in
      missing :class:`~hyperparameter_hunter.spaces.dimensions.Categorical` steps that were
      declared as :attr:`~hyperparameter_hunter.spaces.dimensions.Categorical.optional` by the
      template. This updated `feature_engineer` is the value that then gets included in the
      candidate's :attr:`similar_experiments` entry (assuming candidate is a full match)
docstr_tok: ["Check","candidate","compatibility","with","`","feature_engineer","`","template","guidelines","and","space","choices",".","This","method","is","different","from","the","other","``","does_match","...","''","methods","in","two","important","aspects",":","1",".","It","checks","both","guidelines","and","choices","in","a","single","method","2",".","It","returns","an","updated","`","feature_engineer","`","for","compatible","candidates",",","rather","than","True","Parameters","--","--","--","--","--","exp_id",":","String","Candidate","Experiment","ID","params",":","Dict","Candidate","``","feature_engineer","''","to","compare","to","the","template","in",":","attr",":","`","model_params","`",".","This","should","always","be","a","dict",",","not","an","instance","of","`","FeatureEngineer","`",",","which","is","not","the","case","for","the","template","``","feature_engineer","''","in",":","attr",":","`","model_params","`","score",":","Number","Value","of","the","candidate","Experiment","'s","target","metric","Returns","--","--","--","-","Boolean",",","dict",",","or","FeatureEngineer","Expanding","on","the","second","difference","noted","in","the","description",",","False","will","still","be","returned","if","the","candidate","is","deemed","incompatible","with","the","template","(","as","is","the","case","with","the","other","``","does_match","...","''","methods",")",".","The","return","value","differs","with","compatible","candidates","in","order","to","provide","a","`","feature_engineer","`","with","reinitialized",":","class",":","`","~hyperparameter_hunter.feature_engineering.EngineerStep","`","steps","and","to","fill","in","missing",":","class",":","`","~hyperparameter_hunter.spaces.dimensions.Categorical","`","steps","that","were","declared","as",":","attr",":","`","~hyperparameter_hunter.spaces.dimensions.Categorical.optional","`","by","the","template",".","This","updated","`","feature_engineer","`","is","the","value","that","then","gets","included","in","the","candidate","'s",":","attr",":","`","similar_experiments","`","entry","(","assuming","candidate","is","a","full","match",")"]
code: def does_match_feature_engineer(
      self, exp_id, params, score
  ) -> Union[bool, dict, FeatureEngineer]:
      """Check candidate compatibility with `feature_engineer` template guidelines and space
      choices. This method is different from the other "does_match..." methods in two important
      aspects:
  
      1. It checks both guidelines and choices in a single method
      2. It returns an updated `feature_engineer` for compatible candidates, rather than True
  
      Parameters
      ----------
      exp_id: String
          Candidate Experiment ID
      params: Dict
          Candidate "feature_engineer" to compare to the template in :attr:`model_params`. This
          should always be a dict, not an instance of `FeatureEngineer`, which is not the case
          for the template "feature_engineer" in :attr:`model_params`
      score: Number
          Value of the candidate Experiment's target metric
  
      Returns
      -------
      Boolean, dict, or FeatureEngineer
          Expanding on the second difference noted in the description, False will still be
          returned if the candidate is deemed incompatible with the template (as is the case with
          the other "does_match..." methods). The return value differs with compatible candidates
          in order to provide a `feature_engineer` with reinitialized
          :class:`~hyperparameter_hunter.feature_engineering.EngineerStep` steps and to fill in
          missing :class:`~hyperparameter_hunter.spaces.dimensions.Categorical` steps that were
          declared as :attr:`~hyperparameter_hunter.spaces.dimensions.Categorical.optional` by the
          template. This updated `feature_engineer` is the value that then gets included in the
          candidate's :attr:`similar_experiments` entry (assuming candidate is a full match)
      """
      return validate_feature_engineer(
          params, self.model_params["feature_engineer"]
      )
  
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 5 for calling the ResultFinder obj's underlying member method code with example usage: obj.does_match_feature_engineer(exp_id, params, score) and returns: validate_feature_engineer