code: def __call__(self, data):
      for curr_ax in self._horz_axes:
          if random.random() < self._p:
              coords = data.coords
              coord_max = torch.max(coords[:, curr_ax])
              data.coords[:, curr_ax] = coord_max - coords[:, curr_ax]
      return data
  
imports: from typing import List
  import itertools
  import numpy
  import math
  import re
  import torch
  import scipy
  import random
  from tqdm.auto import tqdm
  from torch.nn import functional
  from functools import partial
  from torch_geometric.nn import fps, radius, knn, voxel_grid
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn.pool.pool import pool_pos, pool_batch
  from torch_scatter import scatter_add, scatter_mean
  from torch_cluster import grid_cluster
  from torch_points3d.datasets.multiscale_data import MultiScaleData
  from torch_points3d.utils.config import is_list
  from torch_points3d.utils import is_iterable
  from .grid_transform import group_data, GridSampling3D, shuffle_data
label_desc: Use image node_id 2 for calling the RandomCoordsFlip obj's underlying member method code with example usage: obj.__call__(data) and returns: data