docstr: Call tuner to process final results
          
docstr_tok: ["Call","tuner","to","process","final","results"]
code: def _handle_final_metric_data(self, data):
      """Call tuner to process final results"""
      id_ = data["parameter_id"]
      value = data["value"]
      if id_ is None or id_ in _customized_parameter_ids:
          if not hasattr(self.tuner, "_accept_customized"):
              self.tuner._accept_customized = False
          if not self.tuner._accept_customized:
              _logger.info(
                  "Customized trial job %s ignored by tuner", id_
              )
              return
          customized = True
      else:
          customized = False
      if id_ in _trial_params:
          self.tuner.receive_trial_result(
              id_,
              _trial_params[id_],
              value,
              customized=customized,
              trial_job_id=data.get("trial_job_id"),
          )
      else:
          _logger.warning(
              "Find unknown job parameter id %s, maybe something goes wrong.",
              id_,
          )
          _logger.warning("_trial_params %s", _trial_params)
  
imports: import logging
  from collections import defaultdict
  from nni import NoMoreTrialError
  from nni.assessor import AssessResult
  from .common import multi_phase_enabled
  from .env_vars import dispatcher_env_vars
  from .msg_dispatcher_base import MsgDispatcherBase
  from .tuner_command_channel import CommandType
  from ..common.serializer import dump, load
  from ..utils import MetricType
label_desc: Use image node_id 12 for calling the MsgDispatcher obj's underlying member method code with example usage: obj._handle_final_metric_data(data) without return types