class_docstr: A generic wrapper for computing graph convolution on directed
  graphs as described in the `"Edge Directionality Improves Learning on
  Heterophilic Graphs" <https://arxiv.org/abs/2305.10498>`_ paper.
  :class:`DirGNNConv` will pass messages both from source nodes to target
  nodes and from target nodes to source nodes.
  
  Args:
      conv (MessagePassing): The underlying
          :class:`~torch_geometric.nn.conv.MessagePassing` layer to use.
      alpha (float, optional): The alpha coefficient used to weight the
          aggregations of in- and out-edges as part of a convex combination.
          (default: :obj:`0.5`)
      root_weight (bool, optional): If set to :obj:`True`, the layer will add
          transformed root node features to the output.
          (default: :obj:`True`)
code: def __init__(
      self,
      conv: MessagePassing,
      alpha: float = 0.5,
      root_weight: bool = True,
  ):
      super().__init__()
  
      self.alpha = alpha
      self.root_weight = root_weight
  
      self.conv_in = copy.deepcopy(conv)
      self.conv_out = copy.deepcopy(conv)
  
      if hasattr(conv, "add_self_loops"):
          self.conv_in.add_self_loops = False
          self.conv_out.add_self_loops = False
      if hasattr(conv, "root_weight"):
          self.conv_in.root_weight = False
          self.conv_out.root_weight = False
  
      if root_weight:
          self.lin = torch.nn.Linear(
              conv.in_channels, conv.out_channels
          )
      else:
          self.lin = None
  
      self.reset_parameters()
  
file_path: pytorch_geometric/torch_geometric/nn/conv/dir_gnn_conv.py
imports: import copy
  import torch
  from torch import Tensor
  from torch_geometric.nn.conv import MessagePassing
label_desc: Use image node_id 1 to create a new DirGNNConv object from inherited base classes: torch.nn with example: obj = DirGNNConv(conv, alpha, root_weight)