class_docstr: If num_to_sample is provided, sample exactly
  num_to_sample points. Otherwise sample floor(pos[0] * ratio) points
class_docstr_tok: ["If","num_to_sample","is","provided",",","sample","exactly","num_to_sample","points",".","Otherwise","sample","floor","(","pos","[","0","]","*","ratio",")","points"]
docstr: Sample pos
  
  Arguments:
      pos -- [B, N, 3]
  
  Returns:
      indexes -- [B, num_sample]
docstr_tok: ["Sample","pos","Arguments",":","pos","--","[","B",",","N",",","3","]","Returns",":","indexes","--","[","B",",","num_sample","]"]
code: def sample(self, pos, **kwargs):
      """Sample pos
  
      Arguments:
          pos -- [B, N, 3]
  
      Returns:
          indexes -- [B, num_sample]
      """
      if len(pos.shape) != 3:
          raise ValueError(
              " This class is for dense data and expects the pos tensor to be of dimension 2"
          )
      return tp.furthest_point_sample(
          pos, self._get_num_to_sample(pos.shape[1])
      )
  
imports: from abc import ABC, abstractmethod
  import math
  import torch
  from torch_geometric.nn import voxel_grid
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn.pool.pool import pool_pos, pool_batch
  import torch_points_kernels
  from torch_points3d.utils.config import is_list
  from torch_points3d.utils.enums import ConvolutionFormat
label_desc: Use image node_id 1 for calling the DenseFPSSampler obj's underlying member method code with example usage: obj.sample(pos) and returns: tp