code: def _flatten_datasets_and_reindex(
      datasets: List[IDataset], indices: Optional[List[int]]
  ) -> Tuple[List[IDataset], Optional[List[int]]]:
      """The same dataset may occurr multiple times in the list of datasets.
  
      Here, we flatten the list of datasets and fix the indices to account for
      the new dataset position in the list.
      """
      # find unique datasets
      if not all(isinstance(d, Hashable) for d in datasets):
          return datasets, indices
  
      dset_uniques = set(datasets)
      if len(dset_uniques) == len(
          datasets
      ):  # no duplicates. Nothing to do.
          return datasets, indices
  
      # split the indices into <dataset-id, sample-id> pairs
      cumulative_sizes = [0] + ConcatDataset.cumsum(datasets)
      data_sample_pairs: List[Tuple[int, int]] = []
      if indices is None:
          for ii, dset in enumerate(datasets):
              data_sample_pairs.extend(
                  [(ii, jj) for jj in range(len(dset))]
              )
      else:
          for idx in indices:
              d_idx = bisect.bisect_right(cumulative_sizes, idx) - 1
              s_idx = idx - cumulative_sizes[d_idx]
              data_sample_pairs.append((d_idx, s_idx))
  
      # assign a new position in the list to each unique dataset
      new_datasets = list(dset_uniques)
      new_dpos = {d: i for i, d in enumerate(new_datasets)}
      new_cumsizes = [0] + ConcatDataset.cumsum(new_datasets)
      # reindex the indices to account for the new dataset position
      new_indices: List[int] = []
      for d_idx, s_idx in data_sample_pairs:
          new_d_idx = new_dpos[datasets[d_idx]]
          new_indices.append(new_cumsizes[new_d_idx] + s_idx)
  
      # NOTE: check disabled to avoid slowing down OCL scenarios
      # if len(new_indices) > 0 and new_cumsizes[-1] > 0:
      #     assert min(new_indices) >= 0
      #     assert max(new_indices) < new_cumsizes[-1], \
      #         f"Max index {max(new_indices)} is greater than datasets " \
      #         f"list size {new_cumsizes[-1]}"
      return new_datasets, new_indices
  
imports: import bisect
  import sys
  import numpy
  from avalanche.benchmarks.utils.dataset_utils import slice_alike_object_to_indices
  from typing import Iterable, List, Optional, Sequence, Tuple, TypeVar, Union, overload
  from torch.utils.data import ConcatDataset
  import itertools
  from avalanche.benchmarks.utils.dataset_definitions import IDataset
label_desc: Use image node_id 2 for calling a global function with example usage: _flatten_datasets_and_reindex(datasets, indices) and returns: new_datasets,  new_indices, datasets,  indices, datasets,  indices