class_docstr: PointNet2 with multi-scale grouping
  metric learning siamese network that uses feature propogation layers
code: def set_input(self, data, device):
      # Size : B x N x 3
      # manually concatenate the b
  
      if getattr(data, "pos_target", None) is not None:
          assert (
              len(data.pos.shape) == 3
              and len(data.pos_target.shape) == 3
          )
          if data.x is not None:
              x = torch.cat([data.x, data.x_target], 0)
          else:
              x = None
          pos = torch.cat([data.pos, data.pos_target], 0)
          rang = torch.arange(0, data.pos.shape[0])
  
          labels = torch.cat([rang, rang], 0)
      else:
          x = data.x
          pos = data.pos
          labels = None
  
      if x is not None:
          x = x.transpose(1, 2).contiguous()
  
      self.input = Data(x=x, pos=pos, y=labels).to(device)
  
imports: import torch
  import torch.nn.functional
  from torch.nn import Linear
  from torch.nn import Sequential
  from torch_geometric.data import Data
  import logging
  from torch_points3d.core.losses import *
  from torch_points3d.modules.pointnet2 import *
  from torch_points3d.core.common_modules import MLP
  from torch_points3d.models.base_architectures import BackboneBasedModel
  from torch_points3d.models.base_architectures import UnetBasedModel
  from torch_points3d.core.common_modules.dense_modules import Conv1D
  from torch_points3d.core.common_modules.base_modules import Seq
  from torch_points3d.models.registration.base import FragmentBaseModel
label_desc: Use image node_id 3 for calling the PatchPointNet2_D obj's underlying member method code with example usage: obj.set_input(data, device) without return types