code: def __iter__(self):
      #         for fn in self.data_files:
  
      if self.shuffle:
          random.shuffle(
              self.preprocessed_data
          )  # shuffle data before batch
  
      batches = [
          self.preprocessed_data[i : i + self.batch_size]
          for i in range(
              0, len(self.preprocessed_data), self.batch_size
          )
      ]
      if len(batches[-1]) < self.batch_size:
          batches.pop()
  
      dataset = MolTreeDataset(batches, self.vocab, self.assm)
      dataloader = DataLoader(
          dataset,
          batch_size=1,
          shuffle=False,
          num_workers=self.num_workers,
          collate_fn=lambda x: x[0],
      )
  
      for b in dataloader:
          yield b
  
      del self.preprocessed_data, batches, dataset, dataloader
  
imports: import pickle
  import os
  import random
  import torch
  import numpy
  from torch.utils.data import Dataset, DataLoader
  from .mol_tree import MolTree
  from .jtnn_enc import JTNNEncoder
  from .mpn import MPN
  from .jtmpn import JTMPN
  from .vocab import Vocab
label_desc: Use image node_id 2 for calling the MolTreeFolder obj's underlying member method code with example usage: obj.__iter__() without return types