code: def __iter__(self):
      for fn in self.data_files:
          fn = os.path.join(self.data_folder, fn)
          with open(fn, "rb") as f:
              data = pickle.load(f)
  
          if self.shuffle:
              random.shuffle(data)  # shuffle data before batch
  
          batches = [
              data[i : i + self.batch_size]
              for i in range(0, len(data), self.batch_size)
          ]
          if len(batches[-1]) < self.batch_size:
              batches.pop()
  
          dataset = PairTreeDataset(batches, self.vocab, self.y_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 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 PairTreeFolder obj's underlying member method code with example usage: obj.__iter__() without return types