code: def handle_trial_end(self, data):
          
          hyper_params = json_tricks.loads(data['hyper_params'])
          bracket_id, i, _ = hyper_params['parameter_id'].split('_')
          hyper_configs = self.brackets[int(bracket_id)].inform_trial_end(int(i))
          if hyper_configs is not None:
              _logger.debug('bracket %s next round %s, hyper_configs: %s', bracket_id, i, hyper_configs)
              self.generated_hyper_configs = self.generated_hyper_configs + hyper_configs
              for _ in range(self.credit):
                  if not self.generated_hyper_configs:
                      break
                  params = self.generated_hyper_configs.pop()
                  ret = {
                      'parameter_id': params[0],
                      'parameter_source': 'algorithm',
                      'parameters': params[1]
                  }
                  send(CommandType.NewTrialJob, json_tricks.dumps(ret))
                  self.credit -= 1
docs: 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