refactor!: remove the inert online flag
Skill.online was initialised to N_INF and assigned nowhere, so HistoryBuilder::online(true) made every rating improper and log_evidence() reported n * ln(0.5) — every game scored as a coin flip. The value is finite and plausible, which is why it went unnoticed. The default was false, so no existing result changes. A working replacement lands next; a stored field cannot hold the quantity, because converge() alternates sweeps and contaminates skill.forward with backward information from the second iteration onward. Also renames a test binding from ..._online to ..._forward: it passes the forward flag, and the two senses being conflated is how this survived.
This commit is contained in:
+5
-22
@@ -29,7 +29,6 @@ pub struct HistoryBuilder<
|
||||
beta: f64,
|
||||
drift: D,
|
||||
p_draw: f64,
|
||||
online: bool,
|
||||
score_sigma: f64,
|
||||
convergence: ConvergenceOptions,
|
||||
observer: O,
|
||||
@@ -60,7 +59,6 @@ impl<T: Time, D: Drift<T>, O: Observer<T>, K: Eq + Hash + Clone> HistoryBuilder<
|
||||
sigma: self.sigma,
|
||||
beta: self.beta,
|
||||
p_draw: self.p_draw,
|
||||
online: self.online,
|
||||
score_sigma: self.score_sigma,
|
||||
convergence: self.convergence,
|
||||
observer: self.observer,
|
||||
@@ -87,11 +85,6 @@ impl<T: Time, D: Drift<T>, O: Observer<T>, K: Eq + Hash + Clone> HistoryBuilder<
|
||||
self
|
||||
}
|
||||
|
||||
pub fn online(mut self, online: bool) -> Self {
|
||||
self.online = online;
|
||||
self
|
||||
}
|
||||
|
||||
/// Default observation noise for scored outcomes.
|
||||
///
|
||||
/// # Panics
|
||||
@@ -135,7 +128,6 @@ impl<T: Time, D: Drift<T>, O: Observer<T>, K: Eq + Hash + Clone> HistoryBuilder<
|
||||
beta: self.beta,
|
||||
drift: self.drift,
|
||||
p_draw: self.p_draw,
|
||||
online: self.online,
|
||||
score_sigma: self.score_sigma,
|
||||
convergence: self.convergence,
|
||||
observer,
|
||||
@@ -155,7 +147,6 @@ impl<T: Time, D: Drift<T>, O: Observer<T>, K: Eq + Hash + Clone> HistoryBuilder<
|
||||
beta: self.beta,
|
||||
drift: self.drift,
|
||||
p_draw: self.p_draw,
|
||||
online: self.online,
|
||||
score_sigma: self.score_sigma,
|
||||
convergence: self.convergence,
|
||||
observer: self.observer,
|
||||
@@ -171,7 +162,6 @@ impl Default for HistoryBuilder<i64, ConstantDrift, NullObserver, &'static str>
|
||||
beta: BETA,
|
||||
drift: ConstantDrift(GAMMA),
|
||||
p_draw: P_DRAW,
|
||||
online: false,
|
||||
score_sigma: 1.0,
|
||||
convergence: ConvergenceOptions::default(),
|
||||
observer: NullObserver,
|
||||
@@ -196,7 +186,6 @@ pub struct History<
|
||||
beta: f64,
|
||||
drift: D,
|
||||
p_draw: f64,
|
||||
online: bool,
|
||||
score_sigma: f64,
|
||||
convergence: ConvergenceOptions,
|
||||
observer: O,
|
||||
@@ -223,7 +212,6 @@ impl<K: Eq + Hash + Clone> History<i64, ConstantDrift, NullObserver, K> {
|
||||
beta: BETA,
|
||||
drift: ConstantDrift(GAMMA),
|
||||
p_draw: P_DRAW,
|
||||
online: false,
|
||||
score_sigma: 1.0,
|
||||
convergence: ConvergenceOptions::default(),
|
||||
observer: NullObserver,
|
||||
@@ -399,7 +387,7 @@ impl<T: Time, D: Drift<T>, O: Observer<T>, K: Eq + Hash + Clone> History<T, D, O
|
||||
let per_slice: Vec<f64> = self
|
||||
.time_slices
|
||||
.par_iter()
|
||||
.map(|ts| ts.log_evidence(self.online, targets, forward, &self.agents))
|
||||
.map(|ts| ts.log_evidence(targets, forward, &self.agents))
|
||||
.collect();
|
||||
per_slice.into_iter().sum()
|
||||
}
|
||||
@@ -407,7 +395,7 @@ impl<T: Time, D: Drift<T>, O: Observer<T>, K: Eq + Hash + Clone> History<T, D, O
|
||||
{
|
||||
self.time_slices
|
||||
.iter()
|
||||
.map(|ts| ts.log_evidence(self.online, targets, forward, &self.agents))
|
||||
.map(|ts| ts.log_evidence(targets, forward, &self.agents))
|
||||
.sum()
|
||||
}
|
||||
}
|
||||
@@ -935,12 +923,7 @@ mod tests {
|
||||
|
||||
let w = [vec![1.0], vec![1.0]];
|
||||
let p = Game::ranked_with_arena(
|
||||
h.time_slices[1].events[0].within_priors(
|
||||
false,
|
||||
false,
|
||||
&h.time_slices[1].skills,
|
||||
&h.agents,
|
||||
),
|
||||
h.time_slices[1].events[0].within_priors(false, &h.time_slices[1].skills, &h.agents),
|
||||
&[0.0, 1.0],
|
||||
&w,
|
||||
P_DRAW,
|
||||
@@ -1180,11 +1163,11 @@ mod tests {
|
||||
let f = h.keys.get("f").unwrap();
|
||||
|
||||
let trueskill_log_evidence = h.log_evidence_internal(false, &[]);
|
||||
let trueskill_log_evidence_online = h.log_evidence_internal(true, &[]);
|
||||
let trueskill_log_evidence_forward = h.log_evidence_internal(true, &[]);
|
||||
|
||||
assert_ulps_eq!(
|
||||
trueskill_log_evidence,
|
||||
trueskill_log_evidence_online,
|
||||
trueskill_log_evidence_forward,
|
||||
epsilon = 1e-6
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user