class_docstr: This implements a simple multi-agent minibatch iterator.
  
  
  This iterator will split the input multi-agent batch into minibatches where the
  size of batch for each module_id (aka policy_id) is equal to minibatch_size. If the
  input batch is smaller than minibatch_size, then the iterator will cycle through
  the batch until it has covered num_iters epochs.
  
  Args:
      batch: The input multi-agent batch.
      minibatch_size: The size of the minibatch for each module_id.
      num_iters: The minimum number of epochs to cover. If the input batch is smaller
          than minibatch_size, then the iterator will cycle through the batch until
          it has covered at least num_iters epochs.
code: def __init__(
      self,
      batch: MultiAgentBatch,
      minibatch_size: int,
      num_iters: int = 1,
  ) -> None:
      super().__init__(batch, minibatch_size, num_iters)
      self._batch = batch
      self._minibatch_size = minibatch_size
      self._num_iters = num_iters
  
      # mapping from module_id to the start index of the batch
      self._start = {mid: 0 for mid in batch.policy_batches.keys()}
      # mapping from module_id to the number of epochs covered for each module_id
      self._num_covered_epochs = {
          mid: 0 for mid in batch.policy_batches.keys()
      }
  
imports: import math
  from typing import List
  from ray.rllib.policy.sample_batch import MultiAgentBatch, concat_samples
  from ray.rllib.policy.sample_batch import SampleBatch
  from ray.rllib.utils.annotations import DeveloperAPI
  from ray.rllib.utils.typing import EpisodeType
label_desc: Use image node_id 1 to create a new MiniBatchCyclicIterator object from inherited base classes: MiniBatchIteratorBase with example: obj = MiniBatchCyclicIterator(batch, minibatch_size, num_iters)