code: def get_batch_indices(data: ParallelDataSet,
                        bucket_batch_sizes: List[BucketBatchSize]) -> List[Tuple[int, int]]:
      
      # create index tuples (i,j) into buckets: i := bucket index ; j := row index of bucket array
      idxs = []  # type: List[Tuple[int, int]]
      for buck_idx, buck in enumerate(data.source):
          bucket = bucket_batch_sizes[buck_idx].bucket
          batch_size = bucket_batch_sizes[buck_idx].batch_size
          num_samples = data.source[buck_idx].shape[0]
          rest = num_samples % batch_size
          if rest > 0:
              logger.info("Ignoring %d samples from bucket %s with %d samples due to incomplete batch",
                          rest, bucket, num_samples)
          idxs.extend([(buck_idx, j) for j in range(0, num_samples - batch_size + 1, batch_size)])
      return idxs
docs: Returns a list of index tuples that index into the bucket and the start index inside a bucket given
      the batch size for a bucket. These indices are valid for the given dataset.
  
      Put another way, this returns the starting points for all batches within the dataset, across all buckets.
  
      :param data: Data to create indices for.
      :param bucket_batch_sizes: Bucket batch sizes.
      :return: List of 2d indices.