code: def forward(self, data, **kwargs):
      batch_obj = Batch()
      x, pos, batch = data.x, data.pos, data.batch
      idx = self.sampler(pos, batch)
      row, col = self.neighbour_finder(
          pos, pos[idx], batch_x=batch, batch_y=batch[idx]
      )
      edge_index = torch.stack([col, row], dim=0)
      batch_obj.idx = idx
      batch_obj.edge_index = edge_index
  
      batch_obj.x = self.conv(x, (pos[idx], pos), edge_index, batch)
  
      batch_obj.pos = pos[idx]
      batch_obj.batch = batch[idx]
      copy_from_to(data, batch_obj)
      return batch_obj
  
imports: from abc import abstractmethod
  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.base_conv.base_conv import *
  from torch_points3d.core.common_modules import *
  from torch_points3d.core.spatial_ops import *
label_desc: Use image node_id 3 for calling the BaseConvolutionDown obj's underlying member method code with example usage: obj.forward(data) and returns: batch_obj