code: def search(
      input_dict: Dict[str, List[types.Artifact]],
      exec_properties: Dict[str, Any],
      working_dir: str,
      print_tuning_summary: bool = True,
  ) -> base_tuner.BaseTuner:
      """Conduct a single hyperparameter search loop, and return the Tuner."""
      tuner_fn = _get_tuner_fn(exec_properties)
  
      fn_args = fn_args_utils.get_common_fn_args(
          input_dict, exec_properties, working_dir
      )
  
      tuner_fn_result = tuner_fn(fn_args)
      result = tuner_fn_result.tuner
  
      # TODO(b/156966497): set logger for printing.
      if print_tuning_summary:
          result.search_space_summary()
      logging.info("Start tuning... Tuner ID: %s", result.tuner_id)
      result.search(**tuner_fn_result.fit_kwargs)
      logging.info("Finished tuning... Tuner ID: %s", result.tuner_id)
      if print_tuning_summary:
          result.results_summary()
  
      return result
  
imports: import json
  import os
  from typing import Any, Callable, Dict, List, Optional
  from absl import logging
  from keras_tuner.engine import base_tuner
  from keras_tuner.engine import trial
  from tfx import types
  from tfx.components.trainer import fn_args_utils
  from tfx.components.util import udf_utils
  from tfx.dsl.components.base import base_executor
  from tfx.proto import tuner_pb2
  from tfx.types import artifact_utils
  from tfx.types import standard_component_specs
  from tfx.utils import io_utils
  from tfx.utils import proto_utils
label_desc: Use image node_id 4 for calling a global function with example usage: search(input_dict, exec_properties, working_dir, print_tuning_summary) and returns: result