code: def uniform_edge_drop(self, data):
      edge_index = data.edge_index.detach().clone()
      row, col = edge_index
      if self.undirected:
          row, col, _ = filter_adj(row, col, None, row < col)
  
      idxs = random.sample(
          range(len(row)), int((1.0 - self.magnitude) * len(row))
      )
      new_row, new_col = row[idxs], col[idxs]
  
      if self.undirected:
          new_edge_index = torch.stack(
              [
                  torch.cat([new_row, new_col], dim=0),
                  torch.cat([new_col, new_row], dim=0),
              ],
              dim=0,
          )
      else:
          new_edge_index = torch.cat([new_row, new_col], dim=0)
      new_edge_index = coalesce(
          new_edge_index, None, num_nodes=data.x.shape[0]
      )
  
      new_data = Data(
          x=data.x,
          edge_index=new_edge_index.to(edge_index.device),
          y=data.y,
      )
      return new_data, None
  
file_path: DIG/dig/auggraph/method/GraphAug/aug/edge_per.py
imports: import torch
  import random
  import torch.nn.functional
  from torch.distributions.bernoulli import Bernoulli
  from torch_geometric.data import Data
  from torch_geometric.utils.dropout import filter_adj
  from torch_geometric.utils.num_nodes import maybe_num_nodes
  from .aug_utils import coalesce
label_desc: Use image node_id 4 for calling the EdgePer obj's underlying member method code with example usage: obj.uniform_edge_drop(data) and returns: new_data,  None