class_docstr: Edge perturbation on the given graph or batched graphs. Class objects callable via 
  method :meth:`views_fn`.
  
  Args:
      add (bool, optional): Set :obj:`True` if randomly add edges in a given graph.
          (default: :obj:`True`)
      drop (bool, optional): Set :obj:`True` if randomly drop edges in a given graph.
          (default: :obj:`False`)
      ratio (float, optional): Percentage of edges to add or drop. (default: :obj:`0.1`)
code: def do_trans(self, data):
      node_num, _ = data.x.size()
      device = data.x.device
      _, edge_num = data.edge_index.size()
      perturb_num = int(edge_num * self.ratio)
      idx_add = torch.tensor([], device=device).reshape(2, -1).long()
  
      if self.drop:
          idx_remain = dropout_adj(data.edge_index, p=self.ratio)[0]
  
      if self.add:
          idx_add = torch.randint(
              node_num, (2, perturb_num), device=device
          )
  
      new_edge_index = torch.cat((idx_remain, idx_add), dim=1)
      new_edge_index = torch.unique(new_edge_index, dim=1)
  
      return Data(x=data.x, edge_index=new_edge_index)
  
imports: import torch
  from torch_geometric.utils import to_dense_adj, dense_to_sparse, dropout_adj, degree, add_remaining_self_loops
  from sklearn.preprocessing import MinMaxScaler
  from torch_geometric.data import Batch, Data
  from dig.sslgraph.utils.adaptive import degree_drop_weights, pr_drop_weights, evc_drop_weights, drop_edge_weighted
label_desc: Use image node_id 3 for calling the EdgePerturbation obj's underlying member method code with example usage: obj.do_trans(data) and returns: Data