class_docstr: Maximum Likelihood criterion.
  It implements Connectionist Temporal Classification (CTC) loss,
  but can be extended to support other loss functions (ASG, HMM, RNNT, ...).
  
  Based on https://github.com/k2-fsa/snowfall/blob/master/snowfall/objectives/ctc.py
  
  cfg takes precedence over all optional parameters
  We keep explicit parameter setting to be able to create an instance without the need of a config.
code: def __init__(
      self,
      num_classes: int,
      blank: int,
      reduction: str,
      cfg: Optional[DictConfig] = None,
      topo_type: str = "default",
      topo_with_self_loops: bool = True,
  ):
      super().__init__()
      if cfg is not None:
          topo_type = cfg.get("topo_type", topo_type)
          topo_with_self_loops = cfg.get(
              "topo_with_self_loops", topo_with_self_loops
          )
      self.blank = blank
      self.num_classes = num_classes
      self.reduction = reduction
      self.topo_type = topo_type
      self.topo_with_self_loops = topo_with_self_loops
      self.pad_fsavec = topo_type == "compact"
      self.graph_compiler = None
  
imports: from abc import abstractmethod
  from typing import Any, Optional, Tuple
  import torch
  from omegaconf import DictConfig
  from nemo.collections.asr.parts.k2.graph_compilers import CtcTopologyCompiler, RnntTopologyCompiler
  from nemo.collections.asr.parts.k2.loss_mixins import CtcK2Mixin, RnntK2Mixin
  from nemo.collections.asr.parts.k2.utils import get_tot_objf_and_finite_mask, invert_permutation
  from nemo.core.utils.k2_guard import k2
label_desc: Use image node_id 1 to create a new MLLoss object from inherited base classes: torch.nn with example: obj = MLLoss(num_classes, blank, reduction, cfg, topo_type, topo_with__loops)