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, F]
        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. tf_embedding: OrderedDict[
            'tf_embedding': learned embedding of all T-F bins (B, T * F, D),
        ]
    """
    # if complex spectrum,
    if is_complex(input):
        feature = abs(input)
    else:
        feature = input
    B, T, F = input.shape
    # x:(B, T, F)
    x, ilens, _ = self.blstm(feature, ilens)
    # x:(B, T, F*D)
    x = self.linear(x)
    # x:(B, T, F*D)
    x = self.nonlinear(x)
    tf_embedding = x.view(B, -1, self.D)
    if self.training:
        masked = None
    else:
        # K-means for batch
        centers = tf_embedding[:, : self._num_spk, :].detach()
        dist = torch.empty(B, T * F, self._num_spk, device=tf_embedding.device)
        last_label = torch.zeros(B, T * F, device=tf_embedding.device)
        while True:
            for i in range(self._num_spk):
                dist[:, :, i] = torch.sum(
                    (tf_embedding - centers[:, i, :].unsqueeze(1)) ** 2, dim=2
                )
            label = dist.argmin(dim=2)
            if torch.sum(label != last_label) == 0:
                break
            last_label = label
            for b in range(B):
                for i in range(self._num_spk):
                    centers[b, i] = tf_embedding[b, label[b] == i].mean(dim=0)
        label = label.view(B, T, F)
        masked = []
        for i in range(self._num_spk):
            masked.append(input * (label == i))
    others = OrderedDict(
        {"tf_embedding": tf_embedding},
    )
    return masked, ilens, others