code: def forward(self, x, edge, num_sampled_nodes, num_sampled_edges):
      if isinstance(edge, torch.Tensor):
          edge = list(
              CuGraphSAGEConv.to_csc(
                  edge.cuda(), (x.shape[0], num_sampled_nodes.sum())
              )
          )
      else:
          edge = edge.csr()
          edge = [edge[1], edge[0], x.shape[0]]
  
      x = x.cuda().to(torch.float32)
  
      for i, conv in enumerate(self.convs):
          if i > 0:
              new_num_edges = edge[1][-2]
              edge[0] = edge[0].narrow(
                  dim=0,
                  start=0,
                  length=new_num_edges,
              )
              edge[1] = edge[1].narrow(
                  dim=0,
                  start=0,
                  length=edge[1].size(0) - num_sampled_nodes[-i - 1],
              )
              edge[2] = x.shape[0]
  
          x = conv(x, edge)
  
          x = F.relu(x)
          x = F.dropout(x, p=0.5)
  
      x = x.narrow(dim=0, start=0, length=num_sampled_nodes[0])
  
      return x
  
file_path: cugraph/benchmarks/cugraph/standalone/bulk_sampling/models/pyg/models_cugraph_pyg.py
imports: import torch
  from cugraph_pyg.nn.conv import SAGEConv
  import torch.nn
  import torch.nn.functional
label_desc: Use image node_id 2 for calling the CuGraphSAGE obj's underlying member method code with example usage: obj.forward(x, edge, num_sampled_nodes, num_sampled_edges) and returns: x