pub mod closure_key;
pub mod modular;
pub mod units;
pub use closure_key::ClosureKeyPrune;
pub use modular::{MOD_PRUNE_CELL_BUDGET, ModularPrune};
use std::sync::Arc;
use std::sync::Mutex;
#[derive(Clone, Default)]
pub struct Prunes {
pub mod_prune: Option<Arc<ModularPrune>>,
pub closure_key_prune: Option<Arc<ClosureKeyPrune>>,
}
static PRUNES: Mutex<Option<Prunes>> = Mutex::new(None);
pub fn snapshot_prunes() -> Prunes {
PRUNES.lock().unwrap().clone().unwrap_or_default()
}
pub fn install_mod_prune(ring: u8, max_steps: usize, moduli_override: Option<&[i64]>) {
let (units, phi) = units::unit_vectors_for_ring(ring);
let prune = ModularPrune::build(&units, phi, max_steps, moduli_override);
let cells = prune.cell_counts();
let summary: Vec<String> = prune
.moduli
.iter()
.zip(cells.iter())
.map(|(m, c)| format!("m={m} ({c} cells)"))
.collect();
eprintln!(
"mod-prune: ring={ring} phi={phi} max_steps={max_steps}: {}",
summary.join(", ")
);
let mut guard = PRUNES.lock().unwrap();
let mut current = guard.take().unwrap_or_default();
current.mod_prune = Some(Arc::new(prune));
*guard = Some(current);
}
pub fn install_closure_key_prune(ring: u8, max_l: usize) {
let t0 = std::time::Instant::now();
let keys = closure_key::collect_closure_keys_for_ring(ring, max_l);
eprintln!(
"closure-key-prune: ring={ring} max_l={max_l}: {} distinct keys collected in {:?}",
keys.len(),
t0.elapsed(),
);
let prune = ClosureKeyPrune { max_l, keys };
let mut guard = PRUNES.lock().unwrap();
let mut current = guard.take().unwrap_or_default();
current.closure_key_prune = Some(Arc::new(prune));
*guard = Some(current);
}