class_docstr: The relational graph convolutional operator from the `"Modeling
  Relational Data with Graph Convolutional Networks"
  <https://arxiv.org/abs/1703.06103>`_ paper.
  
  .. math::
      \mathbf{x}^{\prime}_i = \mathbf{\Theta}_{\textrm{root}} \cdot
      \mathbf{x}_i + \sum_{r \in \mathcal{R}} \sum_{j \in \mathcal{N}_r(i)}
      \frac{1}{|\mathcal{N}_r(i)|} \mathbf{\Theta}_r \cdot \mathbf{x}_j,
  
  where :math:`\mathcal{R}` denotes the set of relations, *i.e.* edge types.
  Edge type needs to be a one-dimensional :obj:`torch.long` tensor which
  stores a relation identifier
  :math:`\in \{ 0, \ldots, |\mathcal{R}| - 1\}` for each edge.
  
  Args:
      in_channels (int): Size of each input sample.
      out_channels (int): Size of each output sample.
      num_relations (int): Number of relations.
      num_bases (int, optional): If set, this layer will use the
          basis-decomposition regularization scheme where :obj:`num_bases`
          denotes the number of bases to use. (default: :obj:`None`)
      aggr (str, optional): The aggregation scheme to use
          (:obj:`"add"`, :obj:`"mean"`, :obj:`"sum"`).
          (default: :obj:`"mean"`)
      root_weight (bool, optional): If set to :obj:`False`, the layer will
          not add transformed root node features to the output.
          (default: :obj:`True`)
      bias (bool, optional): If set to :obj:`False`, the layer will not learn
          an additive bias. (default: :obj:`True`)
code: def forward(
      self,
      x: torch.Tensor,
      csc: Tuple[torch.Tensor, torch.Tensor, int],
      edge_type: torch.Tensor,
      max_num_neighbors: Optional[int] = None,
  ) -> torch.Tensor:
      graph = self.get_typed_cugraph(
          csc,
          edge_type,
          self.num_relations,
          max_num_neighbors=max_num_neighbors,
      )
  
      out = agg_hg_basis_n2n_post(
          x,
          self.comp,
          graph,
          concat_own=self.root_weight,
          norm_by_out_degree=bool(self.aggr == "mean"),
      )
  
      out = out @ self.weight.view(-1, self.out_channels)
  
      if self.bias is not None:
          out = out + self.bias
  
      return out
  
file_path: cugraph/python/cugraph-pyg/cugraph_pyg/nn/conv/rgcn_conv.py
imports: from typing import Optional, Tuple
  from cugraph.utilities.utils import import_optional
  from pylibcugraphops.pytorch.operators import agg_hg_basis_n2n_post
  from .base import BaseConv
label_desc: Use image node_id 3 for calling the RGCNConv obj's underlying member method code with example usage: obj.forward(x, csc, edge_type, max_num_neighbors) and returns: out