Game::likelihoods now uses VarStore (for diff vars) and TruncFactor (for EP truncation + evidence caching) instead of TeamMessage and DiffMessage. The EP loop structure is preserved exactly; VarId-keyed diff vars live in the arena's VarStore (capacity reused per batch). ScratchArena loses teams/diffs/ties/margins; gains VarStore and sort_buf (sort_perm allocation eliminated). message.rs deleted. Public API of Game (new, posteriors, likelihoods, evidence) unchanged.
44 lines
1.1 KiB
Rust
44 lines
1.1 KiB
Rust
use crate::factor::VarStore;
|
|
|
|
/// Reusable scratch buffers for `Game::likelihoods`.
|
|
///
|
|
/// A `Batch` owns one arena; all events in the slice share it across
|
|
/// the convergence iterations.
|
|
#[derive(Debug, Default)]
|
|
pub struct ScratchArena {
|
|
pub(crate) vars: VarStore,
|
|
pub(crate) sort_buf: Vec<usize>,
|
|
}
|
|
|
|
impl ScratchArena {
|
|
pub fn new() -> Self {
|
|
Self::default()
|
|
}
|
|
|
|
#[inline]
|
|
pub(crate) fn reset(&mut self) {
|
|
self.vars.clear();
|
|
self.sort_buf.clear();
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::{N_INF, gaussian::Gaussian};
|
|
|
|
#[test]
|
|
fn reset_keeps_capacity() {
|
|
let mut arena = ScratchArena::new();
|
|
arena.vars.alloc(N_INF);
|
|
arena.sort_buf.push(42);
|
|
let var_cap = arena.vars.marginals.capacity();
|
|
let sort_cap = arena.sort_buf.capacity();
|
|
arena.reset();
|
|
assert_eq!(arena.vars.len(), 0);
|
|
assert_eq!(arena.sort_buf.len(), 0);
|
|
assert_eq!(arena.vars.marginals.capacity(), var_cap);
|
|
assert_eq!(arena.sort_buf.capacity(), sort_cap);
|
|
}
|
|
}
|