class_docstr: apply the kernel point convolution on a point cloud
  NB : it is the original version of KPConv, it is not the message passing version
  attributes:
  num_inputs : dimension of the input feature
  num_outputs : dimension of the output feature
  point_influence: influence distance of a single point (sigma * grid_size)
  n_kernel_points=15
  fixed="center"
  KP_influence="linear"
  aggregation_mode="sum"
  dimension=3
class_docstr_tok: ["apply","the","kernel","point","convolution","on","a","point","cloud","NB",":","it","is","the","original","version","of","KPConv",",","it","is","not","the","message","passing","version","attributes",":","num_inputs",":","dimension","of","the","input","feature","num_outputs",":","dimension","of","the","output","feature","point_influence",":","influence","distance","of","a","single","point","(","sigma","*","grid_size",")","n_kernel_points=15","fixed=","''","center","''","KP_influence=","''","linear","''","aggregation_mode=","''","sum","''","dimension=3"]
docstr: - query_points(torch Tensor): query of size N x 3
  - support_points(torch Tensor): support points of size N0 x 3
  - neighbors(torch Tensor): neighbors of size N x M
  - features : feature of size N0 x d (d is the number of inputs)
docstr_tok: ["-","query_points","(","torch","Tensor",")",":","query","of","size","N","x","3","-","support_points","(","torch","Tensor",")",":","support","points","of","size","N0","x","3","-","neighbors","(","torch","Tensor",")",":","neighbors","of","size","N","x","M","-","features",":","feature","of","size","N0","x","d","(","d","is","the","number","of","inputs",")"]
code: def forward(self, query_points, support_points, neighbors, x):
      """
      - query_points(torch Tensor): query of size N x 3
      - support_points(torch Tensor): support points of size N0 x 3
      - neighbors(torch Tensor): neighbors of size N x M
      - features : feature of size N0 x d (d is the number of inputs)
      """
      x = add_ones(support_points, x, self.add_one)
  
      new_feat = KPConv_ops(
          query_points,
          support_points,
          neighbors,
          x,
          self.K_points,
          self.weight,
          self.point_influence,
          self.KP_influence,
          self.aggregation_mode,
      )
      return new_feat
  
file_path: torch-points3d/torch_points3d/modules/KPConv/kernels.py
imports: import torch
  from torch.nn.parameter import Parameter
  from .kernel_utils import kernel_point_optimization_debug, load_kernels
  from .losses import fitting_loss, repulsion_loss, permissive_loss
  from .convolution_ops import *
  from torch_points3d.models.base_model import BaseInternalLossModule
label_desc: Use image node_id 2 for calling the KPConvLayer obj's underlying member method code with example usage: obj.forward(query_points, support_points, neighbors, x) and returns: new_feat