class_docstr: simple layer with PosPool
  we can perform a stride version (just change the query and the neighbors)
class_docstr_tok: ["simple","layer","with","PosPool","we","can","perform","a","stride","version","(","just","change","the","query","and","the","neighbors",")"]
code: def forward(self, data, precomputed=None, **kwargs):
      if not hasattr(data, "block_idx"):
          setattr(data, "block_idx", 0)
  
      if precomputed:
          query_data = precomputed[data.block_idx]
      else:
          if self.sampler:
              query_data = self.sampler(data.clone())
          else:
              query_data = data.clone()
  
      if precomputed:
          idx_neighboors = query_data.idx_neighboors
          q_pos = query_data.pos
      else:
          q_pos, q_batch = query_data.pos, query_data.batch
          idx_neighboors = self.neighbour_finder(
              data.pos, q_pos, batch_x=data.batch, batch_y=q_batch
          )
          query_data.idx_neighboors = idx_neighboors
  
      x = self.pospool(q_pos, data.pos, idx_neighboors, data.x)
  
      query_data.x = x
      query_data.block_idx = data.block_idx + 1
      return query_data
  
imports: import torch
  import sys
  from torch.nn import Linear
  from .ops import PosPoolLayer
  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.utils.config import is_list
label_desc: Use image node_id 2 for calling the SimpleBlock obj's underlying member method code with example usage: obj.forward(data, precomputed) and returns: query_data