New public types:
- ConvergenceOptions { max_iter, epsilon } — config for the loop
- ConvergenceReport { iterations, final_step, log_evidence, converged,
per_iteration_time, slices_skipped } — post-hoc summary
History and HistoryBuilder gain a third generic parameter
O: Observer<T> = NullObserver. Builder methods:
- .convergence(opts) sets the ConvergenceOptions
- .observer(o) plugs in an Observer (reshapes the builder's O param)
History::converge() runs the existing iteration loop driven by the
stored opts, emits observer callbacks on each iteration end and on
completion, and returns Result<ConvergenceReport, InferenceError>.
The old convergence(iters, eps, verbose) stays — gets removed in
Task 20 after tests are translated.
Part of T2 of docs/superpowers/specs/2026-04-23-trueskill-engine-redesign-design.md.
32 lines
691 B
Rust
32 lines
691 B
Rust
//! Convergence configuration and reporting.
|
|
|
|
use std::time::Duration;
|
|
|
|
use smallvec::SmallVec;
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub struct ConvergenceOptions {
|
|
pub max_iter: usize,
|
|
pub epsilon: f64,
|
|
}
|
|
|
|
impl Default for ConvergenceOptions {
|
|
fn default() -> Self {
|
|
Self {
|
|
max_iter: crate::ITERATIONS,
|
|
epsilon: crate::EPSILON,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Post-hoc summary of a `History::converge` call.
|
|
#[derive(Clone, Debug)]
|
|
pub struct ConvergenceReport {
|
|
pub iterations: usize,
|
|
pub final_step: (f64, f64),
|
|
pub log_evidence: f64,
|
|
pub converged: bool,
|
|
pub per_iteration_time: SmallVec<[Duration; 32]>,
|
|
pub slices_skipped: usize,
|
|
}
|