use uor_matmul_core::{Alphabet, Bound, IntegerElement};
use crate::codecs::Book;
pub const ENTRIES: usize = 256;
pub const BLOCK: usize = 8;
pub static E8_I8: [[i8; BLOCK]; ENTRIES] = [
[0, 0, 0, 0, 0, 0, 0, 0],
[-32, -32, 0, 0, 0, 0, 0, 0],
[-32, 0, -32, 0, 0, 0, 0, 0],
[-32, 0, 0, -32, 0, 0, 0, 0],
[-32, 0, 0, 0, -32, 0, 0, 0],
[-32, 0, 0, 0, 0, -32, 0, 0],
[-32, 0, 0, 0, 0, 0, -32, 0],
[-32, 0, 0, 0, 0, 0, 0, -32],
[-32, 0, 0, 0, 0, 0, 0, 32],
[-32, 0, 0, 0, 0, 0, 32, 0],
[-32, 0, 0, 0, 0, 32, 0, 0],
[-32, 0, 0, 0, 32, 0, 0, 0],
[-32, 0, 0, 32, 0, 0, 0, 0],
[-32, 0, 32, 0, 0, 0, 0, 0],
[-32, 32, 0, 0, 0, 0, 0, 0],
[-16, -16, -16, -16, -16, -16, -16, -16],
[-16, -16, -16, -16, -16, -16, 16, 16],
[-16, -16, -16, -16, -16, 16, -16, 16],
[-16, -16, -16, -16, -16, 16, 16, -16],
[-16, -16, -16, -16, 16, -16, -16, 16],
[-16, -16, -16, -16, 16, -16, 16, -16],
[-16, -16, -16, -16, 16, 16, -16, -16],
[-16, -16, -16, -16, 16, 16, 16, 16],
[-16, -16, -16, 16, -16, -16, -16, 16],
[-16, -16, -16, 16, -16, -16, 16, -16],
[-16, -16, -16, 16, -16, 16, -16, -16],
[-16, -16, -16, 16, -16, 16, 16, 16],
[-16, -16, -16, 16, 16, -16, -16, -16],
[-16, -16, -16, 16, 16, -16, 16, 16],
[-16, -16, -16, 16, 16, 16, -16, 16],
[-16, -16, -16, 16, 16, 16, 16, -16],
[-16, -16, 16, -16, -16, -16, -16, 16],
[-16, -16, 16, -16, -16, -16, 16, -16],
[-16, -16, 16, -16, -16, 16, -16, -16],
[-16, -16, 16, -16, -16, 16, 16, 16],
[-16, -16, 16, -16, 16, -16, -16, -16],
[-16, -16, 16, -16, 16, -16, 16, 16],
[-16, -16, 16, -16, 16, 16, -16, 16],
[-16, -16, 16, -16, 16, 16, 16, -16],
[-16, -16, 16, 16, -16, -16, -16, -16],
[-16, -16, 16, 16, -16, -16, 16, 16],
[-16, -16, 16, 16, -16, 16, -16, 16],
[-16, -16, 16, 16, -16, 16, 16, -16],
[-16, -16, 16, 16, 16, -16, -16, 16],
[-16, -16, 16, 16, 16, -16, 16, -16],
[-16, -16, 16, 16, 16, 16, -16, -16],
[-16, -16, 16, 16, 16, 16, 16, 16],
[-16, 16, -16, -16, -16, -16, -16, 16],
[-16, 16, -16, -16, -16, -16, 16, -16],
[-16, 16, -16, -16, -16, 16, -16, -16],
[-16, 16, -16, -16, -16, 16, 16, 16],
[-16, 16, -16, -16, 16, -16, -16, -16],
[-16, 16, -16, -16, 16, -16, 16, 16],
[-16, 16, -16, -16, 16, 16, -16, 16],
[-16, 16, -16, -16, 16, 16, 16, -16],
[-16, 16, -16, 16, -16, -16, -16, -16],
[-16, 16, -16, 16, -16, -16, 16, 16],
[-16, 16, -16, 16, -16, 16, -16, 16],
[-16, 16, -16, 16, -16, 16, 16, -16],
[-16, 16, -16, 16, 16, -16, -16, 16],
[-16, 16, -16, 16, 16, -16, 16, -16],
[-16, 16, -16, 16, 16, 16, -16, -16],
[-16, 16, -16, 16, 16, 16, 16, 16],
[-16, 16, 16, -16, -16, -16, -16, -16],
[-16, 16, 16, -16, -16, -16, 16, 16],
[-16, 16, 16, -16, -16, 16, -16, 16],
[-16, 16, 16, -16, -16, 16, 16, -16],
[-16, 16, 16, -16, 16, -16, -16, 16],
[-16, 16, 16, -16, 16, -16, 16, -16],
[-16, 16, 16, -16, 16, 16, -16, -16],
[-16, 16, 16, -16, 16, 16, 16, 16],
[-16, 16, 16, 16, -16, -16, -16, 16],
[-16, 16, 16, 16, -16, -16, 16, -16],
[-16, 16, 16, 16, -16, 16, -16, -16],
[-16, 16, 16, 16, -16, 16, 16, 16],
[-16, 16, 16, 16, 16, -16, -16, -16],
[-16, 16, 16, 16, 16, -16, 16, 16],
[-16, 16, 16, 16, 16, 16, -16, 16],
[-16, 16, 16, 16, 16, 16, 16, -16],
[0, -32, -32, 0, 0, 0, 0, 0],
[0, -32, 0, -32, 0, 0, 0, 0],
[0, -32, 0, 0, -32, 0, 0, 0],
[0, -32, 0, 0, 0, -32, 0, 0],
[0, -32, 0, 0, 0, 0, -32, 0],
[0, -32, 0, 0, 0, 0, 0, -32],
[0, -32, 0, 0, 0, 0, 0, 32],
[0, -32, 0, 0, 0, 0, 32, 0],
[0, -32, 0, 0, 0, 32, 0, 0],
[0, -32, 0, 0, 32, 0, 0, 0],
[0, -32, 0, 32, 0, 0, 0, 0],
[0, -32, 32, 0, 0, 0, 0, 0],
[0, 0, -32, -32, 0, 0, 0, 0],
[0, 0, -32, 0, -32, 0, 0, 0],
[0, 0, -32, 0, 0, -32, 0, 0],
[0, 0, -32, 0, 0, 0, -32, 0],
[0, 0, -32, 0, 0, 0, 0, -32],
[0, 0, -32, 0, 0, 0, 0, 32],
[0, 0, -32, 0, 0, 0, 32, 0],
[0, 0, -32, 0, 0, 32, 0, 0],
[0, 0, -32, 0, 32, 0, 0, 0],
[0, 0, -32, 32, 0, 0, 0, 0],
[0, 0, 0, -32, -32, 0, 0, 0],
[0, 0, 0, -32, 0, -32, 0, 0],
[0, 0, 0, -32, 0, 0, -32, 0],
[0, 0, 0, -32, 0, 0, 0, -32],
[0, 0, 0, -32, 0, 0, 0, 32],
[0, 0, 0, -32, 0, 0, 32, 0],
[0, 0, 0, -32, 0, 32, 0, 0],
[0, 0, 0, -32, 32, 0, 0, 0],
[0, 0, 0, 0, -32, -32, 0, 0],
[0, 0, 0, 0, -32, 0, -32, 0],
[0, 0, 0, 0, -32, 0, 0, -32],
[0, 0, 0, 0, -32, 0, 0, 32],
[0, 0, 0, 0, -32, 0, 32, 0],
[0, 0, 0, 0, -32, 32, 0, 0],
[0, 0, 0, 0, 0, -32, -32, 0],
[0, 0, 0, 0, 0, -32, 0, -32],
[0, 0, 0, 0, 0, -32, 0, 32],
[0, 0, 0, 0, 0, -32, 32, 0],
[0, 0, 0, 0, 0, 0, -32, -32],
[0, 0, 0, 0, 0, 0, -32, 32],
[0, 0, 0, 0, 0, 0, 32, -32],
[0, 0, 0, 0, 0, 0, 32, 32],
[0, 0, 0, 0, 0, 32, -32, 0],
[0, 0, 0, 0, 0, 32, 0, -32],
[0, 0, 0, 0, 0, 32, 0, 32],
[0, 0, 0, 0, 0, 32, 32, 0],
[0, 0, 0, 0, 32, -32, 0, 0],
[0, 0, 0, 0, 32, 0, -32, 0],
[0, 0, 0, 0, 32, 0, 0, -32],
[0, 0, 0, 0, 32, 0, 0, 32],
[0, 0, 0, 0, 32, 0, 32, 0],
[0, 0, 0, 0, 32, 32, 0, 0],
[0, 0, 0, 32, -32, 0, 0, 0],
[0, 0, 0, 32, 0, -32, 0, 0],
[0, 0, 0, 32, 0, 0, -32, 0],
[0, 0, 0, 32, 0, 0, 0, -32],
[0, 0, 0, 32, 0, 0, 0, 32],
[0, 0, 0, 32, 0, 0, 32, 0],
[0, 0, 0, 32, 0, 32, 0, 0],
[0, 0, 0, 32, 32, 0, 0, 0],
[0, 0, 32, -32, 0, 0, 0, 0],
[0, 0, 32, 0, -32, 0, 0, 0],
[0, 0, 32, 0, 0, -32, 0, 0],
[0, 0, 32, 0, 0, 0, -32, 0],
[0, 0, 32, 0, 0, 0, 0, -32],
[0, 0, 32, 0, 0, 0, 0, 32],
[0, 0, 32, 0, 0, 0, 32, 0],
[0, 0, 32, 0, 0, 32, 0, 0],
[0, 0, 32, 0, 32, 0, 0, 0],
[0, 0, 32, 32, 0, 0, 0, 0],
[0, 32, -32, 0, 0, 0, 0, 0],
[0, 32, 0, -32, 0, 0, 0, 0],
[0, 32, 0, 0, -32, 0, 0, 0],
[0, 32, 0, 0, 0, -32, 0, 0],
[0, 32, 0, 0, 0, 0, -32, 0],
[0, 32, 0, 0, 0, 0, 0, -32],
[0, 32, 0, 0, 0, 0, 0, 32],
[0, 32, 0, 0, 0, 0, 32, 0],
[0, 32, 0, 0, 0, 32, 0, 0],
[0, 32, 0, 0, 32, 0, 0, 0],
[0, 32, 0, 32, 0, 0, 0, 0],
[0, 32, 32, 0, 0, 0, 0, 0],
[16, -16, -16, -16, -16, -16, -16, 16],
[16, -16, -16, -16, -16, -16, 16, -16],
[16, -16, -16, -16, -16, 16, -16, -16],
[16, -16, -16, -16, -16, 16, 16, 16],
[16, -16, -16, -16, 16, -16, -16, -16],
[16, -16, -16, -16, 16, -16, 16, 16],
[16, -16, -16, -16, 16, 16, -16, 16],
[16, -16, -16, -16, 16, 16, 16, -16],
[16, -16, -16, 16, -16, -16, -16, -16],
[16, -16, -16, 16, -16, -16, 16, 16],
[16, -16, -16, 16, -16, 16, -16, 16],
[16, -16, -16, 16, -16, 16, 16, -16],
[16, -16, -16, 16, 16, -16, -16, 16],
[16, -16, -16, 16, 16, -16, 16, -16],
[16, -16, -16, 16, 16, 16, -16, -16],
[16, -16, -16, 16, 16, 16, 16, 16],
[16, -16, 16, -16, -16, -16, -16, -16],
[16, -16, 16, -16, -16, -16, 16, 16],
[16, -16, 16, -16, -16, 16, -16, 16],
[16, -16, 16, -16, -16, 16, 16, -16],
[16, -16, 16, -16, 16, -16, -16, 16],
[16, -16, 16, -16, 16, -16, 16, -16],
[16, -16, 16, -16, 16, 16, -16, -16],
[16, -16, 16, -16, 16, 16, 16, 16],
[16, -16, 16, 16, -16, -16, -16, 16],
[16, -16, 16, 16, -16, -16, 16, -16],
[16, -16, 16, 16, -16, 16, -16, -16],
[16, -16, 16, 16, -16, 16, 16, 16],
[16, -16, 16, 16, 16, -16, -16, -16],
[16, -16, 16, 16, 16, -16, 16, 16],
[16, -16, 16, 16, 16, 16, -16, 16],
[16, -16, 16, 16, 16, 16, 16, -16],
[16, 16, -16, -16, -16, -16, -16, -16],
[16, 16, -16, -16, -16, -16, 16, 16],
[16, 16, -16, -16, -16, 16, -16, 16],
[16, 16, -16, -16, -16, 16, 16, -16],
[16, 16, -16, -16, 16, -16, -16, 16],
[16, 16, -16, -16, 16, -16, 16, -16],
[16, 16, -16, -16, 16, 16, -16, -16],
[16, 16, -16, -16, 16, 16, 16, 16],
[16, 16, -16, 16, -16, -16, -16, 16],
[16, 16, -16, 16, -16, -16, 16, -16],
[16, 16, -16, 16, -16, 16, -16, -16],
[16, 16, -16, 16, -16, 16, 16, 16],
[16, 16, -16, 16, 16, -16, -16, -16],
[16, 16, -16, 16, 16, -16, 16, 16],
[16, 16, -16, 16, 16, 16, -16, 16],
[16, 16, -16, 16, 16, 16, 16, -16],
[16, 16, 16, -16, -16, -16, -16, 16],
[16, 16, 16, -16, -16, -16, 16, -16],
[16, 16, 16, -16, -16, 16, -16, -16],
[16, 16, 16, -16, -16, 16, 16, 16],
[16, 16, 16, -16, 16, -16, -16, -16],
[16, 16, 16, -16, 16, -16, 16, 16],
[16, 16, 16, -16, 16, 16, -16, 16],
[16, 16, 16, -16, 16, 16, 16, -16],
[16, 16, 16, 16, -16, -16, -16, -16],
[16, 16, 16, 16, -16, -16, 16, 16],
[16, 16, 16, 16, -16, 16, -16, 16],
[16, 16, 16, 16, -16, 16, 16, -16],
[16, 16, 16, 16, 16, -16, -16, 16],
[16, 16, 16, 16, 16, -16, 16, -16],
[16, 16, 16, 16, 16, 16, -16, -16],
[16, 16, 16, 16, 16, 16, 16, 16],
[32, -32, 0, 0, 0, 0, 0, 0],
[32, 0, -32, 0, 0, 0, 0, 0],
[32, 0, 0, -32, 0, 0, 0, 0],
[32, 0, 0, 0, -32, 0, 0, 0],
[32, 0, 0, 0, 0, -32, 0, 0],
[32, 0, 0, 0, 0, 0, -32, 0],
[32, 0, 0, 0, 0, 0, 0, -32],
[32, 0, 0, 0, 0, 0, 0, 32],
[32, 0, 0, 0, 0, 0, 32, 0],
[32, 0, 0, 0, 0, 32, 0, 0],
[32, 0, 0, 0, 32, 0, 0, 0],
[32, 0, 0, 32, 0, 0, 0, 0],
[32, 0, 32, 0, 0, 0, 0, 0],
[32, 32, 0, 0, 0, 0, 0, 0],
[-32, -32, -32, -32, 0, 0, 0, 0],
[-32, -32, -32, 0, -32, 0, 0, 0],
[-32, -32, -32, 0, 0, -32, 0, 0],
[-32, -32, -32, 0, 0, 0, -32, 0],
[-32, -32, -32, 0, 0, 0, 0, -32],
[-32, -32, -32, 0, 0, 0, 0, 32],
[-32, -32, -32, 0, 0, 0, 32, 0],
[-32, -32, -32, 0, 0, 32, 0, 0],
[-32, -32, -32, 0, 32, 0, 0, 0],
[-32, -32, -32, 32, 0, 0, 0, 0],
[-32, -32, 0, -32, -32, 0, 0, 0],
[-32, -32, 0, -32, 0, -32, 0, 0],
[-32, -32, 0, -32, 0, 0, -32, 0],
[-32, -32, 0, -32, 0, 0, 0, -32],
[-32, -32, 0, -32, 0, 0, 0, 32],
];
pub fn e8_table<Bd: Bound>() -> Option<[[Alphabet<i8, Bd>; BLOCK]; ENTRIES]> {
let mut out = [[Alphabet::ZERO; BLOCK]; ENTRIES];
for (entry, row) in E8_I8.iter().zip(out.iter_mut()) {
for (v, slot) in entry.iter().zip(row.iter_mut()) {
if v.magnitude() > Bd::VALUE {
return None;
}
*slot = Alphabet::new(*v).ok()?;
}
}
Some(out)
}
pub fn e8_codec<Bd: Bound>(
table: &[[Alphabet<i8, Bd>; BLOCK]; ENTRIES],
) -> Book<'_, i8, Bd, ENTRIES, BLOCK> {
Book::new(table)
}
pub fn e8_codec_u8<Bd: Bound>(
table: &[[Alphabet<i8, Bd>; BLOCK]; ENTRIES],
) -> Book<'_, i8, Bd, ENTRIES, BLOCK, u8> {
Book::new(table)
}
#[cfg(test)]
mod tests {
use super::*;
use uor_matmul_core::Full;
#[test]
fn e8_is_the_lattice_it_claims() {
assert_eq!(E8_I8.len(), ENTRIES);
assert_eq!(E8_I8[0], [0i8; BLOCK]);
for (i, w) in E8_I8.iter().enumerate().skip(1) {
let all_32 = w.iter().all(|v| v % 32 == 0);
let all_16 = w.iter().all(|v| v % 32 == 16 || v % 32 == -16);
assert!(all_32 || all_16, "codeword {i} is in neither coset: {w:?}");
if all_32 {
let sum: i32 = w.iter().map(|&v| v as i32 / 32).sum();
assert_eq!(sum % 2, 0, "codeword {i} has an odd coordinate sum");
}
}
let mut seen = E8_I8;
seen.sort_unstable();
for pair in seen.windows(2) {
assert_ne!(
pair[0], pair[1],
"the codebook has a duplicate: {:?}",
pair[0]
);
}
assert_eq!(core::mem::size_of_val(&E8_I8), 2048);
}
#[test]
fn a_bound_too_narrow_has_no_table() {
assert!(e8_table::<Full<i8>>().is_some());
assert!(e8_table::<uor_matmul_core::Bnd<8>>().is_none());
}
}