// 解码:token id 序列 -> 原始字节。
//
// 不变量 V6:对任意 `Bytes`,`decode(encode(b)) == b` 逐字节成立。
///|
/// 把 token id 序列拼回字节序列。
///
/// 越界的 id 会被忽略(调用方若需严格模式可自行校验)。
pub fn decode(v : VocabView, ids : Array[Int]) -> Bytes {
let n = v.tokens.length()
let mut total = 0
for id in ids {
if id >= 0 && id < n {
total = total + v.tokens[id].length()
}
}
let out : Array[Byte] = Array::make(total, (0).to_byte())
let mut w = 0
for id in ids {
if id >= 0 && id < n {
let t = v.tokens[id]
for k = 0; k < t.length(); k = k + 1 {
out[w] = t.unsafe_get(k)
w = w + 1
}
}
}
Bytes::from_array(out)
}