code: def __init__(
      self,
      npoint=None,
      radii=None,
      nsample=None,
      down_conv_nn=None,
      bn=True,
      activation=torch.nn.LeakyReLU(negative_slope=0.01),
      use_xyz=True,
      normalize_xyz=False,
      **kwargs,
  ):
      assert len(radii) == len(nsample) == len(down_conv_nn)
      super(PointNetMSGDown, self).__init__(
          DenseFPSSampler(num_to_sample=npoint),
          DenseRadiusNeighbourFinder(radii, nsample),
          **kwargs,
      )
      self.use_xyz = use_xyz
      self.npoint = npoint
      self.mlps = nn.ModuleList()
      for i in range(len(radii)):
          self.mlps.append(
              MLP2D(
                  down_conv_nn[i],
                  bn=bn,
                  activation=activation,
                  bias=False,
              )
          )
      self.radii = radii
      self.normalize_xyz = normalize_xyz
  
file_path: torch-points3d/torch_points3d/modules/pointnet2/dense.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  import torch_points_kernels
  from torch_points3d.core.base_conv.dense import *
  from torch_points3d.core.spatial_ops import DenseRadiusNeighbourFinder, DenseFPSSampler
  from torch_points3d.utils.model_building_utils.activation_resolver import get_activation
label_desc: Use image node_id 1 to create a new PointNetMSGDown object from inherited base classes: BaseDenseConvolutionDown with example: obj = PointNetMSGDown(npoint, radii, nsample, down_conv_nn, bn, activation, use_xyz, normalize_xyz)