code: def get_split_data_param_list(self, split, epoch, shard_epoch=None):
      # TODO: to extend with extra datasets and keys and loop over different shard data paths
      param_list = []
      data_paths, lang_pairs = self.get_data_paths_and_lang_pairs(split)
      logger.info(f"langtoks settings: {self.args.langtoks}")
      split_num_shards_dict = self.get_split_num_data_shards(split)
      for data_category, paths in data_paths.items():
          if data_category not in lang_pairs:
              continue
          paths = utils.split_paths(paths)
          assert len(paths) > 0
          if len(paths) > 1:
              self._has_sharded_data = True
          if split != getattr(self.args, "train_subset", None):
              # if not training data set, use the first shard for valid and test
              paths = paths[:1]
  
          if data_category in self.args.langtoks:
              lang_tok_spec = self.args.langtoks[data_category]
          else:
              # default to None
              lang_tok_spec = (None, None)
  
          # infer langcode
          lang_dirs = [
              lang_pair.split("-")
              for lang_pair in lang_pairs[data_category]
          ]
          lang_dirs = [
              x if len(x) > 1 else (x[0], x[0]) for x in lang_dirs
          ]
          for src, tgt in lang_dirs:
              assert src is not None or data_category == "mono_dae", (
                  f"error: src={src}, "
                  f"tgt={tgt} for data_category={data_category}"
              )
              # logger.info(f"preparing param for {data_category}: {src} - {tgt}")
              key = self.get_dataset_key(data_category, src, tgt)
              data_path = self.get_split_data_path(
                  paths, epoch, shard_epoch, split_num_shards_dict[key]
              )
              param_list.append(
                  {
                      "key": key,
                      "data_path": data_path,
                      "split": split,
                      "src": src,
                      "src_dict": self.get_source_dictionary(src)
                      if src and data_category != "mono_dae"
                      else None,
                      "tgt": tgt,
                      "tgt_dict": self.get_target_dictionary(tgt),
                      "data_category": data_category,
                      "langtok_spec": lang_tok_spec,
                  }
              )
      return param_list
  
imports: import itertools
  import json
  import logging
  import math
  import os
  from collections import OrderedDict, defaultdict
  from argparse import ArgumentError
  from fairseq import utils
  from fairseq.data import AppendTokenDataset, ConcatDataset, Dictionary, LanguagePairDataset, PrependTokenDataset, SampledMultiDataset, SampledMultiEpochDataset, StripTokenDataset, TransformEosLangPairDataset, TruncateDataset, data_utils, indexed_dataset
  from fairseq.data.multilingual.multilingual_utils import EncoderLangtok, LangTokSpec, LangTokStyle, augment_dictionary, get_lang_tok
  from fairseq.data.multilingual.sampled_multi_dataset import CollateFormat
  from fairseq.file_io import PathManager
  from fairseq.utils import FileContentsAction, csv_str_list, eval_str_dict
label_desc: Use image node_id 31 for calling the MultilingualDatasetManager obj's underlying member method code with example usage: obj.get_split_data_param_list(split, epoch, shard_epoch) and returns: param_list