Fixes, upgrade, and stuff

This commit is contained in:
2021-10-27 09:23:23 +02:00
parent 57b423df8a
commit 79a76b316b
9 changed files with 43 additions and 34 deletions

View File

@@ -11,7 +11,7 @@ ndarray = { version = "0.15", features = ["approx", "blas"] }
[dev-dependencies] [dev-dependencies]
approx = "0.4" approx = "0.4"
rand = "0.8"
time = "0.2"
blas-src = { version = "0.8", features = ["openblas"] } blas-src = { version = "0.8", features = ["openblas"] }
openblas-src = { version = "0.10", features = ["cblas", "system"] } openblas-src = { version = "0.10", features = ["cblas", "system"] }
rand = "0.8"
time = { version = "0.3", features = ["parsing", "macros"] }

7
README.md Normal file
View File

@@ -0,0 +1,7 @@
# Kickscore
Rust port of kickscore.
## Todo
- [ ] Add all kernels

View File

@@ -6,7 +6,7 @@ use std::fs;
use std::io::{self, BufRead}; use std::io::{self, BufRead};
use kickscore as ks; use kickscore as ks;
use time::Date; use time::{macros::date, Date};
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
let reader = fs::File::open("data/nba.csv").map(io::BufReader::new)?; let reader = fs::File::open("data/nba.csv").map(io::BufReader::new)?;
@@ -14,7 +14,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut teams = HashSet::new(); let mut teams = HashSet::new();
let mut observations = Vec::new(); let mut observations = Vec::new();
let cutoff = time::date!(2019 - 06 - 01); let cutoff = date!(2019 - 06 - 01);
let format = time::format_description::parse("[year]-[month]-[day]").unwrap();
for line in reader.lines().skip(1) { for line in reader.lines().skip(1) {
let line = line?; let line = line?;
@@ -22,7 +23,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
assert!(data.len() == 5); assert!(data.len() == 5);
let t = Date::parse(data[0], "%F")?; let t = Date::parse(data[0], &format)?;
if t > cutoff { if t > cutoff {
break; break;
@@ -73,9 +74,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Probability that CHI beats BOS..."); println!("Probability that CHI beats BOS...");
let (p_win, _) = model.probabilities( let (p_win, _) = model.probabilities(
&[&"CHI"], &["CHI"],
&[&"BOS"], &["BOS"],
time::date!(1996 - 01 - 01) date!(1996 - 01 - 01)
.midnight() .midnight()
.assume_utc() .assume_utc()
.unix_timestamp() as f64, .unix_timestamp() as f64,
@@ -83,9 +84,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
println!(" ... in 1996: {:.2}%", 100.0 * p_win); println!(" ... in 1996: {:.2}%", 100.0 * p_win);
let (p_win, _) = model.probabilities( let (p_win, _) = model.probabilities(
&[&"CHI"], &["CHI"],
&[&"BOS"], &["BOS"],
time::date!(2001 - 01 - 01) date!(2001 - 01 - 01)
.midnight() .midnight()
.assume_utc() .assume_utc()
.unix_timestamp() as f64, .unix_timestamp() as f64,
@@ -93,9 +94,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
println!(" ... in 2001: {:.2}%", 100.0 * p_win); println!(" ... in 2001: {:.2}%", 100.0 * p_win);
let (p_win, _) = model.probabilities( let (p_win, _) = model.probabilities(
&[&"CHI"], &["CHI"],
&[&"BOS"], &["BOS"],
time::date!(2020 - 01 - 01) date!(2020 - 01 - 01)
.midnight() .midnight()
.assume_utc() .assume_utc()
.unix_timestamp() as f64, .unix_timestamp() as f64,

View File

@@ -154,7 +154,7 @@ impl BinaryModel {
fn process_items(&self, items: &[&str], sign: f64) -> Vec<(usize, f64)> { fn process_items(&self, items: &[&str], sign: f64) -> Vec<(usize, f64)> {
items items
.iter() .iter()
.map(|key| (self.storage.get_id(&key), sign)) .map(|key| (self.storage.get_id(key), sign))
.collect() .collect()
} }
} }

View File

@@ -94,7 +94,7 @@ impl DifferenceModel {
fn process_items(&self, items: &[&str], sign: f64) -> Vec<(usize, f64)> { fn process_items(&self, items: &[&str], sign: f64) -> Vec<(usize, f64)> {
items items
.iter() .iter()
.map(|key| (self.storage.get_id(&key), sign)) .map(|key| (self.storage.get_id(key), sign))
.collect() .collect()
} }
} }

View File

@@ -187,7 +187,7 @@ impl TernaryModel {
fn process_items(&self, items: &[&str], sign: f64) -> Vec<(usize, f64)> { fn process_items(&self, items: &[&str], sign: f64) -> Vec<(usize, f64)> {
items items
.iter() .iter()
.map(|key| (self.storage.get_id(&key), sign)) .map(|key| (self.storage.get_id(key), sign))
.collect() .collect()
} }
} }

View File

@@ -149,7 +149,7 @@ impl ProbitWinObservation {
} }
pub fn probability(storage: &Storage, elems: &[(usize, f64)], t: f64, margin: f64) -> f64 { pub fn probability(storage: &Storage, elems: &[(usize, f64)], t: f64, margin: f64) -> f64 {
let (m, v) = f_params(&elems, t, &storage); let (m, v) = f_params(elems, t, storage);
let (logpart, _, _) = mm_probit_win(m - margin, v); let (logpart, _, _) = mm_probit_win(m - margin, v);
logpart.exp() logpart.exp()
@@ -188,7 +188,7 @@ impl ProbitTieObservation {
} }
pub fn probability(storage: &Storage, elems: &[(usize, f64)], t: f64, margin: f64) -> f64 { pub fn probability(storage: &Storage, elems: &[(usize, f64)], t: f64, margin: f64) -> f64 {
let (m, v) = f_params(&elems, t, &storage); let (m, v) = f_params(elems, t, storage);
let (logpart, _, _) = mm_probit_tie(m, v, margin); let (logpart, _, _) = mm_probit_tie(m, v, margin);
logpart.exp() logpart.exp()

View File

@@ -31,15 +31,15 @@ fn kickscore_basic() {
model.fit(); model.fit();
let (p_win, _p_los) = model.probabilities(&[&"Jerry"], &[&"Tom"], 4.0); let (p_win, _p_los) = model.probabilities(&["Jerry"], &["Tom"], 4.0);
assert_abs_diff_eq!(p_win, 0.7299975928462964, epsilon = f64::EPSILON); assert_abs_diff_eq!(p_win, 0.7299975928462964, epsilon = f64::EPSILON);
let (p_win, _p_los) = model.probabilities(&[&"Jerry"], &[&"Tom"], 2.0); let (p_win, _p_los) = model.probabilities(&["Jerry"], &["Tom"], 2.0);
assert_abs_diff_eq!(p_win, 0.4455095363120037, epsilon = f64::EPSILON); assert_abs_diff_eq!(p_win, 0.4455095363120037, epsilon = f64::EPSILON);
let (p_win, _p_los) = model.probabilities(&[&"Jerry"], &[&"Tom"], -1.0); let (p_win, _p_los) = model.probabilities(&["Jerry"], &["Tom"], -1.0);
assert_abs_diff_eq!(p_win, 0.9037560799725326, epsilon = f64::EPSILON); assert_abs_diff_eq!(p_win, 0.9037560799725326, epsilon = f64::EPSILON);
} }

View File

@@ -7,7 +7,7 @@ use std::io::{self, BufRead};
use approx::assert_abs_diff_eq; use approx::assert_abs_diff_eq;
use kickscore as ks; use kickscore as ks;
use time::Date; use time::{macros::date, Date};
#[test] #[test]
fn nba_history() { fn nba_history() {
@@ -18,7 +18,8 @@ fn nba_history() {
let mut teams = HashSet::new(); let mut teams = HashSet::new();
let mut observations = Vec::new(); let mut observations = Vec::new();
let cutoff = time::date!(2019 - 06 - 01); let cutoff = date!(2019 - 06 - 01);
let format = time::format_description::parse("[year]-[month]-[day]").unwrap();
for line in reader.lines().skip(1) { for line in reader.lines().skip(1) {
let line = line.unwrap(); let line = line.unwrap();
@@ -26,7 +27,7 @@ fn nba_history() {
assert!(data.len() == 5); assert!(data.len() == 5);
let t = Date::parse(data[0], "%F").unwrap(); let t = Date::parse(data[0], &format).unwrap();
if t > cutoff { if t > cutoff {
break; break;
@@ -75,9 +76,9 @@ fn nba_history() {
model.fit(); model.fit();
let (p_win, _) = model.probabilities( let (p_win, _) = model.probabilities(
&[&"CHI"], &["CHI"],
&[&"BOS"], &["BOS"],
time::date!(1996 - 01 - 01) date!(1996 - 01 - 01)
.midnight() .midnight()
.assume_utc() .assume_utc()
.unix_timestamp() as f64, .unix_timestamp() as f64,
@@ -86,9 +87,9 @@ fn nba_history() {
assert_abs_diff_eq!(p_win, 0.9002599772490479, epsilon = f64::EPSILON); assert_abs_diff_eq!(p_win, 0.9002599772490479, epsilon = f64::EPSILON);
let (p_win, _) = model.probabilities( let (p_win, _) = model.probabilities(
&[&"CHI"], &["CHI"],
&[&"BOS"], &["BOS"],
time::date!(2001 - 01 - 01) date!(2001 - 01 - 01)
.midnight() .midnight()
.assume_utc() .assume_utc()
.unix_timestamp() as f64, .unix_timestamp() as f64,
@@ -97,9 +98,9 @@ fn nba_history() {
assert_abs_diff_eq!(p_win, 0.22837870685441986, epsilon = f64::EPSILON); assert_abs_diff_eq!(p_win, 0.22837870685441986, epsilon = f64::EPSILON);
let (p_win, _) = model.probabilities( let (p_win, _) = model.probabilities(
&[&"CHI"], &["CHI"],
&[&"BOS"], &["BOS"],
time::date!(2020 - 01 - 01) date!(2020 - 01 - 01)
.midnight() .midnight()
.assume_utc() .assume_utc()
.unix_timestamp() as f64, .unix_timestamp() as f64,