code: def log_node_and_edge_counts(self, blocks):
      node_counts = [block.num_src_nodes() for block in blocks] + [
          blocks[-1].num_dst_nodes()
      ]
      edge_counts = [block.num_edges() for block in blocks]
      for i, c in enumerate(node_counts):
          self.log(
              f"num_nodes/{i}",
              float(c),
              prog_bar=True,
              on_step=True,
              on_epoch=False,
          )
          if i < len(edge_counts):
              self.log(
                  f"num_edges/{i}",
                  float(edge_counts[i]),
                  prog_bar=True,
                  on_step=True,
                  on_epoch=False,
              )
  
imports: import argparse
  import dgl.graphbolt
  import dgl.nn.pytorch
  import torch
  import torch.nn
  import torch.nn.functional
  from pytorch_lightning import LightningDataModule, LightningModule, Trainer
  from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint
  from torchmetrics import Accuracy
label_desc: Use image node_id 3 for calling the SAGE obj's underlying member method code with example usage: obj.log_node_and_edge_counts(blocks) without return types