class_docstr: RNN with projection layer module.
  
  Args:
      idim (int): Dimension of inputs.
      elayers (int): Number of encoder layers.
      cdim (int): Number of rnn units. (resulted in cdim * 2 if bidirectional)
      hdim (int): Number of projection units.
      subsample (np.ndarray): List to use sabsample the input array.
      dropout (float): Dropout rate.
      typ (str): The RNN type.
docstr: RNNP forward.
  
  Args:
      xs (chainer.Variable): Batch of padded character ids. (B, Tmax)
      ilens (chainer.Variable): Batch of length of each input batch. (B,)
  
  Returns:
      xs (chainer.Variable):subsampled vector of xs.
      chainer.Variable: Subsampled vector of ilens.
docstr_tok: ["RNNP","forward",".","Args",":","xs","(","chainer.Variable",")",":","Batch","of","padded","character","ids",".","(","B",",","Tmax",")","ilens","(","chainer.Variable",")",":","Batch","of","length","of","each","input","batch",".","(","B",",",")","Returns",":","xs","(","chainer.Variable",")",":","subsampled","vector","of","xs",".","chainer.Variable",":","Subsampled","vector","of","ilens","."]
code: def __call__(self, xs, ilens):
      """RNNP forward.
  
      Args:
          xs (chainer.Variable): Batch of padded character ids. (B, Tmax)
          ilens (chainer.Variable): Batch of length of each input batch. (B,)
  
      Returns:
          xs (chainer.Variable):subsampled vector of xs.
          chainer.Variable: Subsampled vector of ilens.
  
      """
      logging.info(
          self.__class__.__name__ + " input lengths: " + str(ilens)
      )
  
      for layer in range(self.elayers):
          if "lstm" in self.typ:
              _, _, ys = self[self.rnn_label + str(layer)](
                  None, None, xs
              )
          else:
              _, ys = self[self.rnn_label + str(layer)](None, xs)
          # ys: utt list of frame x cdim x 2 (2: means bidirectional)
          # TODO(watanabe) replace subsample and FC layer with CNN
          ys, ilens = _subsamplex(ys, self.subsample[layer + 1])
          # (sum _utt frame_utt) x dim
          ys = self["bt" + str(layer)](F.vstack(ys))
          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 RNNP obj's underlying member method code with example usage: obj.__call__(xs, ilens) and returns: xs,  ilens