56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
extern crate blas_src;
|
|
|
|
use kickscore::{kernel, model::Binary};
|
|
|
|
fn main() {
|
|
let mut model = Binary::probit();
|
|
|
|
// Spike's skill does not change over time.
|
|
let k_spike = kernel::Constant::new(0.5);
|
|
|
|
// Tom's skill changes over time, with "jagged" (non-smooth) dynamics.
|
|
let k_tom = kernel::Exponential::new(1.0, 1.0);
|
|
|
|
// Jerry's skill has a constant offset and smooth dynamics.
|
|
let k_jerry = (kernel::Constant::new(1.0), kernel::Matern52::new(0.5, 1.0));
|
|
|
|
// Now we are ready to add the items in the model.
|
|
model.add_item("Spike", k_spike);
|
|
model.add_item("Tom", k_tom);
|
|
model.add_item("Jerry", k_jerry);
|
|
|
|
// At first, Jerry beats Tom a couple of times.
|
|
model.observe(&["Jerry"], &["Tom"], 0.0);
|
|
model.observe(&["Jerry"], &["Tom"], 0.9);
|
|
|
|
// Then, Tom beats Spike, and then Jerry.
|
|
model.observe(&["Tom"], &["Spike"], 1.7);
|
|
model.observe(&["Tom"], &["Jerry"], 2.1);
|
|
|
|
// Finally, Jerry beats Tom, and then Tom + Spike.
|
|
model.observe(&["Jerry"], &["Tom"], 3.0);
|
|
model.observe(&["Jerry"], &["Tom", "Spike"], 3.5);
|
|
|
|
model.fit(true);
|
|
|
|
// We can predict a future outcome...
|
|
let (p_win, _p_los) = model.probabilities(&["Jerry"], &["Tom"], 4.0);
|
|
println!(
|
|
"Chances that Jerry beats Tom at t = 4.0: {:.1}%",
|
|
100.0 * p_win
|
|
);
|
|
|
|
// ... or simulate what could have happened in the past.
|
|
let (p_win, _p_los) = model.probabilities(&["Jerry"], &["Tom"], 2.0);
|
|
println!(
|
|
"Chances that Jerry beats Tom at t = 2.0: {:.1}%",
|
|
100.0 * p_win
|
|
);
|
|
|
|
let (p_win, _p_los) = model.probabilities(&["Jerry"], &["Tom"], -1.0);
|
|
println!(
|
|
"Chances that Jerry beats Tom at t = -1.0: {:.1}%",
|
|
100.0 * p_win
|
|
);
|
|
}
|