code: def test_sage_conv_bi2(idtype, aggre_type, out_dim):
      # Test the case for graphs without edges
      g = dgl.heterograph(
          {("_U", "_E", "_V"): ([], [])}, {"_U": 5, "_V": 3}
      )
      g = g.astype(idtype).to(F.ctx())
      ctx = F.ctx()
      sage = nn.SAGEConv((3, 3), out_dim, "gcn")
      feat = (F.randn((5, 3)), F.randn((3, 3)))
      sage.initialize(ctx=ctx)
      h = sage(g, feat)
      assert h.shape[-1] == out_dim
      assert h.shape[0] == 3
      for aggre_type in ["mean", "pool"]:
          sage = nn.SAGEConv((3, 1), out_dim, aggre_type)
          feat = (F.randn((5, 3)), F.randn((3, 1)))
          sage.initialize(ctx=ctx)
          h = sage(g, feat)
          assert h.shape[-1] == out_dim
          assert h.shape[0] == 3
  
imports: import backend
  import dgl
  import dgl.function
  import dgl.nn.mxnet
  import mxnet
  import networkx
  import numpy
  import pytest
  import scipy
  from mxnet import autograd, gluon, nd
  from utils import parametrize_idtype
  from utils.graph_cases import get_cases, random_bipartite, random_dglgraph, random_graph
label_desc: Use image node_id 12 for calling a global function with example usage: test_sage_conv_bi2(idtype, aggre_type, out_dim) without return types