std::vector packReplabels()

in torchaudio/csrc/decoder/src/dictionary/Utils.cpp [84:116]


std::vector<int> packReplabels(
    const std::vector<int>& tokens,
    const Dictionary& dict,
    int maxReps) {
  if (tokens.empty() || maxReps <= 0) {
    return tokens;
  }

  std::vector<int> replabelValueToIdx(maxReps + 1);
  for (int i = 1; i <= maxReps; ++i) {
    replabelValueToIdx[i] = dict.getIndex("<" + std::to_string(i) + ">");
  }

  std::vector<int> result;
  int prevToken = -1;
  int numReps = 0;
  for (int token : tokens) {
    if (token == prevToken && numReps < maxReps) {
      numReps++;
    } else {
      if (numReps > 0) {
        result.push_back(replabelValueToIdx[numReps]);
        numReps = 0;
      }
      result.push_back(token);
      prevToken = token;
    }
  }
  if (numReps > 0) {
    result.push_back(replabelValueToIdx[numReps]);
  }
  return result;
}