code: def uniform_edge_per(self, data):
      edge_index = data.edge_index
      row, col = edge_index
      # if self.undirected:
      #     row, col, _ = filter_adj(row, col, None, row < col)
  
      num_nodes = maybe_num_nodes(edge_index, num_nodes=data.x.shape[0])
      adj_dense = torch.zeros([num_nodes, num_nodes])
      adj_dense[row, col] = 1
      per_mask = adj_dense.new_full(
          adj_dense.shape, self.magnitude, dtype=torch.float
      )
      per_mask = torch.bernoulli(per_mask)
      # per_mask[adj_dense == 0] = 0
  
      # print(torch.nonzero(per_mask))
      new_adj_dense = per_mask - adj_dense
  
      new_row, new_col = torch.nonzero(new_adj_dense).t()
      if self.undirected:
          new_row, new_col, _ = filter_adj(
              new_row, new_col, None, new_row < new_col
          )
          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=num_nodes
      )
  
      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 3 for calling the EdgePer obj's underlying member method code with example usage: obj.uniform_edge_per(data) and returns: new_data,  None