class_docstr: Radius search with support for multiscale for sparse graphs
  
  Arguments:
      radius {Union[float, List[float]]}
  
  Keyword Arguments:
      max_num_neighbors {Union[int, List[int]]}  (default: {64})
  
  Raises:
      ValueError: [description]
code: def find_neighbours(
      self, x, y, batch_x=None, batch_y=None, scale_idx=0
  ):
      if scale_idx >= self.num_scales:
          raise ValueError(
              "Scale %i is out of bounds %i"
              % (scale_idx, self.num_scales)
          )
  
      radius_idx = radius(
          x,
          y,
          self._radius[scale_idx],
          batch_x,
          batch_y,
          max_num_neighbors=self._max_num_neighbors[scale_idx],
      )
      return radius_idx
  
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 MultiscaleRadiusNeighbourFinder obj's underlying member method code with example usage: obj.find_neighbours(x, y, batch_x, batch_y, scale_idx) and returns: radius_idx