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:
+7
-14
@@ -22,7 +22,6 @@ pub(crate) struct Skill {
|
||||
backward: Gaussian,
|
||||
likelihood: Gaussian,
|
||||
pub(crate) elapsed: i64,
|
||||
pub(crate) online: Gaussian,
|
||||
}
|
||||
|
||||
impl Skill {
|
||||
@@ -38,7 +37,6 @@ impl Default for Skill {
|
||||
backward: N_INF,
|
||||
likelihood: N_INF,
|
||||
elapsed: 0,
|
||||
online: N_INF,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -59,7 +57,6 @@ struct Item {
|
||||
impl Item {
|
||||
fn within_prior<T: Time, D: Drift<T>>(
|
||||
&self,
|
||||
online: bool,
|
||||
forward: bool,
|
||||
skills: &SkillStore,
|
||||
agents: &CompetitorStore<T, D>,
|
||||
@@ -67,9 +64,7 @@ impl Item {
|
||||
let r = &agents[self.agent].rating;
|
||||
let skill = skills.get(self.agent).unwrap();
|
||||
|
||||
if online {
|
||||
Rating::new(skill.online, r.beta, r.drift)
|
||||
} else if forward {
|
||||
if forward {
|
||||
Rating::new(skill.forward, r.beta, r.drift)
|
||||
} else {
|
||||
Rating::new(skill.posterior() / self.likelihood, r.beta, r.drift)
|
||||
@@ -107,7 +102,6 @@ impl Event {
|
||||
|
||||
pub(crate) fn within_priors<T: Time, D: Drift<T>>(
|
||||
&self,
|
||||
online: bool,
|
||||
forward: bool,
|
||||
skills: &SkillStore,
|
||||
agents: &CompetitorStore<T, D>,
|
||||
@@ -117,7 +111,7 @@ impl Event {
|
||||
.map(|team| {
|
||||
team.items
|
||||
.iter()
|
||||
.map(|item| item.within_prior(online, forward, skills, agents))
|
||||
.map(|item| item.within_prior(forward, skills, agents))
|
||||
.collect::<Vec<_>>()
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
@@ -136,7 +130,7 @@ impl Event {
|
||||
convergence: crate::ConvergenceOptions,
|
||||
arena: &mut ScratchArena,
|
||||
) -> EventUpdate {
|
||||
let teams = self.within_priors(false, false, skills, agents);
|
||||
let teams = self.within_priors(false, skills, agents);
|
||||
let result = self.outputs();
|
||||
let g = match self.kind {
|
||||
EventKind::Ranked => {
|
||||
@@ -372,7 +366,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
if from > 0 || self.color_groups.is_empty() {
|
||||
// Initial pass (add_events) or no color groups yet: simple sequential sweep.
|
||||
for event in self.events.iter_mut().skip(from) {
|
||||
let teams = event.within_priors(false, false, &self.skills, agents);
|
||||
let teams = event.within_priors(false, &self.skills, agents);
|
||||
let result = event.outputs();
|
||||
|
||||
let g = match event.kind {
|
||||
@@ -582,7 +576,6 @@ impl<T: Time> TimeSlice<T> {
|
||||
|
||||
pub(crate) fn log_evidence<D: Drift<T>>(
|
||||
&self,
|
||||
online: bool,
|
||||
targets: &[Index],
|
||||
forward: bool,
|
||||
agents: &CompetitorStore<T, D>,
|
||||
@@ -594,7 +587,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
let mut arena = ScratchArena::new();
|
||||
|
||||
let run_event = |event: &Event, arena: &mut ScratchArena| -> f64 {
|
||||
let teams = event.within_priors(online, forward, &self.skills, agents);
|
||||
let teams = event.within_priors(forward, &self.skills, agents);
|
||||
let result = event.outputs();
|
||||
match event.kind {
|
||||
EventKind::Ranked => {
|
||||
@@ -623,7 +616,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
};
|
||||
|
||||
if targets.is_empty() {
|
||||
if online || forward {
|
||||
if forward {
|
||||
self.events
|
||||
.iter()
|
||||
.map(|event| run_event(event, &mut arena))
|
||||
@@ -631,7 +624,7 @@ impl<T: Time> TimeSlice<T> {
|
||||
} else {
|
||||
self.events.iter().map(|event| event.log_evidence).sum()
|
||||
}
|
||||
} else if online || forward {
|
||||
} else if forward {
|
||||
self.events
|
||||
.iter()
|
||||
.filter(|event| {
|
||||
|
||||
Reference in New Issue
Block a user