class_docstr: CI-SDR loss
  
  Reference:
      Convolutive Transfer Function Invariant SDR Training
      Criteria for Multi-Channel Reverberant Speech Separation;
      C. Boeddeker et al., 2021;
      https://arxiv.org/abs/2011.15003
  Args:
      ref: (Batch, samples)
      inf: (Batch, samples)
      filter_length (int): a time-invariant filter that allows
                              slight distortion via filtering
  Returns:
      loss: (Batch,)
class_docstr_tok: ["CI-SDR","loss","Reference",":","Convolutive","Transfer","Function","Invariant","SDR","Training","Criteria","for","Multi-Channel","Reverberant","Speech","Separation",";","C.","Boeddeker","et","al.",",","2021",";","https",":","\/\/arxiv.org\/abs\/2011.15003","Args",":","ref",":","(","Batch",",","samples",")","inf",":","(","Batch",",","samples",")","filter_length","(","int",")",":","a","time-invariant","filter","that","allows","slight","distortion","via","filtering","Returns",":","loss",":","(","Batch",",",")"]
code: def __init__(
      self,
      filter_length=512,
      name=None,
      only_for_test=False,
      is_noise_loss=False,
      is_dereverb_loss=False,
  ):
      _name = "ci_sdr_loss" if name is None else name
      super().__init__(
          _name,
          only_for_test=only_for_test,
          is_noise_loss=is_noise_loss,
          is_dereverb_loss=is_dereverb_loss,
      )
  
      self.filter_length = filter_length
  
imports: import logging
  import math
  from abc import ABC
  import ci_sdr
  import fast_bss_eval
  import torch
  from packaging.version import parse
  from torch_complex.tensor import ComplexTensor
  from espnet2.enh.loss.criterions.abs_loss import AbsEnhLoss
  from espnet2.layers.stft import Stft
label_desc: Use image node_id 1 to create a new CISDRLoss object from inherited base classes: TimeDomainLoss with example: obj = CISDRLoss(filter_length, name, only_for_test, is_noise_loss, is_dereverb_loss)