pub fn morton_encode(coords: &[u16], bits_per_dim: u8) -> u128 {
let num_dims = coords.len();
let total_bits = (bits_per_dim as usize) * num_dims;
assert!(
total_bits <= 128,
"Morton code exceeds 128 bits: {} dims × {} bits = {} bits",
num_dims,
bits_per_dim,
total_bits
);
let mut result: u128 = 0;
for bit_idx in 0..bits_per_dim {
for (dim_idx, &coord) in coords.iter().enumerate() {
let bit = (coord >> bit_idx) & 1;
let pos = (bit_idx as usize) * num_dims + dim_idx;
result |= (bit as u128) << pos;
}
}
result
}
pub fn morton_decode(code: u128, num_dims: u8, bits_per_dim: u8) -> Vec<u16> {
let num_dims = num_dims as usize;
let total_bits = bits_per_dim as usize * num_dims;
assert!(
total_bits <= 128,
"Morton code exceeds 128 bits: {} dims × {} bits = {} bits",
num_dims,
bits_per_dim,
total_bits
);
let mut result = vec![0u16; num_dims];
for bit_pos in 0..total_bits {
let dim_idx = bit_pos % num_dims;
let bit_idx = bit_pos / num_dims;
let bit = (code >> bit_pos) & 1;
result[dim_idx] |= (bit as u16) << bit_idx;
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_morton_encode_2d_simple() {
let coords = vec![5, 3];
let code = morton_encode(&coords, 3);
assert_eq!(
code, 27,
"Expected 27 (0b{:06b}), got {} (0b{:06b})",
27, code, code
);
}
#[test]
fn test_morton_encode_2d_zeros() {
let coords = vec![0, 0];
let code = morton_encode(&coords, 3);
assert_eq!(code, 0);
}
#[test]
fn test_morton_encode_2d_max_values() {
let coords = vec![7, 7];
let code = morton_encode(&coords, 3);
assert_eq!(code, 0b111111);
}
#[test]
fn test_morton_encode_3d() {
let coords = vec![1, 2, 3];
let code = morton_encode(&coords, 2);
assert_eq!(code, 53);
}
#[test]
fn test_morton_encode_10d() {
let coords = vec![512, 256, 128, 64, 32, 16, 8, 4, 2, 1];
let code = morton_encode(&coords, 10);
assert!(code > 0, "Code should be non-zero");
const _: () = assert!(10 * 10 <= 128, "Should fit in u128");
}
#[test]
fn test_morton_decode_2d_simple() {
let code = 27; let coords = morton_decode(code, 2, 3);
assert_eq!(coords, vec![5, 3]);
}
#[test]
fn test_morton_decode_2d_zeros() {
let code = 0;
let coords = morton_decode(code, 2, 3);
assert_eq!(coords, vec![0, 0]);
}
#[test]
fn test_morton_decode_3d() {
let code = 53; let coords = morton_decode(code, 3, 2);
assert_eq!(coords, vec![1, 2, 3]);
}
#[test]
fn test_roundtrip_2d() {
let original = vec![5, 3];
let encoded = morton_encode(&original, 3);
let decoded = morton_decode(encoded, 2, 3);
assert_eq!(decoded, original);
}
#[test]
fn test_roundtrip_3d() {
let original = vec![7, 5, 3];
let encoded = morton_encode(&original, 4);
let decoded = morton_decode(encoded, 3, 4);
assert_eq!(decoded, original);
}
#[test]
fn test_roundtrip_10d() {
let original = vec![512, 256, 128, 64, 32, 16, 8, 4, 2, 1];
let encoded = morton_encode(&original, 10);
let decoded = morton_decode(encoded, 10, 10);
assert_eq!(decoded, original);
}
#[test]
fn test_roundtrip_max_dimensions() {
let original = vec![1; 12];
let encoded = morton_encode(&original, 10);
let decoded = morton_decode(encoded, 12, 10);
assert_eq!(decoded, original);
}
#[test]
fn test_roundtrip_all_zeros() {
let original = vec![0; 10];
let encoded = morton_encode(&original, 10);
let decoded = morton_decode(encoded, 10, 10);
assert_eq!(decoded, original);
}
#[test]
fn test_roundtrip_all_max() {
let original = vec![1023; 10];
let encoded = morton_encode(&original, 10);
let decoded = morton_decode(encoded, 10, 10);
assert_eq!(decoded, original);
}
#[test]
fn test_single_dimension() {
let original = vec![42];
let encoded = morton_encode(&original, 8);
let decoded = morton_decode(encoded, 1, 8);
assert_eq!(decoded, original);
assert_eq!(encoded, 42); }
#[test]
fn test_one_bit_per_dimension() {
let original = vec![1, 0, 1, 0];
let encoded = morton_encode(&original, 1);
let decoded = morton_decode(encoded, 4, 1);
assert_eq!(decoded, original);
}
#[test]
#[should_panic(expected = "Morton code exceeds 128 bits")]
fn test_encode_exceeds_128_bits() {
let coords = vec![1; 10];
morton_encode(&coords, 13);
}
#[test]
#[should_panic(expected = "Morton code exceeds 128 bits")]
fn test_decode_exceeds_128_bits() {
morton_decode(0, 10, 13);
}
#[test]
fn test_known_value_2d_simple() {
let coords = vec![2, 3];
let code = morton_encode(&coords, 2);
assert_eq!(code, 14);
let decoded = morton_decode(14, 2, 2);
assert_eq!(decoded, vec![2, 3]);
}
#[test]
fn test_known_value_3d() {
let coords = vec![4, 2, 1];
let code = morton_encode(&coords, 3);
assert_eq!(code, 84);
let decoded = morton_decode(84, 3, 3);
assert_eq!(decoded, vec![4, 2, 1]);
}
#[test]
fn test_locality_adjacent_x() {
let p1 = vec![10, 5];
let p2 = vec![11, 5];
let code1 = morton_encode(&p1, 10);
let code2 = morton_encode(&p2, 10);
let diff = code1 ^ code2;
assert!(diff > 0, "Codes should be different");
let hamming = diff.count_ones();
assert!(
hamming < 10,
"Adjacent points should have low Hamming distance"
);
}
#[test]
fn test_locality_adjacent_y() {
let p1 = vec![5, 10];
let p2 = vec![5, 11];
let code1 = morton_encode(&p1, 10);
let code2 = morton_encode(&p2, 10);
let diff = code1 ^ code2;
assert!(diff > 0, "Codes should be different");
let hamming = diff.count_ones();
assert!(
hamming < 10,
"Adjacent points should have low Hamming distance"
);
}
#[test]
fn test_locality_diagonal() {
let p1 = vec![10, 10];
let p2 = vec![11, 11];
let code1 = morton_encode(&p1, 10);
let code2 = morton_encode(&p2, 10);
let diff = code1 ^ code2;
let hamming = diff.count_ones();
assert!(
hamming < 15,
"Diagonal neighbors should have reasonable locality"
);
}
#[test]
fn test_locality_far_apart() {
let p1 = vec![0, 0];
let p2 = vec![1023, 1023];
let code1 = morton_encode(&p1, 10);
let code2 = morton_encode(&p2, 10);
let diff = code1 ^ code2;
let hamming = diff.count_ones();
assert!(
hamming > 10,
"Distant points should have high Hamming distance"
);
}
#[test]
fn test_various_dimensions() {
for dims in 2..=10 {
let coords = vec![100; dims];
let encoded = morton_encode(&coords, 10);
let decoded = morton_decode(encoded, dims as u8, 10);
assert_eq!(decoded, coords, "Roundtrip failed for {} dimensions", dims);
}
}
#[test]
fn test_2d_comprehensive() {
let test_cases = vec![
(vec![0, 0], 1),
(vec![1, 0], 2),
(vec![0, 1], 2),
(vec![1, 1], 2),
(vec![2, 2], 2),
(vec![3, 3], 2),
(vec![15, 15], 4),
(vec![255, 255], 8),
];
for (coords, bits) in test_cases {
let code = morton_encode(&coords, bits);
let decoded = morton_decode(code, 2, bits);
assert_eq!(decoded, coords, "Roundtrip failed for {:?}", coords);
}
}
#[test]
fn test_encoding_deterministic() {
let coords = vec![512, 256, 128, 64, 32];
let code1 = morton_encode(&coords, 10);
let code2 = morton_encode(&coords, 10);
assert_eq!(code1, code2, "Encoding should be deterministic");
}
#[test]
fn test_bit_pattern_correctness() {
let coords = vec![0b11, 0b10]; let code = morton_encode(&coords, 2);
assert_eq!(code, 13);
}
}