class_docstr: Input shape: (B, C_in, npoint, nsample)
  Output shape: (B, C_out, npoint)
class_docstr_tok: ["Input","shape",":","(","B",",","C_in",",","npoint",",","nsample",")","Output","shape",":","(","B",",","C_out",",","npoint",")"]
docstr: aggr_features  -- [B, 3 + 3 + C, num_points, nsamples]
  centroids  -- [B, 3, num_points, 1]
code: def forward(self, aggr_features, centroids):
      """
      aggr_features  -- [B, 3 + 3 + C, num_points, nsamples]
      centroids  -- [B, 3, num_points, 1]
      """
      # Extract information to create message
      abs_coord = aggr_features[:, :3]  # absolute coordinates
      delta_x = aggr_features[:, 3:6]  # normalized coordinates
      features = aggr_features[:, 3:]
  
      nsample = abs_coord.shape[-1]
      coord_xi = centroids.repeat(
          1, 1, 1, nsample
      )  # (B, 3, npoint, nsample) centroid points
  
      distance = torch.norm(delta_x, p=2, dim=1).unsqueeze(
          1
      )  # Calculate distance
  
      # Create message by contenating distance, origin / target coords, delta coords
      h_xi_xj = torch.cat(
          (distance, coord_xi, abs_coord, delta_x), dim=1
      )
  
      return self._mapper(features, h_xi_xj)
  
imports: import logging
  import torch
  from torch.nn import Sequential
  import torch.nn
  import torch.nn.functional
  from torch.nn import Conv1d
  import torch_points_kernels
  from torch_points3d.core.base_conv.dense import *
  from torch_points3d.core.common_modules.dense_modules import MLP2D
  from torch_points3d.core.spatial_ops import DenseFPSSampler, DenseRadiusNeighbourFinder
  from torch_points3d.utils.colors import COLORS
label_desc: Use image node_id 2 for calling the SharedRSConv obj's underlying member method code with example usage: obj.forward(aggr_features, centroids) and returns: self