class_docstr: Adds self-loops to the given homogeneous or heterogeneous graph
  (functional name: :obj:`add_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_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 __init__(
      self,
      attr: str = "edge_weight",
      fill_value: Union[float, Tensor, str] = 1.0,
  ) -> None:
      self.attr = attr
      self.fill_value = fill_value
  
file_path: pytorch_geometric/torch_geometric/transforms/add_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_self_loops
label_desc: Use image node_id 1 to create a new AddSelfLoops object from inherited base classes: BaseTransform with example: obj = AddSelfLoops(attr, fill_value)