code: def __init__(
      self,
      ratio=None,
      radius=None,
      radius_num_point=None,
      down_conv_nn=None,
      *args,
      **kwargs,
  ):
      super(SAModule, self).__init__(
          FPSSampler(ratio=ratio),
          MultiscaleRadiusNeighbourFinder(
              radius, max_num_neighbors=radius_num_point
          ),
          *args,
          **kwargs,
      )
  
      local_nn = MLP(down_conv_nn) if down_conv_nn is not None else None
  
      self._conv = PointConv(local_nn=local_nn, global_nn=None)
      self._radius = radius
      self._ratio = ratio
      self._num_points = radius_num_point
  
file_path: torch-points3d/torch_points3d/modules/pointnet2/message_passing.py
imports: from torch_geometric.nn import PointConv
  from torch_points3d.core.base_conv.base_conv import *
  from torch_points3d.core.base_conv.message_passing import *
  from torch_points3d.core.common_modules.base_modules import *
  from torch_points3d.core.spatial_ops import FPSSampler, RandomSampler, MultiscaleRadiusNeighbourFinder
label_desc: Use image node_id 1 to create a new SAModule object from inherited base classes: BaseMSConvolutionDown with example: obj = SAModule(ratio, radius, radius_num_point, down_conv_nn)