class_docstr: See :class:`RGCNConv`.
class_docstr_tok: ["See",":","class",":","`","RGCNConv","`","."]
code: def forward(
      self,
      x: Union[OptTensor, Tuple[OptTensor, Tensor]],
      edge_index: Adj,
      edge_type: OptTensor = None,
  ):
      self.fuse = False
      assert self.aggr in ["add", "sum", "mean"]
  
      # Convert input features to a pair of node features or node indices.
      x_l: OptTensor = None
      if isinstance(x, tuple):
          x_l = x[0]
      else:
          x_l = x
      if x_l is None:
          x_l = torch.arange(
              self.in_channels_l, device=self.weight.device
          )
  
      x_r: Tensor = x_l
      if isinstance(x, tuple):
          x_r = x[1]
  
      size = (x_l.size(0), x_r.size(0))
  
      # propagate_type: (x: Tensor, edge_type: OptTensor)
      out = self.propagate(
          edge_index, x=x_l, edge_type=edge_type, size=size
      )
  
      root = self.root
      if root is not None:
          if not torch.is_floating_point(x_r):
              out = out + root[x_r]
          else:
              out = out + x_r @ root
  
      if self.bias is not None:
          out = out + self.bias
  
      return out
  
imports: from typing import Optional, Tuple, Union
  import torch
  from torch import Tensor
  from torch.nn import Parameter
  from torch.nn import Parameter
  import torch_geometric.backend
  import torch_geometric.typing
  from torch_geometric import is_compiling
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.inits import glorot, zeros
  from torch_geometric.typing import Adj, OptTensor, SparseTensor, pyg_lib, torch_sparse
  from torch_geometric.utils import index_sort, one_hot, scatter, spmm
  from torch_geometric.utils.sparse import index2ptr
label_desc: Use image node_id 1 for calling the FastRGCNConv obj's underlying member method code with example usage: obj.forward(x, edge_index, edge_type) and returns: out