class_docstr: Splits data into blocks and randomizes them before sampling.
  
  This causes some order of the data to be preserved, while still shuffling the data.
code: def __iter__(self):
      data = list(range(len(self.data_source)))
  
      blocksize = self.block_size + random.randint(0, self.plus_window)
  
      log.info(
          f"Chunk sampling with blocksize = {blocksize} ({self.block_size} + {self.plus_window})"
      )
  
      # Create blocks
      blocks = [
          data[i : i + blocksize]
          for i in range(0, len(data), blocksize)
      ]
      # shuffle the blocks
      random.shuffle(blocks)
      # concatenate the shuffled blocks
      data[:] = [b for bs in blocks for b in bs]
      return iter(data)
  
imports: import logging
  import random
  from collections import defaultdict
  from typing import Dict
  import torch
  from torch.utils.data.sampler import Sampler
label_desc: Use image node_id 2 for calling the ChunkSampler obj's underlying member method code with example usage: obj.__iter__() and returns: iter