class_docstr: RNN Module.
  
  Args:
      idim (int): Dimension of the imput.
      elayers (int): Number of encoder layers.
      cdim (int): Number of rnn units.
      hdim (int): Number of projection units.
      dropout (float): Dropout rate.
      typ (str): Rnn type.
docstr: BRNN forward propagation.
  
  Args:
      xs (chainer.Variable): Batch of padded character ids. (B, Tmax)
      ilens (chainer.Variable): Batch of length of each input batch. (B,)
  
  Returns:
      tuple(chainer.Variable): Tuple of `chainer.Variable` objects.
      chainer.Variable: `ilens` .
docstr_tok: ["BRNN","forward","propagation",".","Args",":","xs","(","chainer.Variable",")",":","Batch","of","padded","character","ids",".","(","B",",","Tmax",")","ilens","(","chainer.Variable",")",":","Batch","of","length","of","each","input","batch",".","(","B",",",")","Returns",":","tuple","(","chainer.Variable",")",":","Tuple","of","`","chainer.Variable","`","objects",".","chainer.Variable",":","`","ilens","`","."]
code: def __call__(self, xs, ilens):
      """BRNN forward propagation.
  
      Args:
          xs (chainer.Variable): Batch of padded character ids. (B, Tmax)
          ilens (chainer.Variable): Batch of length of each input batch. (B,)
  
      Returns:
          tuple(chainer.Variable): Tuple of `chainer.Variable` objects.
          chainer.Variable: `ilens` .
  
      """
      logging.info(
          self.__class__.__name__ + " input lengths: " + str(ilens)
      )
      # need to move ilens to cpu
      ilens = cuda.to_cpu(ilens)
  
      if "lstm" in self.typ:
          _, _, ys = self.nbrnn(None, None, xs)
      else:
          _, ys = self.nbrnn(None, xs)
      ys = self.l_last(F.vstack(ys))  # (sum _utt frame_utt) x dim
      xs = F.split_axis(ys, np.cumsum(ilens[:-1]), axis=0)
  
      # final tanh operation
      xs = F.split_axis(
          F.tanh(F.vstack(xs)), np.cumsum(ilens[:-1]), axis=0
      )
  
      # 1 utterance case, it becomes an array, so need to make a utt tuple
      if not isinstance(xs, tuple):
          xs = [xs]
  
      return xs, ilens
  
imports: import logging
  import chainer
  import chainer.functions
  import chainer.links
  import numpy
  from chainer import cuda
  from espnet.nets.chainer_backend.nets_utils import _subsamplex
  from espnet.nets.e2e_asr_common import get_vgg2l_odim
label_desc: Use image node_id 2 for calling the RNN obj's underlying member method code with example usage: obj.__call__(xs, ilens) and returns: xs,  ilens