docstr: DC-CRN Separator Forward.
  
  Args:
      input (torch.Tensor or ComplexTensor): Encoded feature [Batch, T, F]
                                             or [Batch, T, C, F]
      ilens (torch.Tensor): input lengths [Batch,]
  
  Returns:
      masked (List[Union(torch.Tensor, ComplexTensor)]): [(Batch, T, F), ...]
      ilens (torch.Tensor): (B,)
      others predicted data, e.g. masks: OrderedDict[
          'mask_spk1': torch.Tensor(Batch, Frames, Freq),
          'mask_spk2': torch.Tensor(Batch, Frames, Freq),
          ...
          'mask_spkn': torch.Tensor(Batch, Frames, Freq),
      ]
docstr_tok: ["DC-CRN","Separator","Forward",".","Args",":","input","(","torch.Tensor","or","ComplexTensor",")",":","Encoded","feature","[","Batch",",","T",",","F","]","or","[","Batch",",","T",",","C",",","F","]","ilens","(","torch.Tensor",")",":","input","lengths","[","Batch",",","]","Returns",":","masked","(","List","[","Union","(","torch.Tensor",",","ComplexTensor",")","]",")",":","[","(","Batch",",","T",",","F",")",",","...","]","ilens","(","torch.Tensor",")",":","(","B",",",")","others","predicted","data",",","e.g",".","masks",":","OrderedDict","[","'mask_spk1","'",":","torch.Tensor","(","Batch",",","Frames",",","Freq",")",",","'mask_spk2","'",":","torch.Tensor","(","Batch",",","Frames",",","Freq",")",",","...","'mask_spkn","'",":","torch.Tensor","(","Batch",",","Frames",",","Freq",")",",","]"]
code: def forward(
      self,
      input: Union[torch.Tensor, ComplexTensor],
      ilens: torch.Tensor,
      additional: Optional[Dict] = None,
  ) -> Tuple[
      List[Union[torch.Tensor, ComplexTensor]],
      torch.Tensor,
      OrderedDict,
  ]:
      """DC-CRN Separator Forward.
  
      Args:
          input (torch.Tensor or ComplexTensor): Encoded feature [Batch, T, F]
                                                 or [Batch, T, C, F]
          ilens (torch.Tensor): input lengths [Batch,]
  
      Returns:
          masked (List[Union(torch.Tensor, ComplexTensor)]): [(Batch, T, F), ...]
          ilens (torch.Tensor): (B,)
          others predicted data, e.g. masks: OrderedDict[
              'mask_spk1': torch.Tensor(Batch, Frames, Freq),
              'mask_spk2': torch.Tensor(Batch, Frames, Freq),
              ...
              'mask_spkn': torch.Tensor(Batch, Frames, Freq),
          ]
      """
      assert is_complex(input)
      is_multichannel = input.ndim == 4
      if is_multichannel:
          feature = torch.cat([input.real, input.imag], dim=2).permute(
              0, 2, 1, 3
          )
      else:
          feature = torch.stack([input.real, input.imag], dim=1)
  
      masks = self.dc_crn(feature)
      masks = [
          new_complex_like(input, m.unbind(dim=1))
          for m in masks.unbind(dim=2)
      ]
  
      if self.predict_noise:
          *masks, mask_noise = masks
  
      if self.mode == "masking":
          if is_multichannel:
              masked = [input * m.unsqueeze(2) for m in masks]
          else:
              masked = [input * m for m in masks]
      else:
          masked = masks
          if is_multichannel:
              masks = [m.unsqueeze(2) / (input + EPS) for m in masked]
          else:
              masks = [m / (input + EPS) for m in masked]
  
      others = OrderedDict(
          zip(
              ["mask_spk{}".format(i + 1) for i in range(len(masks))],
              masks,
          )
      )
      if self.predict_noise:
          mask_noise = (
              mask_noise.unsqueeze(2) if is_multichannel else mask_noise
          )
          if self.mode == "masking":
              others["noise1"] = input * mask_noise
          else:
              others["noise1"] = mask_noise
  
      return masked, ilens, others
  
file_path: espnet/espnet2/enh/separator/dc_crn_separator.py
imports: from collections import OrderedDict
  from typing import Dict, List, Optional, Tuple, Union
  import torch
  from packaging.version import parse
  from torch_complex.tensor import ComplexTensor
  from espnet2.enh.layers.complex_utils import is_complex, new_complex_like
  from espnet2.enh.layers.dc_crn import DC_CRN
  from espnet2.enh.separator.abs_separator import AbsSeparator
label_desc: Use image node_id 2 for calling the DC_CRNSeparator obj's underlying member method code with example usage: obj.forward(input, ilens, additional) and returns: masked,  ilens,  others