code: def forward(self, edge_index, num_nodes, feature):
      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)
  
      msg = self.send(
          edge_index,
          self._send_attention,
          src_feat={"src": attn_src, "h": feature},
          dst_feat={"dst": attn_dst},
      )
  
      output = self.recv(
          edge_index,
          num_nodes,
          reduce_func=self._reduce_attention,
          msg=msg,
      )
  
      if self.activation is not None:
          output = self.activation(output)
      return output
  
file_path: PGL/examples/gnn_depoly/models/conv/gat_conv.py
imports: import paddle
  import paddle.nn
  from .base_conv import BaseConv
label_desc: Use image node_id 4 for calling the GATConv obj's underlying member method code with example usage: obj.forward(edge_index, num_nodes, feature) and returns: output