#![cfg(feature = "math")]
use vyre_primitives::math::fmm::{l2p_zeroth_f32_step, m2l_zeroth_f32_step, p2m_zeroth_f32_step};
use vyre_primitives::wire::{
decode_f32_le_bytes_all as unpack_f32, pack_f32_slice as pack_f32, pack_u32_slice as pack_u32,
};
use vyre_reference::value::Value;
#[track_caller]
fn assert_f32_close(got: &[f32], exp: &[f32], ctx: &str) {
assert_eq!(
got.len(),
exp.len(),
"{ctx}: length mismatch got={} exp={}",
got.len(),
exp.len()
);
for (i, (g, e)) in got.iter().zip(exp.iter()).enumerate() {
assert!(
(g - e).abs() <= 1e-4,
"{ctx}: lane {i} got={g} exp={e} (full got={got:?} exp={exp:?})"
);
}
}
#[test]
fn p2m_scatters_scores_into_owning_cells() {
let n_regions = 5u32;
let n_cells = 3u32;
let scores = [1.0f32, 2.0, 4.0, 8.0, 16.0];
let cell_assignment = [0u32, 1, 0, 2, 1];
let expected = [5.0f32, 18.0, 8.0];
let program = p2m_zeroth_f32_step("scores", "cells", "moments", n_regions, n_cells);
let outputs = vyre_reference::reference_eval(
&program,
&[
Value::from(pack_f32(&scores)),
Value::from(pack_u32(&cell_assignment)),
Value::from(pack_f32(&vec![0.0f32; n_cells as usize])),
],
)
.expect("p2m reference evaluation must succeed");
assert_f32_close(&unpack_f32(&outputs[0].to_bytes()), &expected, "p2m");
}
#[test]
fn p2m_drops_out_of_range_cell_assignment() {
let n_regions = 5u32;
let n_cells = 3u32;
let scores = [1.0f32, 2.0, 4.0, 8.0, 16.0];
let cell_assignment = [0u32, 1, 0, 2, 5];
let expected = [5.0f32, 2.0, 8.0];
let program = p2m_zeroth_f32_step("scores", "cells", "moments", n_regions, n_cells);
let outputs = vyre_reference::reference_eval(
&program,
&[
Value::from(pack_f32(&scores)),
Value::from(pack_u32(&cell_assignment)),
Value::from(pack_f32(&vec![0.0f32; n_cells as usize])),
],
)
.expect("p2m reference evaluation must succeed");
assert_f32_close(
&unpack_f32(&outputs[0].to_bytes()),
&expected,
"p2m out-of-range assignment dropped",
);
}
#[test]
fn m2l_translates_moments_by_inverse_distance() {
let n_cells = 3u32;
let cell_moments = [2.0f32, 4.0, 8.0];
let cell_distances = [
1.0f32, 2.0, 4.0, 1.0, 1.0, 8.0, 2.0, 4.0, 1.0, ];
let expected = [4.0f32, 3.0, 2.0];
let program = m2l_zeroth_f32_step("moments", "dist", "local", n_cells);
let outputs = vyre_reference::reference_eval(
&program,
&[
Value::from(pack_f32(&cell_moments)),
Value::from(pack_f32(&cell_distances)),
Value::from(pack_f32(&vec![0.0f32; n_cells as usize])),
],
)
.expect("m2l reference evaluation must succeed");
assert_f32_close(&unpack_f32(&outputs[0].to_bytes()), &expected, "m2l");
}
#[test]
fn l2p_broadcasts_cell_local_to_assigned_regions() {
let n_regions = 4u32;
let n_cells = 3u32;
let cell_local = [10.0f32, 20.0, 30.0];
let cell_assignment = [2u32, 0, 1, 0];
let expected = [30.0f32, 10.0, 20.0, 10.0];
let program = l2p_zeroth_f32_step("local", "cells", "out", n_regions, n_cells);
let outputs = vyre_reference::reference_eval(
&program,
&[
Value::from(pack_f32(&cell_local)),
Value::from(pack_u32(&cell_assignment)),
Value::from(pack_f32(&vec![0.0f32; n_regions as usize])),
],
)
.expect("l2p reference evaluation must succeed");
assert_f32_close(&unpack_f32(&outputs[0].to_bytes()), &expected, "l2p");
}
#[test]
fn l2p_skips_out_of_range_cell_assignment() {
let n_regions = 4u32;
let n_cells = 3u32;
let cell_local = [10.0f32, 20.0, 30.0];
let cell_assignment = [2u32, 0, 5, 0];
let expected = [30.0f32, 10.0, 0.0, 10.0];
let program = l2p_zeroth_f32_step("local", "cells", "out", n_regions, n_cells);
let outputs = vyre_reference::reference_eval(
&program,
&[
Value::from(pack_f32(&cell_local)),
Value::from(pack_u32(&cell_assignment)),
Value::from(pack_f32(&vec![0.0f32; n_regions as usize])),
],
)
.expect("l2p reference evaluation must succeed");
assert_f32_close(
&unpack_f32(&outputs[0].to_bytes()),
&expected,
"l2p out-of-range assignment skipped",
);
}