code: def forward(self, bipartites):
      if isinstance(bipartites, dgl.DGLGraph):
          bipartites = [bipartites] * len(self.conv)
          if self.use_cluster_feat:
              neighbor_x = torch.cat(
                  [
                      bipartites[0].ndata["features"],
                      bipartites[0].ndata["cluster_features"],
                  ],
                  axis=1,
              )
          else:
              neighbor_x = bipartites[0].ndata["features"]
  
          for i in range(len(self.conv)):
              neighbor_x = self.conv[i](bipartites[i], neighbor_x)
  
          output_bipartite = bipartites[-1]
          output_bipartite.ndata["conv_features"] = neighbor_x
      else:
          if self.use_cluster_feat:
              neighbor_x_src = torch.cat(
                  [
                      bipartites[0].srcdata["features"],
                      bipartites[0].srcdata["cluster_features"],
                  ],
                  axis=1,
              )
              center_x_src = torch.cat(
                  [
                      bipartites[1].srcdata["features"],
                      bipartites[1].srcdata["cluster_features"],
                  ],
                  axis=1,
              )
          else:
              neighbor_x_src = bipartites[0].srcdata["features"]
              center_x_src = bipartites[1].srcdata["features"]
  
          for i in range(len(self.conv)):
              neighbor_x_dst = neighbor_x_src[
                  : bipartites[i].num_dst_nodes()
              ]
              neighbor_x_src = self.conv[i](
                  bipartites[i], (neighbor_x_src, neighbor_x_dst)
              )
              center_x_dst = center_x_src[
                  : bipartites[i + 1].num_dst_nodes()
              ]
              center_x_src = self.conv[i](
                  bipartites[i + 1], (center_x_src, center_x_dst)
              )
  
          output_bipartite = bipartites[-1]
          output_bipartite.srcdata["conv_features"] = neighbor_x_src
          output_bipartite.dstdata["conv_features"] = center_x_src
  
      output_bipartite.apply_edges(self.pred_conn)
      output_bipartite.edata["prob_conn"] = F.softmax(
          output_bipartite.edata["pred_conn"], dim=1
      )
      output_bipartite.update_all(
          self.pred_den_msg, fn.mean("pred_den_msg", "pred_den")
      )
      return output_bipartite
  
file_path: dgl/examples/pytorch/hilander/models/lander.py
imports: import dgl
  import dgl.function
  import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from .focal_loss import FocalLoss
  from .graphconv import GraphConv
label_desc: Use image node_id 4 for calling the LANDER obj's underlying member method code with example usage: obj.forward(bipartites) and returns: output_bipartite