class_docstr: Graph compiler for MMI loss.
  The decoding graph is a composition of the auxiliary graph and the topology.
  It is returned along with the supervision graph on every compile() call.
code: def __init__(
      self,
      num_classes: int,
      blank: int,
      topo_type: str = "default",
      topo_with_self_loops: bool = True,
      device: torch.device = torch.device("cpu"),
      aux_graph: Optional["k2.Fsa"] = None,
  ):
      super().__init__(
          num_classes,
          blank,
          topo_type,
          topo_with_self_loops,
          device,
          aux_graph,
      )
      if aux_graph is None:
          self.decoding_graph = k2.create_fsa_vec(
              [self.ctc_topo_inv.invert()]
          ).to(self.device)
      else:
          self.decoding_graph = k2.create_fsa_vec(
              [self.base_graph.detach()]
          ).to(self.device)
  
imports: from typing import Optional, Tuple
  import torch
  from nemo.collections.asr.parts.k2.utils import add_self_loops, compose_with_self_loops, intersect_with_self_loops
  from nemo.core.utils.k2_guard import k2
label_desc: Use image node_id 1 to create a new MmiGraphCompiler object from inherited base classes: CtcNumGraphCompiler with example: obj = MmiGraphCompiler(num_classes, blank, topo_type, topo_with__loops, device, aux_graph)