metrale_model_layers/layers/ngram_embed/
ids.rs1use super::NgramDims;
10
11fn shift_right_ignore_eos(ctx: &[u32], n: usize, eos: u32) -> Vec<u32> {
15 let len = ctx.len();
16 let mut out = vec![0u32; len];
17 let mut prev = 0usize;
18 for (pos, &tok) in ctx.iter().enumerate() {
19 if tok == eos {
20 let end = pos + 1;
21 if end - prev > n {
22 out[prev + n..end].copy_from_slice(&ctx[prev..end - n]);
23 }
24 prev = end;
25 }
26 }
27 if prev < len && len - prev > n {
28 out[prev + n..len].copy_from_slice(&ctx[prev..len - n]);
29 }
30 out
31}
32
33pub fn ngram_ids(dims: &NgramDims, ctx: &[u32]) -> Vec<Vec<u64>> {
37 let mut out = Vec::with_capacity(dims.num_tables());
38 let shifts: Vec<Vec<u32>> = (1..dims.neighbor_num)
40 .map(|d| shift_right_ignore_eos(ctx, d, dims.eos_token_id))
41 .collect();
42 for ngram in 2..=dims.neighbor_num {
43 for split in 0..dims.split_num {
44 let index = (ngram - 2) * dims.split_num + split;
45 let t = dims.table_rows(index);
46 let mods = dims.vocab_mods(ngram, split);
47 let ids = ctx
48 .iter()
49 .enumerate()
50 .map(|(pos, &x)| {
51 let mut acc = x as u64;
52 for (d, &m) in mods.iter().enumerate() {
53 acc += shifts[d][pos] as u64 * m;
54 }
55 acc % t
56 })
57 .collect();
58 out.push(ids);
59 }
60 }
61 out
62}