def METHOD_NAME(
    self,
    indices,
    max_tokens=None,
    max_sentences=None,
    required_batch_size_multiple=1,
):
    """
    Given an ordered set of indices, return batches according to
    *max_tokens*, *max_sentences* and *required_batch_size_multiple*.
    """
    from fairseq.data import data_utils
    fixed_shapes = self.get_batch_shapes()
    if fixed_shapes is not None:
        def adjust_bsz(bsz, num_tokens):
            if bsz is None:
                assert max_tokens is not None, "Must specify --max-tokens"
                bsz = max_tokens // num_tokens
            if max_sentences is not None:
                bsz = min(bsz, max_sentences)
            elif (
                bsz >= required_batch_size_multiple
                and bsz % required_batch_size_multiple != 0
            ):
                bsz -= bsz % required_batch_size_multiple
            return bsz
        fixed_shapes = np.array(
            [
                [adjust_bsz(bsz, num_tokens), num_tokens]
                for (bsz, num_tokens) in fixed_shapes
            ]
        )
    try:
        num_tokens_vec = self.num_tokens_vec(indices).astype('int64')
    except NotImplementedError:
        num_tokens_vec = None
    return data_utils.METHOD_NAME(
        indices,
        num_tokens_fn=self.num_tokens,
        num_tokens_vec=num_tokens_vec,
        max_tokens=max_tokens,
        max_sentences=max_sentences,
        required_batch_size_multiple=required_batch_size_multiple,
        fixed_shapes=fixed_shapes,
    )