class_docstr: Multiscale convolution down (also supports single scale). Convolution kernel is shared accross the scales
  
  Arguments:
      sampler  -- Strategy for sampling the input clouds
      neighbour_finder -- Multiscale strategy for finding neighbours
class_docstr_tok: ["Multiscale","convolution","down","(","also","supports","single","scale",")",".","Convolution","kernel","is","shared","accross","the","scales","Arguments",":","sampler","--","Strategy","for","sampling","the","input","clouds","neighbour_finder","--","Multiscale","strategy","for","finding","neighbours"]
code: def __init__(
      self,
      sampler,
      neighbour_finder: BaseMSNeighbourFinder,
      *args,
      **kwargs,
  ):
      super(BaseMSConvolutionDown, self).__init__(
          sampler, neighbour_finder, *args, **kwargs
      )
  
      self._index = kwargs.get("index", None)
  
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 1 to create a new BaseMSConvolutionDown object from inherited base classes: BaseConvolution with example: obj = BaseMSConvolutionDown(sampler, neighbour_finder)