class_docstr: Relational graph convolution layer from `Modeling Relational Data with Graph
  Convolutional Networks <https://arxiv.org/abs/1703.06103>`__
  
  It can be described as below:
  
  .. math::
  
     h_i^{(l+1)} = \sigma(\sum_{r\in\mathcal{R}}
     \sum_{j\in\mathcal{N}^r(i)}\frac{1}{c_{i,r}}W_r^{(l)}h_j^{(l)}+W_0^{(l)}h_i^{(l)})
  
  where :math:`\mathcal{N}^r(i)` is the neighbor set of node :math:`i` w.r.t. relation
  :math:`r`. :math:`c_{i,r}` is the normalizer equal
  to :math:`|\mathcal{N}^r(i)|`. :math:`\sigma` is an activation function. :math:`W_0`
  is the self-loop weight.
  
  The basis regularization decomposes :math:`W_r` by:
  
  .. math::
  
     W_r^{(l)} = \sum_{b=1}^B a_{rb}^{(l)}V_b^{(l)}
  
  where :math:`B` is the number of bases, :math:`V_b^{(l)}` are linearly combined
  with coefficients :math:`a_{rb}^{(l)}`.
  
  The block-diagonal-decomposition regularization decomposes :math:`W_r` into :math:`B`
  number of block diagonal matrices. We refer :math:`B` as the number of bases.
  
  The block regularization decomposes :math:`W_r` by:
  
  .. math::
  
     W_r^{(l)} = \oplus_{b=1}^B Q_{rb}^{(l)}
  
  where :math:`B` is the number of bases, :math:`Q_{rb}^{(l)}` are block
  bases with shape :math:`R^{(d^{(l+1)}/B)*(d^{l}/B)}`.
  
  Parameters
  ----------
  in_feat : int
      Input feature size; i.e, the number of dimensions of :math:`h_j^{(l)}`.
  out_feat : int
      Output feature size; i.e., the number of dimensions of :math:`h_i^{(l+1)}`.
  num_rels : int
      Number of relations. .
  regularizer : str
      Which weight regularizer to use "basis" or "bdd".
      "basis" is short for basis-diagonal-decomposition.
      "bdd" is short for block-diagonal-decomposition.
  num_bases : int, optional
      Number of bases. If is none, use number of relations. Default: ``None``.
  bias : bool, optional
      True if bias is added. Default: ``True``.
  activation : callable, optional
      Activation function. Default: ``None``.
  self_loop : bool, optional
      True to include self loop message. Default: ``True``.
  low_mem : bool, optional
      True to use low memory implementation of relation message passing function. Default: False.
      This option trades speed with memory consumption, and will slowdown the forward/backward.
      Turn it on when you encounter OOM problem during training or evaluation. Default: ``False``.
  dropout : float, optional
      Dropout rate. Default: ``0.0``
  layer_norm: float, optional
      Add layer norm. Default: ``False``
  
  Examples
  --------
  >>> import dgl
  >>> import numpy as np
  >>> import mxnet as mx
  >>> from mxnet import gluon
  >>> from dgl.nn import RelGraphConv
  >>>
  >>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
  >>> feat = mx.nd.ones((6, 10))
  >>> conv = RelGraphConv(10, 2, 3, regularizer='basis', num_bases=2)
  >>> conv.initialize(ctx=mx.cpu(0))
  >>> etype = mx.nd.array(np.array([0,1,2,0,1,2]).astype(np.int64))
  >>> res = conv(g, feat, etype)
  [[ 0.561324    0.33745846]
  [ 0.61585337  0.09992217]
  [ 0.561324    0.33745846]
  [-0.01557937  0.01227859]
  [ 0.61585337  0.09992217]
  [ 0.056508   -0.00307822]]
  <NDArray 6x2 @cpu(0)>
class_docstr_tok: ["Relational","graph","convolution","layer","from","`","Modeling","Relational","Data","with","Graph","Convolutional","Networks","<","https",":","\/\/arxiv.org\/abs\/1703.06103",">","`","__","It","can","be","described","as","below",":","..","math",":",":","h_i^","{","(","l+1",")","}","=","\\sigma","(","\\sum_","{","r\\in\\mathcal","{","R","}","}","\\sum_","{","j\\in\\mathcal","{","N","}","^r","(","i",")","}","\\frac","{","1","}","{","c_","{","i",",","r","}","}","W_r^","{","(","l",")","}","h_j^","{","(","l",")","}","+W_0^","{","(","l",")","}","h_i^","{","(","l",")","}",")","where",":","math",":","`","\\mathcal","{","N","}","^r","(","i",")","`","is","the","neighbor","set","of","node",":","math",":","`","i","`","w.r.t",".","relation",":","math",":","`","r","`",".",":","math",":","`","c_","{","i",",","r","}","`","is","the","normalizer","equal","to",":","math",":","`","|\\mathcal","{","N","}","^r","(","i",")","|","`",".",":","math",":","`","\\sigma","`","is","an","activation","function",".",":","math",":","`","W_0","`","is","the","self-loop","weight",".","The","basis","regularization","decomposes",":","math",":","`","W_r","`","by",":","..","math",":",":","W_r^","{","(","l",")","}","=","\\sum_","{","b=1","}","^B","a_","{","rb","}","^","{","(","l",")","}","V_b^","{","(","l",")","}","where",":","math",":","`","B","`","is","the","number","of","bases",",",":","math",":","`","V_b^","{","(","l",")","}","`","are","linearly","combined","with","coefficients",":","math",":","`","a_","{","rb","}","^","{","(","l",")","}","`",".","The","block-diagonal-decomposition","regularization","decomposes",":","math",":","`","W_r","`","into",":","math",":","`","B","`","number","of","block","diagonal","matrices",".","We","refer",":","math",":","`","B","`","as","the","number","of","bases",".","The","block","regularization","decomposes",":","math",":","`","W_r","`","by",":","..","math",":",":","W_r^","{","(","l",")","}","=","\\oplus_","{","b=1","}","^B","Q_","{","rb","}","^","{","(","l",")","}","where",":","math",":","`","B","`","is","the","number","of","bases",",",":","math",":","`","Q_","{","rb","}","^","{","(","l",")","}","`","are","block","bases","with","shape",":","math",":","`","R^","{","(","d^","{","(","l+1",")","}","\/B",")","*","(","d^","{","l","}","\/B",")","}","`",".","Parameters","--","--","--","--","--","in_feat",":","int","Input","feature","size",";","i.e",",","the","number","of","dimensions","of",":","math",":","`","h_j^","{","(","l",")","}","`",".","out_feat",":","int","Output","feature","size",";","i.e.",",","the","number","of","dimensions","of",":","math",":","`","h_i^","{","(","l+1",")","}","`",".","num_rels",":","int","Number","of","relations",".",".","regularizer",":","str","Which","weight","regularizer","to","use","``","basis","''","or","``","bdd","''",".","``","basis","''","is","short","for","basis-diagonal-decomposition",".","``","bdd","''","is","short","for","block-diagonal-decomposition",".","num_bases",":","int",",","optional","Number","of","bases",".","If","is","none",",","use","number","of","relations",".","Default",":","``","None","``",".","bias",":","bool",",","optional","True","if","bias","is","added",".","Default",":","``","True","``",".","activation",":","callable",",","optional","Activation","function",".","Default",":","``","None","``",".","self_loop",":","bool",",","optional","True","to","include","self","loop","message",".","Default",":","``","True","``",".","low_mem",":","bool",",","optional","True","to","use","low","memory","implementation","of","relation","message","passing","function",".","Default",":","False",".","This","option","trades","speed","with","memory","consumption",",","and","will","slowdown","the","forward\/backward",".","Turn","it","on","when","you","encounter","OOM","problem","during","training","or","evaluation",".","Default",":","``","False","``",".","dropout",":","float",",","optional","Dropout","rate",".","Default",":","``","0.0","``","layer_norm",":","float",",","optional","Add","layer","norm",".","Default",":","``","False","``","Examples","--","--","--","--",">",">",">","import","dgl",">",">",">","import","numpy","as","np",">",">",">","import","mxnet","as","mx",">",">",">","from","mxnet","import","gluon",">",">",">","from","dgl.nn","import","RelGraphConv",">",">",">",">",">",">","g","=","dgl.graph","(","(","[","0,1,2,3,2,5","]",",","[","1,2,3,4,0,3","]",")",")",">",">",">","feat","=","mx.nd.ones","(","(","6",",","10",")",")",">",">",">","conv","=","RelGraphConv","(","10",",","2",",","3",",","regularizer='basis","'",",","num_bases=2",")",">",">",">","conv.initialize","(","ctx=mx.cpu","(","0",")",")",">",">",">","etype","=","mx.nd.array","(","np.array","(","[","0,1,2,0,1,2","]",")",".astype","(","np.int64",")",")",">",">",">","res","=","conv","(","g",",","feat",",","etype",")","[","[","0.561324","0.33745846","]","[","0.61585337","0.09992217","]","[","0.561324","0.33745846","]","[","-0.01557937","0.01227859","]","[","0.61585337","0.09992217","]","[","0.056508","-0.00307822","]","]","<","NDArray","6x2","@","cpu","(","0",")",">"]
docstr: Message function for block-diagonal-decomposition regularizer
docstr_tok: ["Message","function","for","block-diagonal-decomposition","regularizer"]
code: def bdd_message_func(self, edges):
      """Message function for block-diagonal-decomposition regularizer"""
      ctx = edges.src["h"].context
      if (
          edges.src["h"].dtype in (np.int32, np.int64)
          and len(edges.src["h"].shape) == 1
      ):
          raise TypeError(
              "Block decomposition does not allow integer ID feature."
          )
      weight = self.weight.data(ctx)[edges.data["type"], :].reshape(
          -1, self.submat_in, self.submat_out
      )
      node = edges.src["h"].reshape(-1, 1, self.submat_in)
      msg = nd.batch_dot(node, weight).reshape(-1, self.out_feat)
      if "norm" in edges.data:
          msg = msg * edges.data["norm"]
      return {"msg": msg}
  
file_path: dgl/python/dgl/nn/mxnet/conv/relgraphconv.py
imports: import math
  import mxnet
  import numpy
  from mxnet import gluon, nd
  from mxnet.gluon import nn
  from ....None import function
  from ..None import utils
label_desc: Use image node_id 3 for calling the RelGraphConv obj's underlying member method code with example usage: obj.bdd_message_func(edges) and returns: dict