code: def _prepare_data(self, data):
      coords = torch.round((data.pos) / self._grid_size).long()
      cluster = voxel_grid(coords, data.batch, 1)
      cluster, unique_pos_indices = consecutive_cluster(cluster)
  
      coords = coords[unique_pos_indices]
      new_batch = data.batch[unique_pos_indices]
      new_pos = data.pos[unique_pos_indices]
      x = self._aggregate(data.x, cluster, unique_pos_indices)
      sparse_data = Batch(
          x=x, pos=new_pos, coords=coords, batch=new_batch
      )
      return sparse_data, cluster
  
imports: import torch
  import torch.nn
  from torch.nn import LeakyReLU, Linear, Sequential
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn import voxel_grid
  from torch_geometric.data import Batch
  from torch_scatter import scatter_max, scatter_mean
  from torch_points3d.applications.sparseconv3d import SparseConv3d
  from torch_points3d.core.common_modules import FastBatchNorm1d, Seq
  from torch_points3d.core.common_modules import MLP
  from torch_points3d.models.registration.base import FragmentBaseModel
label_desc: Use image node_id 4 for calling the UnetMSparseConv3d obj's underlying member method code with example usage: obj._prepare_data(data) and returns: sparse_data,  cluster