class_docstr: Adds remaining self-loops to the given homogeneous or heterogeneous
  graph (functional name: :obj:`add_remaining_self_loops`).
  
  Args:
      attr (str, optional): The name of the attribute of edge weights
          or multi-dimensional edge features to pass to
          :meth:`torch_geometric.utils.add_remaining_self_loops`.
          (default: :obj:`"edge_weight"`)
      fill_value (float or Tensor or str, optional): The way to generate
          edge features of self-loops (in case :obj:`attr != None`).
          If given as :obj:`float` or :class:`torch.Tensor`, edge features of
          self-loops will be directly given by :obj:`fill_value`.
          If given as :obj:`str`, edge features of self-loops are computed by
          aggregating all features of edges that point to the specific node,
          according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`,
          :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`1.`)
code: def forward(
      self,
      data: Union[Data, HeteroData],
  ) -> Union[Data, HeteroData]:
      for store in data.edge_stores:
          if store.is_bipartite() or "edge_index" not in store:
              continue
  
          store.edge_index, store[self.attr] = add_remaining_self_loops(
              store.edge_index,
              edge_attr=store.get(self.attr, None),
              fill_value=self.fill_value,
              num_nodes=store.size(0),
          )
  
      return data
  
file_path: pytorch_geometric/torch_geometric/transforms/add_remaining_self_loops.py
imports: from typing import Union
  from torch import Tensor
  from torch_geometric.data import Data, HeteroData
  from torch_geometric.data.datapipes import functional_transform
  from torch_geometric.transforms import BaseTransform
  from torch_geometric.utils import add_remaining_self_loops
label_desc: Use image node_id 2 for calling the AddRemainingSelfLoops obj's underlying member method code with example usage: obj.forward(data) and returns: data