def METHOD_NAME(self,
            node_features,
            neighbor_features,
            edge_features):
    """Update node features and edge features. The Message stage of the
       convolution.
    Args:
        node_features (Layer); A 2D layer of node features of
                               shape (num_nodes, input_channels)
        neighbor_features (Layer): A 3D layer of node features of
                                   shape (num_edges, 1, input_channels)
        edge_features (Layer): A 2D layer of edge features of
                               shape (num_edges, edge_features)
    Returns:
        (Layer, Layer): Returns the updated node features and the messages
        for each node.
    """
    ## These reshapes do not change the nn output but enables channelwise partitioning
    ## for distconv channelwiseFC natively
    node_features = lbann.Reshape(node_features, dims=[self.num_nodes, 1, self.input_channels])
    edge_features = lbann.Reshape(edge_features, dims=[self.num_edges, 1, self.edge_input_channels])
    updated_node_features = self.node_nn(node_features)
    edge_update = None
    for layer in self.edge_nn:
        if edge_update:
            edge_update = layer(edge_update)
        else:
            edge_update = layer(edge_features)
    edge_values = \
        lbann.Reshape(edge_update,
                      dims=[self.num_edges,
                            self.input_channels,
                            self.output_channels],
                      name=self.name+"_edge_mat_reshape")
    edge_values = \
        lbann.MatMul(neighbor_features, edge_values)
    return updated_node_features, edge_values