class_docstr: Speaker Diarization model
  
  If "attractor" is "None", SA-EEND will be used.
  Else if "attractor" is not "None", EEND-EDA will be used.
  For the details about SA-EEND and EEND-EDA, refer to the following papers:
  SA-EEND: https://arxiv.org/pdf/1909.06247.pdf
  EEND-EDA: https://arxiv.org/pdf/2005.09921.pdf, https://arxiv.org/pdf/2106.10654.pdf
code: def __init__(
      self,
      frontend: Optional[AbsFrontend],
      specaug: Optional[AbsSpecAug],
      normalize: Optional[AbsNormalize],
      label_aggregator: torch.nn.Module,
      encoder: AbsEncoder,
      decoder: AbsDecoder,
      attractor: Optional[AbsAttractor],
      diar_weight: float = 1.0,
      attractor_weight: float = 1.0,
  ):
      assert check_argument_types()
  
      super().__init__()
  
      self.encoder = encoder
      self.normalize = normalize
      self.frontend = frontend
      self.specaug = specaug
      self.label_aggregator = label_aggregator
      self.diar_weight = diar_weight
      self.attractor_weight = attractor_weight
      self.attractor = attractor
      self.decoder = decoder
  
      if self.attractor is not None:
          self.decoder = None
      elif self.decoder is not None:
          self.num_spk = decoder.num_spk
      else:
          raise NotImplementedError
  
imports: from contextlib import contextmanager
  from itertools import permutations
  from typing import Dict, Optional, Tuple
  import numpy
  import torch
  import torch.nn.functional
  from packaging.version import parse
  from typeguard import check_argument_types
  from espnet2.asr.encoder.abs_encoder import AbsEncoder
  from espnet2.asr.frontend.abs_frontend import AbsFrontend
  from espnet2.asr.specaug.abs_specaug import AbsSpecAug
  from espnet2.diar.attractor.abs_attractor import AbsAttractor
  from espnet2.diar.decoder.abs_decoder import AbsDecoder
  from espnet2.layers.abs_normalize import AbsNormalize
  from espnet2.torch_utils.device_funcs import force_gatherable
  from espnet2.train.abs_espnet_model import AbsESPnetModel
  from espnet.nets.pytorch_backend.nets_utils import to_device
label_desc: Use image node_id 1 to create a new ESPnetDiarizationModel object from inherited base classes: AbsESPnetModel with example: obj = ESPnetDiarizationModel(frontend, specaug, normalize, label_aggregator, encoder, decoder, attractor, diar_weight, attractor_weight)