code: def _build_train_valid_test_datasets(
      cfg,
      trainer,
      data_prefix,
      data_impl,
      splits_string,
      train_valid_test_num_samples,
      max_seq_length,
      masked_lm_prob,
      short_seq_prob,
      seed,
      skip_warmup,
      binary_head,
      max_seq_length_dec,
      dataset_type="standard_bert",
      tokenizer=None,
      max_ngram_size=3,
      mean_ngram_size=None,
      geometric_dist=True,
      permutation=False,
      whole_word_masking=True,
      favor_long_ngrams=False,
      delete_mask_prob=0,  # This flag is used in BART only, and will not have effect on T5/BERT
      respect_document_boundaries=True,
      data_impl_kwargs={},
  ):
      # Indexed dataset.
      indexed_dataset = get_indexed_dataset_(
          data_prefix,
          data_impl,
          skip_warmup,
          data_impl_kwargs=data_impl_kwargs,
      )
  
      # if dataset_type == DSET_TYPE_ICT:
      #     title_dataset = get_indexed_dataset_(args.titles_data_path, data_impl, skip_warmup)
  
      # Get start and end indices of train/valid/train into doc-idx
      # Note that doc-idx is desinged to be num-docs + 1 so we can
      # easily iterate over it.
      total_num_of_documents = indexed_dataset.doc_idx.shape[0] - 1
      splits = get_train_valid_test_split_(
          splits_string, total_num_of_documents
      )
  
      # Print stats about the splits.
      logging.info(" > dataset split:")
  
      def print_split_stats(name, index):
          logging.info("    {}:".format(name))
          logging.info(
              "     document indices in [{}, {}) total of {} "
              "documents".format(
                  splits[index],
                  splits[index + 1],
                  splits[index + 1] - splits[index],
              )
          )
          start_index = indexed_dataset.doc_idx[splits[index]]
          end_index = indexed_dataset.doc_idx[splits[index + 1]]
          logging.info(
              "     sentence indices in [{}, {}) total of {} "
              "sentences".format(
                  start_index, end_index, end_index - start_index
              )
          )
  
      print_split_stats("train", 0)
      print_split_stats("validation", 1)
      print_split_stats("test", 2)
  
      def build_dataset(index, name):
          # from nemo.collections.nlp.data.language_modeling.megatron.ict_dataset import ICTDataset
          from nemo.collections.nlp.data.language_modeling.megatron.bart_dataset import (
              BARTDataset,
          )
          from nemo.collections.nlp.data.language_modeling.megatron.bert_dataset import (
              BertDataset,
          )
          from nemo.collections.nlp.data.language_modeling.megatron.length_distribution_type import (
              LengthDistribution,
          )
          from nemo.collections.nlp.data.language_modeling.megatron.t5_dataset import (
              T5Dataset,
          )
          from nemo.collections.nlp.data.language_modeling.megatron.ul2_dataset import (
              UL2Dataset,
          )
  
          dataset = None
          if splits[index + 1] > splits[index]:
              # Get the pointer to the original doc-idx so we can set it later.
              if hasattr(indexed_dataset, "get_doc_idx"):
                  doc_idx_ptr = indexed_dataset.get_doc_idx()
              # Slice the doc-idx
              start_index = splits[index]
              # Add +1 so we can index into the dataset to get the upper bound.
              end_index = splits[index + 1] + 1
              # New doc_idx view.
              if hasattr(indexed_dataset, "set_doc_idx"):
                  indexed_dataset.set_doc_idx(
                      doc_idx_ptr[start_index:end_index]
                  )
              # Build the dataset accordingly.
              kwargs = dict(
                  name=name,
                  data_prefix=data_prefix,
                  num_epochs=None,
                  max_num_samples=int(
                      train_valid_test_num_samples[index]
                  ),
                  max_seq_length=max_seq_length,
                  seed=seed,
              )
  
              dataset = get_dataset(
                  indexed_dataset,
                  splits[index],
                  splits[index + 1],
                  cfg,
                  trainer,
                  int(train_valid_test_num_samples[index]),
                  masked_lm_prob,
                  short_seq_prob,
                  binary_head,
                  max_seq_length_dec,
                  dataset_type,
                  tokenizer,
                  max_ngram_size,
                  mean_ngram_size,
                  geometric_dist,
                  permutation,
                  whole_word_masking,
                  favor_long_ngrams,
                  delete_mask_prob,
                  respect_document_boundaries,
                  **kwargs,
              )
  
              # Set the original pointer so dataset remains the main dataset.
              if hasattr(indexed_dataset, "set_doc_idx"):
                  indexed_dataset.set_doc_idx(doc_idx_ptr)
              # Checks.
              if getattr(indexed_dataset, "doc_idx", None) is not None:
                  assert indexed_dataset.doc_idx[0] == 0
                  assert indexed_dataset.doc_idx.shape[0] == (
                      total_num_of_documents + 1
                  )
  
              return dataset
  
      train_dataset = build_dataset(0, "train")
      valid_dataset = build_dataset(1, "valid")
      test_dataset = build_dataset(2, "test")
  
      return (train_dataset, valid_dataset, test_dataset)
  
imports: import collections
  import os
  import subprocess
  import time
  from typing import Any
  import numpy
  import torch
  from omegaconf import OmegaConf
  from omegaconf.dictconfig import DictConfig
  from nemo.collections.nlp.data.language_modeling.megatron.base_dataset_utils import get_datasets_weights_and_num_samples, get_train_valid_test_split_
  from nemo.collections.nlp.data.language_modeling.megatron.blendable_dataset import BlendableDataset
  from nemo.collections.nlp.data.language_modeling.megatron.indexed_dataset import deallocate_indexed_dataset_memory
  from nemo.collections.nlp.data.language_modeling.megatron.indexed_dataset import make_dataset
  from nemo.collections.nlp.data.language_modeling.megatron.indexed_dataset import make_indexed_dataset_compatibility
  from nemo.collections.nlp.data.language_modeling.megatron.length_distribution_type import LengthDistribution
  from nemo.collections.nlp.data.language_modeling.megatron.lm_adapted_t5_dataset import T5LMAdaptedDataset
  from nemo.utils import logging
  from nemo.utils.get_rank import is_global_rank_zero
label_desc: Use image node_id 13 for calling a global function with example usage: _build_train_valid_test_datasets(cfg, trainer, data_prefix, data_impl, splits_string, train_valid_test_num_samples, max_seq_length, masked_lm_prob, short_seq_prob, seed, skip_warmup, binary_head, max_seq_length_dec, dataset_type, tokenizer, max_ngram_size, mean_ngram_size, geometric_dist, permutation, whole_word_masking, favor_long_ngrams, delete_mask_prob, respect_document_boundaries, data_impl_kwargs) and returns: train_dataset,  valid_dataset,  test_dataset, dataset