class_docstr: The Set Abstraction Layer
class_docstr_tok: ["The","Set","Abstraction","Layer"]
code: def forward(self, pos, feat):
      if self.group_all:
          return self.conv.group_all(pos, feat)
  
      centroids = farthest_point_sampler(pos, self.npoints)
      g = self.frnn_graph(pos, centroids, feat)
      g.update_all(self.message, self.conv)
  
      mask = g.ndata["center"] == 1
      pos_dim = g.ndata["pos"].shape[-1]
      feat_dim = g.ndata["new_feat"].shape[-1]
      pos_res = g.ndata["pos"][mask].view(self.batch_size, -1, pos_dim)
      feat_res = g.ndata["new_feat"][mask].view(
          self.batch_size, -1, feat_dim
      )
      return pos_res, feat_res
  
imports: import dgl
  import dgl.function
  import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from dgl.geometry import farthest_point_sampler
  from torch.autograd import Variable
label_desc: Use image node_id 2 for calling the SAModule obj's underlying member method code with example usage: obj.forward(pos, feat) and returns: pos_res,  feat_res, self