use miden_air::trace::{
AUX_TRACE_RAND_CHALLENGES, chiplets::hasher::HASH_CYCLE_LEN, range::B_RANGE_COL_IDX,
};
use miden_core::{ONE, ZERO, field::Field, operations::Operation};
use miden_utils_testing::rand::rand_array;
use super::{Felt, build_trace_from_ops};
#[test]
fn b_range_trace_stack() {
let stack = [1, 255];
let operations = vec![Operation::U32add];
let trace = build_trace_from_ops(operations, &stack);
let rand_elements = rand_array::<Felt, AUX_TRACE_RAND_CHALLENGES>();
let alpha = rand_elements[0];
let aux_columns = trace.build_aux_trace(&rand_elements).unwrap();
let b_range = aux_columns.get_column(B_RANGE_COL_IDX);
assert_eq!(trace.length(), b_range.len());
assert_eq!(ZERO, b_range[0]);
assert_eq!(ZERO, b_range[1]);
let lookups = alpha.inverse() * Felt::new(3) + (alpha + Felt::new(256)).inverse();
let mut expected = b_range[1] - lookups;
assert_eq!(expected, b_range[2]);
let len_16bit = 44 + 1;
let values_start = trace.length() - len_16bit;
assert_eq!(expected, b_range[values_start]);
expected += alpha.inverse() * Felt::new(3);
assert_eq!(expected, b_range[values_start + 1]);
assert_eq!(expected, b_range[values_start + 2]);
assert_eq!(expected, b_range[values_start + 3]);
assert_eq!(expected, b_range[values_start + 4]);
expected += (alpha + Felt::new(256)).inverse();
assert_eq!(expected, b_range[values_start + 5]);
let last_row = b_range.len() - 1;
assert_eq!(ZERO, b_range[last_row]);
}
#[test]
#[expect(clippy::needless_range_loop)]
fn b_range_trace_mem() {
let stack = [0, 1, 2, 3, 4, 0];
let mut operations = vec![
Operation::MStoreW,
Operation::Drop,
Operation::Drop,
Operation::Drop,
Operation::Drop,
Operation::MLoadW,
];
operations.resize(operations.len() + 60, Operation::Noop);
let trace = build_trace_from_ops(operations, &stack);
let rand_elements = rand_array::<Felt, AUX_TRACE_RAND_CHALLENGES>();
let alpha = rand_elements[0];
let aux_columns = trace.build_aux_trace(&rand_elements).unwrap();
let b_range = aux_columns.get_column(B_RANGE_COL_IDX);
assert_eq!(trace.length(), b_range.len());
let memory_start = HASH_CYCLE_LEN;
let len_16bit = 40 + 1;
let values_start = trace.length() - len_16bit;
let mut expected = ZERO;
assert_eq!(expected, b_range[0]);
let (d0_store, d1_store) = (ONE, ZERO);
let (d0_load, d1_load) = (Felt::new(5), ZERO);
expected -= (alpha + d0_store).inverse() + (alpha + d1_store).inverse();
assert_eq!(expected, b_range[memory_start + 1]);
expected -= (alpha + d0_load).inverse() + (alpha + d1_load).inverse();
assert_eq!(expected, b_range[memory_start + 2]);
expected += alpha.inverse() * Felt::new(2);
assert_eq!(expected, b_range[values_start + 1]);
expected += (alpha + d0_store).inverse();
assert_eq!(expected, b_range[values_start + 2]);
assert_eq!(expected, b_range[values_start + 3]);
expected += (alpha + d0_load).inverse();
assert_eq!(expected, b_range[values_start + 4]);
assert_eq!(expected, ZERO);
for i in (values_start + 4)..(b_range.len()) {
assert_eq!(ZERO, b_range[i]);
}
}