code: def set_input(self, data, device):
      data = data.to(device)
      self.input = data
      if data.x is not None:
          self.input_features = torch.cat([data.pos, data.x], axis=-1)
      else:
          self.input_features = data.pos
      if data.y is not None:
          self.labels = data.y
      else:
          self.labels = None
      if not hasattr(data, "batch"):
          self.batch_idx = torch.zeros(self.labels.shape[0]).long()
      else:
          self.batch_idx = data.batch
      self.pointnet_seg.set_scatter_pooling(not self._is_dense)
  
imports: import torch.nn.functional
  import logging
  from omegaconf import OmegaConf
  from torch_points3d.core.base_conv.base_conv import *
  from torch_points3d.core.common_modules.base_modules import *
  from torch_points3d.utils.config import ConvolutionFormatFactory
  from torch_points3d.modules.PointNet import *
  from torch_points3d.models.base_model import BaseModel
  from torch_points3d.utils.model_building_utils.resolver_utils import flatten_dict
  from torch_points3d.datasets.segmentation import IGNORE_LABEL
label_desc: Use image node_id 2 for calling the PointNet obj's underlying member method code with example usage: obj.set_input(data, device) without return types