class_docstr: This class calculates Viterbi alignments in the forward method.
  
  It also records alignments and creates batches of them for use
  in Viterbi training.
  
  Arguments
  ---------
  states_per_phoneme : int
      Number of hidden states to use per phoneme.
  output_folder : str
      It is the folder that the alignments will be stored in when
      saved to disk. Not yet implemented.
  neg_inf : float
      The float used to represent a negative infinite log probability.
      Using `-float("Inf")` tends to give numerical instability.
      A number more negative than -1e5 also sometimes gave errors when
      the `genbmm` library was used (currently not in use). (default: -1e5)
  batch_reduction : string
      One of "none", "sum" or "mean".
      What kind of batch-level reduction to apply to the loss calculated
      in the forward method.
  input_len_norm : bool
      Whether to normalize the loss in the forward method by the length of
      the inputs.
  target_len_norm : bool
      Whether to normalize the loss in the forward method by the length of
      the targets.
  lexicon_path : string
      The location of the lexicon.
  
  Example
  -------
  >>> log_posteriors = torch.tensor([[[ -1., -10., -10.],
  ...                                 [-10.,  -1., -10.],
  ...                                 [-10., -10.,  -1.]],
  ...
  ...                                [[ -1., -10., -10.],
  ...                                 [-10.,  -1., -10.],
  ...                                 [-10., -10., -10.]]])
  >>> lens = torch.tensor([1., 0.66])
  >>> phns = torch.tensor([[0, 1, 2],
  ...                      [0, 1, 0]])
  >>> phn_lens = torch.tensor([1., 0.66])
  >>> aligner = HMMAligner()
  >>> forward_scores = aligner(
  ...        log_posteriors, lens, phns, phn_lens, 'forward'
  ... )
  >>> forward_scores.shape
  torch.Size([2])
  >>> viterbi_scores, alignments = aligner(
  ...        log_posteriors, lens, phns, phn_lens, 'viterbi'
  ... )
  >>> alignments
  [[0, 1, 2], [0, 1]]
  >>> viterbi_scores.shape
  torch.Size([2])
docstr: Records Viterbi alignments in `self.align_dict`.
  
  Arguments
  ---------
  ids : list of str
      IDs of the files in the batch.
  alignments : list of lists of int
      Viterbi alignments for the files in the batch.
      Without padding.
  
  Example
  -------
  >>> aligner = HMMAligner()
  >>> ids = ['id1', 'id2']
  >>> alignments = [[0, 2, 4], [1, 2, 3, 4]]
  >>> aligner.store_alignments(ids, alignments)
  >>> aligner.align_dict.keys()
  dict_keys(['id1', 'id2'])
  >>> aligner.align_dict['id1']
  tensor([0, 2, 4], dtype=torch.int16)
docstr_tok: ["Records","Viterbi","alignments","in","`","self.align_dict","`",".","Arguments","--","--","--","--","-","ids",":","list","of","str","IDs","of","the","files","in","the","batch",".","alignments",":","list","of","lists","of","int","Viterbi","alignments","for","the","files","in","the","batch",".","Without","padding",".","Example","--","--","--","-",">",">",">","aligner","=","HMMAligner","(",")",">",">",">","ids","=","[","'id1","'",",","'id2","'","]",">",">",">","alignments","=","[","[","0",",","2",",","4","]",",","[","1",",","2",",","3",",","4","]","]",">",">",">","aligner.store_alignments","(","ids",",","alignments",")",">",">",">","aligner.align_dict.keys","(",")","dict_keys","(","[","'id1","'",",","'id2","'","]",")",">",">",">","aligner.align_dict","[","'id1","'","]","tensor","(","[","0",",","2",",","4","]",",","dtype=torch.int16",")"]
code: def store_alignments(self, ids, alignments):
      """Records Viterbi alignments in `self.align_dict`.
  
      Arguments
      ---------
      ids : list of str
          IDs of the files in the batch.
      alignments : list of lists of int
          Viterbi alignments for the files in the batch.
          Without padding.
  
      Example
      -------
      >>> aligner = HMMAligner()
      >>> ids = ['id1', 'id2']
      >>> alignments = [[0, 2, 4], [1, 2, 3, 4]]
      >>> aligner.store_alignments(ids, alignments)
      >>> aligner.align_dict.keys()
      dict_keys(['id1', 'id2'])
      >>> aligner.align_dict['id1']
      tensor([0, 2, 4], dtype=torch.int16)
      """
  
      for i, id in enumerate(ids):
          alignment_i = alignments[i]
          alignment_i = torch.tensor(
              alignment_i, dtype=torch.int16
          ).cpu()
          self.align_dict[id] = alignment_i
  
imports: import torch
  import random
  from speechbrain.utils.checkpoints import register_checkpoint_hooks
  from speechbrain.utils.checkpoints import mark_as_saver
  from speechbrain.utils.checkpoints import mark_as_loader
  from speechbrain.utils.data_utils import undo_padding
label_desc: Use image node_id 12 for calling the HMMAligner obj's underlying member method code with example usage: obj.store_alignments(ids, alignments) without return types