class_docstr: Graph GRU unit which can use any message passing
  net to replace the linear layer in the original GRU
  Parameter
  ==========
  in_feats : int
      number of input features
  
  out_feats : int
      number of output features
  
  net : torch.nn.Module
      message passing network
class_docstr_tok: ["Graph","GRU","unit","which","can","use","any","message","passing","net","to","replace","the","linear","layer","in","the","original","GRU","Parameter","==========","in_feats",":","int","number","of","input","features","out_feats",":","int","number","of","output","features","net",":","torch.nn.Module","message","passing","network"]
code: def forward(self, g, x, h):
      r = torch.sigmoid(
          self.r_net(g, torch.cat([x, h], dim=1)) + self.r_bias
      )
      u = torch.sigmoid(
          self.u_net(g, torch.cat([x, h], dim=1)) + self.u_bias
      )
      h_ = r * h
      c = torch.sigmoid(
          self.c_net(g, torch.cat([x, h_], dim=1)) + self.c_bias
      )
      new_h = u * h + (1 - u) * c
      return new_h
  
imports: import dgl
  import dgl.function
  import dgl.nn
  import numpy
  import scipy.sparse
  import torch
  import torch.nn
  from dgl.base import DGLError
  from dgl.nn.functional import edge_softmax
label_desc: Use image node_id 2 for calling the GraphGRUCell obj's underlying member method code with example usage: obj.forward(g, x, h) and returns: new_h