class_docstr: Implements a hyperparameter optimization algorithm.
  
  In a parallel tuning setting, there is only one `Oracle` instance. The
  workers would communicate with the centralized `Oracle` instance with gPRC
  calls to the `Oracle` methods.
  
  `Trial` objects are often used as the communication packet through the gPRC
  calls to pass information between the worker `Tuner` instances and the
  `Oracle`. For example, `Oracle.create_trial()` returns a `Trial` object, and
  `Oracle.end_trial()` accepts a `Trial` in its arguments.
  
  New copies of the same `Trial` instance are reconstructed as it going
  through the gRPC calls. The changes to the `Trial` objects in the worker
  `Tuner`s are synced to the original copy in the `Oracle` when they are
  passed back to the `Oracle` by calling `Oracle.end_trial()`.
  
  Args:
      objective: A string, `keras_tuner.Objective` instance, or a list of
          `keras_tuner.Objective`s and strings. If a string, the direction of
          the optimization (min or max) will be inferred. If a list of
          `keras_tuner.Objective`, we will minimize the sum of all the
          objectives to minimize subtracting the sum of all the objectives to
          maximize. The `objective` argument is optional when
          `Tuner.run_trial()` or `HyperModel.fit()` returns a single float as
          the objective to minimize.
      max_trials: Integer, the total number of trials (model configurations)
          to test at most. Note that the oracle may interrupt the search
          before `max_trial` models have been tested if the search space has
          been exhausted.
      hyperparameters: Optional `HyperParameters` instance. Can be used to
          override (or register in advance) hyperparameters in the search
          space.
      tune_new_entries: Boolean, whether hyperparameter entries that are
          requested by the hypermodel but that were not specified in
          `hyperparameters` should be added to the search space, or not. If
          not, then the default value for these parameters will be used.
          Defaults to True.
      allow_new_entries: Boolean, whether the hypermodel is allowed to
          request hyperparameter entries not listed in `hyperparameters`.
          Defaults to True.
      seed: Int. Random seed.
      max_retries_per_trial: Integer. Defaults to 0. The maximum number of
          times to retry a `Trial` if the trial crashed or the results are
          invalid.
      max_consecutive_failed_trials: Integer. Defaults to 3. The maximum
          number of consecutive failed `Trial`s. When this number is reached,
          the search will be stopped. A `Trial` is marked as failed when none
          of the retries succeeded.
docstr: Logistics when a `Trial` finished running.
  
  Record the `Trial` information and end the trial or send it for retry.
  
  Args:
      trial: The Trial to be ended. `trial.status` should be one of
          `"COMPLETED"` (the trial finished normally), `"INVALID"` (the
          trial has crashed or been deemed infeasible, but subject to
          retries), or `"FAILED"` (The Trial is failed. No more retries
          needed.). `trial.message` is an optional string, which is the
          error message if the trial status is `"INVALID"` or `"FAILED"`.
docstr_tok: ["Logistics","when","a","`","Trial","`","finished","running",".","Record","the","`","Trial","`","information","and","end","the","trial","or","send","it","for","retry",".","Args",":","trial",":","The","Trial","to","be","ended",".","`","trial.status","`","should","be","one","of","`","``","COMPLETED","''","`","(","the","trial","finished","normally",")",",","`","``","INVALID","''","`","(","the","trial","has","crashed","or","been","deemed","infeasible",",","but","subject","to","retries",")",",","or","`","``","FAILED","''","`","(","The","Trial","is","failed",".","No","more","retries","needed.",")",".","`","trial.message","`","is","an","optional","string",",","which","is","the","error","message","if","the","trial","status","is","`","``","INVALID","''","`","or","`","``","FAILED","''","`","."]
code: def end_trial(self, trial):
      """Logistics when a `Trial` finished running.
  
      Record the `Trial` information and end the trial or send it for retry.
  
      Args:
          trial: The Trial to be ended. `trial.status` should be one of
              `"COMPLETED"` (the trial finished normally), `"INVALID"` (the
              trial has crashed or been deemed infeasible, but subject to
              retries), or `"FAILED"` (The Trial is failed. No more retries
              needed.). `trial.message` is an optional string, which is the
              error message if the trial status is `"INVALID"` or `"FAILED"`.
      """
      # To support parallel tuning, the information in the `trial` argument is
      # synced back to the `Oracle`. Update the self.trials with the given
      # trial.
      old_trial = self.trials[trial.trial_id]
      old_trial.hyperparameters = trial.hyperparameters
      old_trial.status = trial.status
      old_trial.message = trial.message
      trial = old_trial
  
      self.update_space(trial.hyperparameters)
      if trial.status == trial_module.TrialStatus.COMPLETED:
          self.score_trial(trial)
          if np.isnan(trial.score):
              trial.status = trial_module.TrialStatus.INVALID
  
      # Record the values again in case of new hps appeared.
      self._record_values(trial)
  
      self._run_times[trial.trial_id] += 1
  
      # Check if need to retry the trial.
      if not self._retry(trial):
          self.end_order.append(trial.trial_id)
          self._check_consecutive_failures()
  
      self._save_trial(trial)
      self.save()
  
      self._display.on_trial_end(trial)
  
      # Pop the ongoing trial at last, which would notify the chief server to
      # stop when ongoing_trials is empty.
      for tuner_id, ongoing_trial in self.ongoing_trials.items():
          if ongoing_trial.trial_id == trial.trial_id:
              self.ongoing_trials.pop(tuner_id)
              break
  
imports: import collections
  import hashlib
  import os
  import random
  import threading
  import warnings
  from datetime import datetime
  import numpy
  from keras_tuner import backend
  from keras_tuner import utils
  from keras_tuner.api_export import keras_tuner_export
  from keras_tuner.engine import hyperparameters
  from keras_tuner.engine import objective
  from keras_tuner.engine import stateful
  from keras_tuner.engine import trial
label_desc: Use image node_id 11 for calling the Oracle obj's underlying member method code with example usage: obj.end_trial(trial) without return types