class_docstr: Diffusion on the given graph or batched graphs, used in 
  `MVGRL <https://arxiv.org/pdf/2006.05582v1.pdf>`_. Class objects callable via 
  method :meth:`views_fn`.
  
  Args:
      mode (string, optional): Diffusion instantiation mode with two options:
          :obj:`"ppr"`: Personalized PageRank; :obj:`"heat"`: heat kernel.
          (default: :obj:`"ppr"`)
      alpha (float, optinal): Teleport probability in a random walk. (default: :obj:`0.2`)
      t (float, optinal): Diffusion time. (default: :obj:`5`)
      add_self_loop (bool, optional): Set True to add self-loop to edge_index.
          (default: :obj:`True`)
code: def do_trans(self, data):
      node_num, _ = data.x.size()
      if self.add_self_loop:
          sl = torch.tensor(
              [[n, n] for n in range(node_num)], device=data.x.device
          ).t()
          edge_index = torch.cat((data.edge_index, sl), dim=1)
      else:
          edge_index = data.edge_index.detach().clone()
  
      orig_adj = to_dense_adj(edge_index)[0]
      orig_adj = torch.where(
          orig_adj > 1, torch.ones_like(orig_adj), orig_adj
      )
      d = torch.diag(torch.sum(orig_adj, 1))
  
      if self.mode == "ppr":
          dinv = torch.inverse(torch.sqrt(d))
          at = torch.matmul(torch.matmul(dinv, orig_adj), dinv)
          diff_adj = self.alpha * torch.inverse(
              (torch.eye(orig_adj.shape[0]) - (1 - self.alpha) * at)
          )
  
      elif self.mode == "heat":
          diff_adj = torch.exp(
              self.t * (torch.matmul(orig_adj, torch.inverse(d)) - 1)
          )
  
      else:
          raise Exception(
              "Must choose one diffusion instantiation mode from 'ppr' and 'heat'!"
          )
  
      edge_ind, edge_attr = dense_to_sparse(diff_adj)
  
      return Data(x=data.x, edge_index=edge_ind, edge_attr=edge_attr)
  
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 Diffusion obj's underlying member method code with example usage: obj.do_trans(data) and returns: Data