code: def forward(self, data, **kwargs):
      batch_obj = Batch()
      x, pos, batch = data.x, data.pos, data.batch
      idx_sampler = self.sampler(pos=pos, x=x, batch=batch)
  
      idx_neighbour = self.neighbour_finder(
          pos, pos, batch_x=batch, batch_y=batch
      )
  
      shadow_x = torch.full(
          (1,) + x.shape[1:], self.shadow_features_fill
      ).to(x.device)
      shadow_points = torch.full(
          (1,) + pos.shape[1:], self.shadow_points_fill_
      ).to(x.device)
  
      x = torch.cat([x, shadow_x], dim=0)
      pos = torch.cat([pos, shadow_points], dim=0)
  
      x_neighbour = x[idx_neighbour]
      pos_centered_neighbour = pos[idx_neighbour] - pos[:-1].unsqueeze(
          1
      )  # Centered the points, no shadow point
  
      batch_obj.x = self.conv(
          x,
          pos,
          x_neighbour,
          pos_centered_neighbour,
          idx_neighbour,
          idx_sampler,
      )
  
      batch_obj.pos = pos[idx_sampler]
      batch_obj.batch = batch[idx_sampler]
      copy_from_to(data, batch_obj)
      return batch_obj
  
imports: from typing import *
  import torch
  from torch.nn import Linear, ReLU, LeakyReLU, BatchNorm1d, Dropout
  from torch_geometric.nn import knn_interpolate, fps, radius, global_max_pool, global_mean_pool, knn
  from torch_geometric.data import Batch
  from torch_points3d.core.spatial_ops import *
  from .base_conv import BaseConvolution
  from torch_points3d.core.common_modules.base_modules import BaseModule
  from torch_points3d.core.common_modules import MLP
label_desc: Use image node_id 3 for calling the BasePartialDenseConvolutionDown obj's underlying member method code with example usage: obj.forward(data) and returns: batch_obj