def METHOD_NAME(self):
    """ forward """
    hcl_logits_list = None
    id_embedding, slot_embedding_list = model_util.get_sparse_embedding(
        self.config, self.nodeid_slot_holder, self.discrete_slot_holders,
        self.discrete_slot_lod_holders, self.show_clk, self._use_cvm,
        self.emb_size)
    # merge id_embedding and slot_embedding_list here
    feature = paddle.add_n([id_embedding] + slot_embedding_list)
    if self.config.softsign:
        log.info("using softsign in feature_mode (sum)")
        feature = paddle.nn.functional.softsign(feature)
    if self.config.sage_mode:
        if self.config.hcl:
            hcl_logits_list = model_util.hcl(self.config, feature,
                                             self.graph_holders)
        feature = self.gnn_model(self.graph_holders, feature,
                                 self.node_degree)
        feature = paddle.gather(feature, self.final_index)
    feature = paddle.reshape(feature, shape=[-1, 2, self.emb_size])
    src_feat = feature[:, 0:1, :]
    dsts_feat_all = [feature[:, 1:, :]]
    for neg in range(self.neg_num):
        dsts_feat_all.append(F.layers.shuffle_batch(dsts_feat_all[0]))
    dsts_feat = paddle.concat(dsts_feat_all, axis=1)
    logits = paddle.matmul(
        src_feat, dsts_feat,
        transpose_y=True)  # [batch_size, 1, neg_num+1]
    logits = paddle.squeeze(logits, axis=[1])
    predictions = {}
    predictions["logits"] = logits  # [B, neg_num + 1]
    predictions["nfeat"] = feature  # [B, 2, d]
    predictions["src_nfeat"] = src_feat  # [B, 1, d]
    if hcl_logits_list is not None:
        predictions["hcl_logits"] = hcl_logits_list
    return predictions