code: def forward(self, data):
      x, edge_index, batch = data.x, data.edge_index, data.batch
  
      x = F.relu(self.conv1(x, edge_index))
      x, edge_index, _, batch, perm, score = self.pool1(
          x, edge_index, None, batch
      )
      x = F.relu(self.conv2(x, edge_index))
      x, edge_index, _, batch, perm, score = self.pool2(
          x, edge_index, None, batch
      )
      ratio = x.size(0) / data.x.size(0)
  
      x = F.relu(self.conv3(x, edge_index))
      x = global_max_pool(x, batch)
      x = self.lin(x).view(-1)
  
      attn_loss = F.kl_div(
          torch.log(score + 1e-14), data.attn[perm], reduction="none"
      )
      attn_loss = scatter(attn_loss, batch, reduce="mean")
  
      return x, attn_loss, ratio
  
file_path: pytorch_geometric/examples/triangles_sag_pool.py
imports: import copy
  import os.path
  import torch
  import torch.nn.functional
  from torch.nn import Linear
  from torch.nn import ReLU
  from torch.nn import Sequential
  import torch_geometric.transforms
  from torch_geometric.datasets import TUDataset
  from torch_geometric.loader import DataLoader
  from torch_geometric.nn import GCNConv, GINConv, SAGPooling, global_max_pool
  from torch_geometric.utils import scatter
label_desc: Use image node_id 2 for calling the Net obj's underlying member method code with example usage: obj.forward(data) and returns: x,  attn_loss,  ratio