code: def find_neighbours(self, x, y, batch_x, batch_y):
      # find the self.k * self.dilation closest neighbours in x for each y
      row, col = self.initialFinder.find_neighbours(
          x, y, batch_x, batch_y
      )
  
      # for each point in y, randomly select k of its neighbours
      index = torch.randint(
          self.k * self.dilation,
          (len(y), self.k),
          device=row.device,
          dtype=torch.long,
      )
  
      arange = torch.arange(len(y), dtype=torch.long, device=row.device)
      arange = arange * (self.k * self.dilation)
      index = (index + arange.view(-1, 1)).view(-1)
      row, col = row[index], col[index]
  
      return row, col
  
imports: from abc import ABC, abstractmethod
  from typing import List, Union, cast
  import torch
  from torch_geometric.nn import knn, radius
  import torch_points_kernels
  from torch_points3d.utils.config import is_list
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.utils.debugging_vars import DEBUGGING_VARS, DistributionNeighbour
label_desc: Use image node_id 2 for calling the DilatedKNNNeighbourFinder obj's underlying member method code with example usage: obj.find_neighbours(x, y, batch_x, batch_y) and returns: row,  col