class_docstr: Apply elastic distortion on sparse coordinate space. First projects the position onto a 
  voxel grid and then apply the distortion to the voxel grid.
  
  Parameters
  ----------
  granularity: List[float]
      Granularity of the noise in meters
  magnitude:List[float]
      Noise multiplier in meters
  Returns
  -------
  data: Data
      Returns the same data object with distorted grid
class_docstr_tok: ["Apply","elastic","distortion","on","sparse","coordinate","space",".","First","projects","the","position","onto","a","voxel","grid","and","then","apply","the","distortion","to","the","voxel","grid",".","Parameters","--","--","--","--","--","granularity",":","List","[","float","]","Granularity","of","the","noise","in","meters","magnitude",":","List","[","float","]","Noise","multiplier","in","meters","Returns","--","--","--","-","data",":","Data","Returns","the","same","data","object","with","distorted","grid"]
code: def __repr__(self):
      return "{}(apply_distorsion={}, granularity={}, magnitude={})".format(
          self.__class__.__name__,
          self._apply_distorsion,
          self._granularity,
          self._magnitude,
      )
  
imports: from typing import *
  import numpy
  import numpy
  import random
  import scipy
  import re
  import torch
  import logging
  import torch.nn.functional
  from torch_scatter import scatter_mean, scatter_add
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn import voxel_grid
  from torch_geometric.data import Data
  from torch_cluster import grid_cluster
label_desc: Use image node_id 4 for calling the ElasticDistortion obj's underlying member method code with example usage: obj.__repr__() and returns: str