#[must_use]
#[deprecated(
note = "reference oracle only; production code must dispatch the Weir Program on a concrete GPU backend or use weir::oracle for parity evidence"
)]
pub(crate) fn loop_summarize_cpu(cfg_in: &[u32], ranges_in: &[u32], var_count: u32) -> Vec<u32> {
let vars = loop_sum_u32_to_usize(var_count, "variable count");
let slots = vars.checked_mul(2).unwrap_or_else(|| {
panic!(
"loop_summarize CPU oracle var_count={var_count} overflows host slot indexing. Fix: shard the oracle input."
)
});
if cfg_in.len() != slots || ranges_in.len() != slots {
panic!(
"loop_summarize CPU oracle received malformed interval buffers: expected {slots} words, got cfg_in={} ranges_in={}",
cfg_in.len(),
ranges_in.len()
);
}
let mut out = vec![0; slots];
for var in 0..vars {
let lo_idx = var * 2;
let hi_idx = lo_idx + 1;
let prev_lo = cfg_in[lo_idx];
let prev_hi = cfg_in[hi_idx];
let new_lo = ranges_in[lo_idx];
let new_hi = ranges_in[hi_idx];
out[lo_idx] = if new_lo < prev_lo { 0 } else { prev_lo };
out[hi_idx] = if prev_hi < new_hi { u32::MAX } else { prev_hi };
}
out
}
fn loop_sum_u32_to_usize(value: u32, label: &'static str) -> usize {
usize::try_from(value).unwrap_or_else(|source| {
panic!(
"loop_summarize CPU oracle {label} value {value} cannot fit usize: {source}. Fix: shard the oracle input."
)
})
}
#[cfg(test)]
#[allow(deprecated)]
mod tests {
use super::loop_summarize_cpu;
#[test]
#[should_panic(expected = "loop_summarize CPU oracle received malformed interval buffers")]
fn loop_summarize_rejects_mismatched_cfg_len() {
let _ = loop_summarize_cpu(&[1, 2], &[1, 2, 3, 4], 2);
}
#[test]
#[should_panic(expected = "loop_summarize CPU oracle received malformed interval buffers")]
fn loop_summarize_rejects_mismatched_ranges_len() {
let _ = loop_summarize_cpu(&[1, 2, 3, 4], &[1, 2], 2);
}
}