class_docstr: simple layer with KPConv convolution -> activation -> BN
  we can perform a stride version (just change the query and the neighbors)
class_docstr_tok: ["simple","layer","with","KPConv","convolution","-",">","activation","-",">","BN","we","can","perform","a","stride","version","(","just","change","the","query","and","the","neighbors",")"]
code: def __init__(
      self,
      down_conv_nn=None,
      grid_size=None,
      prev_grid_size=None,
      sigma=1.0,
      max_num_neighbors=16,
      activation=torch.nn.LeakyReLU(negative_slope=0.1),
      bn_momentum=0.02,
      bn=FastBatchNorm1d,
      deformable=False,
      add_one=False,
      **kwargs,
  ):
      super(SimpleBlock, self).__init__()
      assert len(down_conv_nn) == 2
      num_inputs, num_outputs = down_conv_nn
      if deformable:
          density_parameter = self.DEFORMABLE_DENSITY
          self.kp_conv = KPConvDeformableLayer(
              num_inputs,
              num_outputs,
              point_influence=prev_grid_size * sigma,
              add_one=add_one,
              **kwargs,
          )
      else:
          density_parameter = self.RIGID_DENSITY
          self.kp_conv = KPConvLayer(
              num_inputs,
              num_outputs,
              point_influence=prev_grid_size * sigma,
              add_one=add_one,
              **kwargs,
          )
      search_radius = density_parameter * sigma * prev_grid_size
      self.neighbour_finder = RadiusNeighbourFinder(
          search_radius, max_num_neighbors, conv_type=self.CONV_TYPE
      )
  
      if bn:
          self.bn = bn(num_outputs, momentum=bn_momentum)
      else:
          self.bn = None
      self.activation = activation
  
      is_strided = prev_grid_size != grid_size
      if is_strided:
          self.sampler = GridSampling3D(grid_size)
      else:
          self.sampler = None
  
imports: import torch
  import sys
  from torch.nn import Linear
  from .kernels import KPConvLayer, KPConvDeformableLayer
  from torch_points3d.core.common_modules.base_modules import BaseModule, FastBatchNorm1d
  from torch_points3d.core.spatial_ops import RadiusNeighbourFinder
  from torch_points3d.core.data_transform import GridSampling3D
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.core.base_conv.message_passing import GlobalBaseModule
  from torch_points3d.core.common_modules.base_modules import Identity
  from torch_points3d.utils.config import is_list
label_desc: Use image node_id 1 to create a new SimpleBlock object from inherited base classes: BaseModule with example: obj = SimpleBlock(down_conv_nn, grid_size, prev_grid_size, sigma, max_num_neighbors, activation, bn_momentum, bn, deformable, add_one)