code: def setup(self, stage: str | None = None):
      # Assign train/val datasets for use in dataloaders
      if stage == "fit" or stage is None:
          mnist_full = MNIST(
              self.data_dir, train=True, transform=self.transform
          )
          self.mnist_train, self.mnist_val = random_split(
              mnist_full, [55000, 5000]
          )
  
      # Assign test dataset for use in dataloader(s)
      if stage == "test" or stage is None:
          self.mnist_test = MNIST(
              self.data_dir, train=False, transform=self.transform
          )
  
      if stage == "predict" or stage is None:
          self.mnist_predict = MNIST(
              self.data_dir, train=False, transform=self.transform
          )
  
imports: from __future__ import annotations
  import pytorch_lightning
  import torch
  import torch.nn.functional
  from torch.optim.lr_scheduler import ExponentialLR
  from torch.utils.data import random_split, DataLoader
  from torchmetrics.functional import accuracy
  from torchvision.datasets import MNIST
  from torchvision import transforms
  import nni
  from .simple_torch_model import SimpleTorchModel
label_desc: Use image node_id 3 for calling the MNISTDataModule obj's underlying member method code with example usage: obj.setup(stage) without return types