def METHOD_NAME(
    self,
    input: Union[torch.Tensor, ComplexTensor],
    ilens: torch.Tensor,
    additional: Optional[Dict] = None,
) -> Tuple[List[Union[torch.Tensor, ComplexTensor]], torch.Tensor, OrderedDict]:
    """Forward.
    Args:
        input (torch.Tensor or ComplexTensor): Encoded feature [B, T, N]
        ilens (torch.Tensor): input lengths [Batch]
        additional (Dict or None): other data included in model
            NOTE: not used in this model
    Returns:
        masked (List[Union(torch.Tensor, ComplexTensor)]): [(B, T, N), ...]
        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),
        ]
    """
    # if complex spectrum
    if is_complex(input):
        feature = abs(input)
    else:
        feature = input
    B, L, N = feature.shape
    feature = feature.transpose(1, 2)  # B, N, L
    masks = self.tcn(feature)  # B, num_spk, N, L
    masks = masks.transpose(2, 3)  # B, num_spk, L, N
    if self.predict_noise:
        *masks, mask_noise = masks.unbind(dim=1)  # List[B, L, N]
    else:
        masks = masks.unbind(dim=1)  # List[B, L, N]
    masked = [input * m for m in masks]
    others = OrderedDict(
        zip(["mask_spk{}".format(i + 1) for i in range(len(masks))], masks)
    )
    if self.predict_noise:
        others["noise1"] = input * mask_noise
    return masked, ilens, others