def METHOD_NAME(self, xtrain, ytrain, train_info=None, params=None, **kwargs):
    # normalize accuracies
    self.mean = np.mean(ytrain)
    self.std = np.std(ytrain)
    if type(xtrain) is list:
        # TODO: Fix. Hacky way to make XGBoost accept both encodings as well as NASLib Graphs as xtrain
        if isinstance(xtrain[0], nn.Module):
            xtrain = np.array([arch.encode(encoding_type=self.encoding_type) for arch in xtrain])
        if self.zc:
            # mean, std = -10000000.0, 150000000.0
            # xtrain = [[*x, (train_info[i]-mean)/std] for i, x in enumerate(xtrain)]
            if self.zc_only:
                xtrain = self.zc_features
            else:
                xtrain = [[*x, *zc_scores] for x, zc_scores in zip (xtrain, self.zc_features)]
        xtrain = np.array(xtrain)
        ytrain = np.array(ytrain)
    else:
        # when used in aug_lcsvr we feed in ndarray directly
        xtrain = xtrain
        ytrain = ytrain
    if self.zc:
        self.zc_to_features_map = self._get_zc_to_feature_mapping(self.zc_names, xtrain)
    # convert to the right representation
    train_data = self.get_dataset(xtrain, ytrain)
    # fit to the training data
    self.model = self.train(train_data)
    # predict
    train_pred = np.squeeze(self.predict(xtrain))
    train_error = np.mean(abs(train_pred-ytrain))
    return train_error