code: def forward(self, x, cat_vec=None):
      if x.shape[-1] > 3:
          l0_pos = x[:, :, :3]
          l0_feat = x
      else:
          l0_pos = x
          l0_feat = x
      # Set Abstraction layers
      l1_pos, l1_feat = self.sa_msg_module1(l0_pos, l0_feat)
      l2_pos, l2_feat = self.sa_msg_module2(l1_pos, l1_feat)
      l3_pos, l3_feat = self.sa_module3(l2_pos, l2_feat)
      # Feature Propagation layers
      l2_feat = self.fp3(l2_pos, l3_pos, l2_feat, l3_feat.unsqueeze(1))
      l1_feat = self.fp2(
          l1_pos, l2_pos, l1_feat, l2_feat.permute(0, 2, 1)
      )
      l0_feat = torch.cat(
          [cat_vec.permute(0, 2, 1), l0_pos, l0_feat], 2
      )
      l0_feat = self.fp1(
          l0_pos, l1_pos, l0_feat, l1_feat.permute(0, 2, 1)
      )
      # FC layers
      feat = F.relu(self.bn1(self.conv1(l0_feat)))
      out = self.drop1(feat)
      out = self.conv2(out)
      return out
  
file_path: dgl/examples/pytorch/pointcloud/pointnet/pointnet2_partseg.py
imports: import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from pointnet2 import PointNet2FP, SAModule, SAMSGModule
  from torch.autograd import Variable
label_desc: Use image node_id 2 for calling the PointNet2MSGPartSeg obj's underlying member method code with example usage: obj.forward(x, cat_vec) and returns: out