code: def handle_trial_end(self, data):
          
          logger.debug('Tuner handle trial end, result is %s', data)
  
          hyper_params = json_tricks.loads(data['hyper_params'])
          s, i, _ = hyper_params['parameter_id'].split('_')
          hyper_configs = self.brackets[int(s)].inform_trial_end(int(i))
  
          if hyper_configs is not None:
              logger.debug(
                  'bracket %s next round %s, hyper_configs: %s', s, i, hyper_configs)
              self.generated_hyper_configs = self.generated_hyper_configs + hyper_configs
              for _ in range(self.credit):
                  self._request_one_trial_job()
          # Finish this bracket and generate a new bracket
          elif self.brackets[int(s)].no_more_trial:
              self.curr_s -= 1
              self.generate_new_bracket()
              for _ in range(self.credit):
                  self._request_one_trial_job()
docs: receive the information of trial end and generate next configuaration.
  
          Parameters
          ----------
          data: dict()
              it has three keys: trial_job_id, event, hyper_params
              trial_job_id: the id generated by training service
              event: the job's state
              hyper_params: the hyperparameters (a string) generated and returned by tuner