class_docstr: Feature aggregation
class_docstr_tok: ["Feature","aggregation"]
docstr: Feature aggregation and pooling for the non-sampling layer
docstr_tok: ["Feature","aggregation","and","pooling","for","the","non-sampling","layer"]
code: def group_all(self, pos, feat):
      """
      Feature aggregation and pooling for the non-sampling layer
      """
      if feat is not None:
          h = torch.cat([pos, feat], 2)
      else:
          h = pos
      B, N, D = h.shape
      _, _, C = pos.shape
      new_pos = torch.zeros(B, 1, C)
      h = h.permute(0, 2, 1).view(B, -1, N, 1)
      for conv, bn in zip(self.conv, self.bn):
          h = conv(h)
          h = bn(h)
          h = F.relu(h)
      h = torch.max(h[:, :, :, 0], 2)[0]  # [B,D]
      return new_pos, h
  
imports: import dgl
  import torch
  import torch.nn
  import torch.nn.functional
  from dgl.geometry import farthest_point_sampler
label_desc: Use image node_id 3 for calling the KNNConv obj's underlying member method code with example usage: obj.group_all(pos, feat) and returns: new_pos,  h