test: translate in-crate tests to new T2 API; delete legacy methods
Every #[cfg(test)] mod tests in src/history.rs now uses the new public API: add_events(iter) / converge() / learning_curve() / current_skill() / log_evidence(). No golden value changed. Legacy methods removed: - History::convergence(iters, eps, verbose) → use converge() - History::learning_curves_by_index() → use learning_curve() / learning_curves() - HistoryBuilder::gamma(f64) → use .drift(ConstantDrift(g)) - add_events_with_prior downgraded from pub to pub(crate) Added: - History::builder_with_key() for custom key types (used by atp example) - tests/equivalence.rs: Game-level golden integration tests examples/atp.rs rewritten in new API (Event<i64, String>, converge(), learning_curve(), drift(ConstantDrift(...))). Bench Batch::iteration: 21.4 µs (T1 reference: 22.88 µs). Part of T2 of docs/superpowers/specs/2026-04-23-trueskill-engine-redesign-design.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
61
tests/equivalence.rs
Normal file
61
tests/equivalence.rs
Normal file
@@ -0,0 +1,61 @@
|
||||
//! Equivalence tests: every historical golden from the pre-T2 tests is
|
||||
//! reproduced here at the integration level via the new public API.
|
||||
//!
|
||||
//! The in-crate tests in `src/history.rs::tests` and
|
||||
//! `src/time_slice.rs::tests` are the primary regression net for numerical
|
||||
//! behavior. This file provides Game-level goldens that stand alone and are
|
||||
//! more naturally expressed as integration tests.
|
||||
|
||||
use approx::assert_ulps_eq;
|
||||
use trueskill_tt::{ConstantDrift, Game, GameOptions, Gaussian, Outcome, Rating};
|
||||
|
||||
type R = Rating<i64, ConstantDrift>;
|
||||
|
||||
fn ts_rating(mu: f64, sigma: f64, beta: f64, gamma: f64) -> R {
|
||||
R::new(Gaussian::from_ms(mu, sigma), beta, ConstantDrift(gamma))
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn game_1v1_golden_matches_historical() {
|
||||
let a = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
|
||||
let b = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
|
||||
let (a_post, b_post) = Game::<i64, _>::one_v_one(&a, &b, Outcome::winner(0, 2)).unwrap();
|
||||
// Historical golden from pre-T2 test_1vs1 (team 0 wins):
|
||||
assert_ulps_eq!(
|
||||
a_post,
|
||||
Gaussian::from_ms(29.205220, 7.194481),
|
||||
epsilon = 1e-6
|
||||
);
|
||||
assert_ulps_eq!(
|
||||
b_post,
|
||||
Gaussian::from_ms(20.794779, 7.194481),
|
||||
epsilon = 1e-6
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn game_1v1_draw_golden() {
|
||||
let a = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
|
||||
let b = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
|
||||
let g = Game::<i64, _>::ranked(
|
||||
&[&[a], &[b]],
|
||||
Outcome::draw(2),
|
||||
&GameOptions {
|
||||
p_draw: 0.25,
|
||||
convergence: Default::default(),
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
let p = g.posteriors();
|
||||
// Historical golden from pre-T2 test_1vs1_draw:
|
||||
assert_ulps_eq!(
|
||||
p[0][0],
|
||||
Gaussian::from_ms(24.999999, 6.469480),
|
||||
epsilon = 1e-6
|
||||
);
|
||||
assert_ulps_eq!(
|
||||
p[1][0],
|
||||
Gaussian::from_ms(24.999999, 6.469480),
|
||||
epsilon = 1e-6
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user