class_docstr: Permutation Invariant Training (PIT) module.
  
  :parameter int num_spkrs: number of speakers for PIT process (2 or 3)
class_docstr_tok: ["Permutation","Invariant","Training","(","PIT",")","module",".",":","parameter","int","num_spkrs",":","number","of","speakers","for","PIT","process","(","2","or","3",")"]
docstr: Compute the PIT loss for a batch.
  
  :param torch.Tensor losses: losses (B, 1|4|9)
  :return minimum losses of a batch with best permutation
  :rtype torch.Tensor (B)
  :return the best permutation
  :rtype torch.LongTensor (B, 1|2|3)
docstr_tok: ["Compute","the","PIT","loss","for","a","batch",".",":","param","torch.Tensor","losses",":","losses","(","B",",","1|4|9",")",":","return","minimum","losses","of","a","batch","with","best","permutation",":","rtype","torch.Tensor","(","B",")",":","return","the","best","permutation",":","rtype","torch.LongTensor","(","B",",","1|2|3",")"]
code: def pit_process(self, losses):
      """Compute the PIT loss for a batch.
  
      :param torch.Tensor losses: losses (B, 1|4|9)
      :return minimum losses of a batch with best permutation
      :rtype torch.Tensor (B)
      :return the best permutation
      :rtype torch.LongTensor (B, 1|2|3)
  
      """
      bs = losses.size(0)
      ret = [self.min_pit_sample(losses[i]) for i in range(bs)]
  
      loss_perm = torch.stack([r[0] for r in ret], dim=0).to(
          losses.device
      )  # (B)
      permutation = (
          torch.tensor([r[1] for r in ret]).long().to(losses.device)
      )
      return torch.mean(loss_perm), permutation
  
imports: import argparse
  import logging
  import math
  import os
  import sys
  from itertools import groupby
  import numpy
  import torch
  from espnet.nets.asr_interface import ASRInterface
  from espnet.nets.e2e_asr_common import get_vgg2l_odim, label_smoothing_dist
  from espnet.nets.pytorch_backend.ctc import ctc_for
  from espnet.nets.pytorch_backend.e2e_asr import E2E
  from espnet.nets.pytorch_backend.e2e_asr import Reporter
  from espnet.nets.pytorch_backend.frontends.feature_transform import feature_transform_for
  from espnet.nets.pytorch_backend.frontends.frontend import frontend_for
  from espnet.nets.pytorch_backend.initialization import lecun_normal_init_parameters, set_forget_bias_to_one
  from espnet.nets.pytorch_backend.nets_utils import get_subsample, make_pad_mask, pad_list, to_device, to_torch_tensor
  from espnet.nets.pytorch_backend.rnn.attentions import att_for
  from espnet.nets.pytorch_backend.rnn.decoders import decoder_for
  from espnet.nets.pytorch_backend.rnn.encoders import RNNP, VGG2L
  from espnet.nets.pytorch_backend.rnn.encoders import encoder_for
label_desc: Use image node_id 3 for calling the PIT obj's underlying member method code with example usage: obj.pit_process(losses) and returns: torch,  permutation