code: def eval(self, data, name, feval=None):
          
          if not isinstance(data, Dataset):
              raise TypeError("Can only eval for Dataset instance")
          data_idx = -1
          if data is self.train_set:
              data_idx = 0
          else:
              for i in range_(len(self.valid_sets)):
                  if data is self.valid_sets[i]:
                      data_idx = i + 1
                      break
          # need to push new valid data
          if data_idx == -1:
              self.add_valid(data, name)
              data_idx = self.__num_dataset - 1
  
          return self.__inner_eval(name, data_idx, feval)
docs: Evaluate for data.
  
          Parameters
          ----------
          data : Dataset
              Data for the evaluating.
          name : string
              Name of the data.
          feval : callable or None, optional (default=None)
              Customized evaluation function.
              Should accept two parameters: preds, train_data,
              and return (eval_name, eval_result, is_higher_better) or list of such tuples.
              For multi-class task, the preds is group by class_id first, then group by row_id.
              If you want to get i-th row preds in j-th class, the access way is preds[j * num_data + i].
  
          Returns
          -------
          result : list
              List with evaluation results.