use vyre_primitives::parsing::planar_rewrite::planar_rewrite_schedule_cpu;
#[must_use]
pub fn schedule_disjoint_rewrites(candidates: &[u32], h: u32, w: u32, k: u32) -> Vec<u32> {
use crate::observability::{bump, planar_rewrite_pass_scheduler_calls};
bump(&planar_rewrite_pass_scheduler_calls);
assert!(k > 0, "Fix: rewrite footprint k must be > 0.");
planar_rewrite_schedule_cpu(candidates, h, w, k)
}
#[must_use]
pub fn count_scheduled(schedule: &[u32]) -> u32 {
schedule.iter().filter(|&&v| v != 0).count() as u32
}
#[must_use]
pub fn batch_reduction_ratio(candidate_count: u32, scheduled_count: u32) -> f64 {
if scheduled_count == 0 {
return 0.0;
}
candidate_count as f64 / scheduled_count as f64
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_grid_yields_no_schedule() {
let candidates = vec![0u32; 16];
let schedule = schedule_disjoint_rewrites(&candidates, 4, 4, 2);
assert_eq!(count_scheduled(&schedule), 0);
}
#[test]
fn full_grid_yields_disjoint_subset() {
let candidates = vec![1u32; 16];
let schedule = schedule_disjoint_rewrites(&candidates, 4, 4, 2);
let count = count_scheduled(&schedule);
assert!(count >= 1, "at least one rewrite must be schedulable");
assert!(count <= 4, "at most 4 disjoint k=2 rewrites in a 4x4 grid");
}
#[test]
fn batch_reduction_well_defined() {
assert_eq!(batch_reduction_ratio(0, 0), 0.0);
let r = batch_reduction_ratio(100, 4);
assert!((r - 25.0).abs() < 1e-9);
}
#[test]
fn k_one_allows_every_candidate() {
let candidates = vec![1u32, 1, 1, 1];
let schedule = schedule_disjoint_rewrites(&candidates, 2, 2, 1);
assert_eq!(count_scheduled(&schedule), 4);
}
}