docstr: Args:
      pos: (B,N,3)
      features: (B,C,N)
      seed_pos (B,N,3)
  Returns:
      VoteNetResults
docstr_tok: ["Args",":","pos",":","(","B",",","N,3",")","features",":","(","B",",","C",",","N",")","seed_pos","(","B",",","N,3",")","Returns",":","VoteNetResults"]
code: def forward(self, data):
      """
      Args:
          pos: (B,N,3)
          features: (B,C,N)
          seed_pos (B,N,3)
      Returns:
          VoteNetResults
      """
      if data.pos.dim() != 3:
          raise ValueError(
              "This method only supports dense convolutions for now"
          )
  
      if self.sampling == "seed_fps":
          sample_idx = tp.furthest_point_sample(
              data.seed_pos, self.num_proposal
          )
      else:
          raise ValueError(
              "Unknown sampling strategy: %s. Exiting!"
              % (self.sampling)
          )
  
      data_features = self.vote_aggregation(
          data, sampled_idx=sample_idx
      )
  
      # --------- PROPOSAL GENERATION ---------
      x = F.relu(self.bn1(self.conv1(data_features.x)))
      x = F.relu(self.bn2(self.conv2(x)))
      x = self.conv3(
          x
      )  # (batch_size, 2+3+num_heading_bin*2+num_size_cluster*4, num_proposal)
  
      return VoteNetResults.from_logits(
          data.seed_inds,
          data.pos,
          data.seed_pos,
          data_features.pos,
          x,
          self.num_class,
          self.num_heading_bin,
          self.mean_size_arr,
      )
  
file_path: torch-points3d/torch_points3d/modules/VoteNet/proposal_module.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  from omegaconf import OmegaConf
  from torch_points3d.modules.pointnet2 import PointNetMSGDown
  import torch_points_kernels
  from .votenet_results import VoteNetResults
label_desc: Use image node_id 2 for calling the ProposalModule obj's underlying member method code with example usage: obj.forward(data) and returns: VoteNetResults