def METHOD_NAME(self, graph, feature, pos, edge_feat=None):
    """
    Args:
        graph: `pgl.Graph` instance.
        feature: A tensor with shape (num_nodes, input_size)
    Return:
        If `concat=True` then return a tensor with shape (num_nodes, hidden_size),
        else return a tensor with shape (num_nodes, hidden_size * num_heads) 
    """
    if self.feat_drop > 1e-15:
        feature = self.feat_dropout(feature)
    feature = self.linear(feature)
    feature = paddle.reshape(feature,
                             [-1, self.num_heads, self.hidden_size])
    attn_src = paddle.sum(feature * self.weight_src, axis=-1)
    attn_dst = paddle.sum(feature * self.weight_dst, axis=-1)
    if edge_feat is not None:
        msg = graph.send(
            self._send_attention,
            src_feat={"src": attn_src,
                      "pos_src": pos,
                      "h": feature},
            dst_feat={"dst": attn_dst, "pos_dst": pos},
            edge_feat={"edge_feat": edge_feat},
        )
    else:
        msg = graph.send(
            self._send_attention,
            src_feat={"src": attn_src,
                      "pos_src": pos,
                      "h": feature},
            dst_feat={"dst": attn_dst, "pos_dst": pos},
            )
    output = graph.recv(reduce_func=self._reduce_attention, msg=msg)
    if self.activation is not None:
        output = self.activation(output)
    return output