class_docstr: The MulCat block.
  
  Args:
      input_size: int, dimension of the input feature.
          The input should have shape (batch, seq_len, input_size).
      hidden_size: int, dimension of the hidden state.
      dropout: float, the dropout rate in the LSTM layer. (Default: 0.0)
      bidirectional: bool, whether the RNN layers are bidirectional. (Default: True)
code: def __init__(
      self,
      input_size: int,
      hidden_size: int,
      dropout: float = 0.0,
      bidirectional: bool = True,
  ):
      super().__init__()
  
      num_direction = int(bidirectional) + 1
  
      self.rnn = nn.LSTM(
          input_size,
          hidden_size,
          1,
          dropout=dropout,
          batch_first=True,
          bidirectional=bidirectional,
      )
      self.rnn_proj = nn.Linear(hidden_size * num_direction, input_size)
  
      self.gate_rnn = nn.LSTM(
          input_size,
          hidden_size,
          num_layers=1,
          batch_first=True,
          dropout=dropout,
          bidirectional=bidirectional,
      )
      self.gate_rnn_proj = nn.Linear(
          hidden_size * num_direction, input_size
      )
  
      self.block_projection = nn.Linear(input_size * 2, input_size)
  
file_path: espnet/espnet2/enh/layers/dpmulcat.py
imports: import torch
  import torch.nn
label_desc: Use image node_id 1 to create a new MulCatBlock object from inherited base classes: nn with example: obj = MulCatBlock(input_size, hidden_size, dropout, bidirectional)