class_docstr: :class:`TrainDataLoader` is a dataloader for training.
  It can generate negative interaction when :attr:`training_neg_sample_num` is not zero.
  For the result of every batch, we permit that every positive interaction and its negative interaction
  must be in the same batch.
  
  Args:
      config (Config): The config of dataloader.
      dataset (Dataset): The dataset of dataloader.
      sampler (Sampler): The sampler of dataloader.
      shuffle (bool, optional): Whether the dataloader will be shuffle after a round. Defaults to ``False``.
code: def _init_batch_size_and_step(self):
      batch_size = self.config["train_batch_size"]
      if self.neg_sample_args["distribution"] != "none":
          batch_num = max(batch_size // self.times, 1)
          new_batch_size = batch_num * self.times
          self.step = batch_num
          self.set_batch_size(new_batch_size)
      else:
          self.step = batch_size
          self.set_batch_size(batch_size)
  
imports: import numpy
  import torch
  from logging import getLogger
  from recbole.data.dataloader.abstract_dataloader import AbstractDataLoader, NegSampleDataLoader
  from recbole.data.interaction import Interaction, cat_interactions
  from recbole.utils import InputType, ModelType
label_desc: Use image node_id 2 for calling the TrainDataLoader obj's underlying member method code with example usage: obj._init_batch_size_and_step() without return types