code: def __init__(self, num_prop_rounds, node_hidden_size):
      super(GraphProp, self).__init__()
  
      self.num_prop_rounds = num_prop_rounds
  
      # Setting from the paper
      self.node_activation_hidden_size = 2 * node_hidden_size
  
      message_funcs = []
      self.reduce_funcs = []
      node_update_funcs = []
  
      for t in range(num_prop_rounds):
          # input being [hv, hu, xuv]
          message_funcs.append(
              nn.Linear(
                  2 * node_hidden_size + 1,
                  self.node_activation_hidden_size,
              )
          )
  
          self.reduce_funcs.append(partial(self.dgmg_reduce, round=t))
          node_update_funcs.append(
              nn.GRUCell(
                  self.node_activation_hidden_size, node_hidden_size
              )
          )
  
      self.message_funcs = nn.ModuleList(message_funcs)
      self.node_update_funcs = nn.ModuleList(node_update_funcs)
  
imports: from functools import partial
  import dgl
  import torch
  import torch.nn
  import torch.nn.functional
  from torch.distributions import Bernoulli, Categorical
label_desc: Use image node_id 1 to create a new GraphProp object from inherited base classes: nn with example: obj = GraphProp(num_prop_rounds, node_hidden_size)