class_docstr: Implement of GAT
      
class_docstr_tok: ["Implement","of","GAT"]
code: def forward(
      self,
      graph_list,
      feature,
      m2v_feature,
      p2p_feature,
      label_y,
      label_idx,
      batch_nodes,
      pos,
  ):
      # whether to use fuse input
      feature = feature + pos
      # p2p_fc = self.input_drop(self.p2p_fc(p2p_feature))
      m2v_fc = self.input_drop(self.m2v_fc(m2v_feature))
      feature = feature + m2v_fc
  
      label_embed = self.label_embed(label_y)
      label_embed = self.input_drop(label_embed)
      feature_label = paddle.gather(feature, label_idx)
      label_embed = paddle.concat([label_embed, feature_label], axis=1)
      label_embed = self.label_mlp(label_embed)
      feature = paddle.scatter(
          feature, label_idx, label_embed, overwrite=True
      )
      pp = pos.astype("float32") + m2v_fc
  
      for idx, (
          edge_src,
          edge_dst,
          edge_split,
          next_num_nodes,
          num_nodes,
      ) in enumerate(graph_list):
          temp_feat = []
          # post-smoothing
          skip_feat = feature[:next_num_nodes]  # 当前采样图中心点对应的特征
          skip_feat = self.skips[idx](skip_feat)
          skip_feat = self.norms[idx][0](skip_feat)
          skip_feat = F.elu(skip_feat)
          temp_feat.append(skip_feat)
          if self.gpr_attn is not None:
              if idx == 0:
                  gpr_feature = self.gpr_attn[idx] * skip_feat
              else:
                  gpr_feature = (
                      gpr_feature[:next_num_nodes]
                      + self.gpr_attn[idx] * skip_feat
                  )
          for i in range(self.edge_type):
              m_sg = self.get_subgraph_by_edge_split(
                  i, edge_src, edge_dst, edge_split, num_nodes
              )
              if m_sg is not None:
                  # 分别gat, 并且取采样图中心对应特征
                  feature_temp = self.gats[idx][i](m_sg, feature, pp)
                  feature_temp = self.norms[idx][i + 1](
                      feature_temp[:next_num_nodes]
                  )
                  feature_temp = F.elu(feature_temp)
                  temp_feat.append(feature_temp)
          # all_type_feaute fuse using att
          temp_feat = paddle.stack(temp_feat, axis=1)
          temp_feat_attn = self.path_attns[idx](temp_feat)
          temp_feat_attn = F.softmax(temp_feat_attn, axis=1)
          temp_feat_attn = paddle.transpose(
              temp_feat_attn, perm=[0, 2, 1]
          )
          skip_feat = paddle.bmm(temp_feat_attn, temp_feat)[:, 0]
          skip_feat = self.path_norms[idx](skip_feat)
          feature = self.dropout(skip_feat)
      gpr_feature = (
          (gpr_feature[:next_num_nodes] + self.gpr_attn[-1] * feature)
          if self.gpr_attn is not None
          else feature
      )
      output = self.mlp(gpr_feature)
      return output
  
file_path: PGL/examples/NeurIPS2022-OGB-Challenge/MAG240M/models/r_unimp_peg_gpr_m2v.py
imports: import pgl
  import paddle
  import paddle.nn
  import paddle.nn.functional
  from .gat_conv_peg import linear_init, GATConv
  import numpy
label_desc: Use image node_id 3 for calling the GNNModel obj's underlying member method code with example usage: obj.forward(graph_list, feature, m2v_feature, p2p_feature, label_y, label_idx, batch_nodes, pos) and returns: output