diff --git a/src/history.rs b/src/history.rs index ea5f25c..c591532 100644 --- a/src/history.rs +++ b/src/history.rs @@ -116,6 +116,25 @@ pub struct History { iterations: usize, } +impl Default for History { + fn default() -> Self { + Self { + size: 0, + batches: Vec::new(), + agents: HashMap::new(), + time: true, + mu: MU, + sigma: SIGMA, + beta: BETA, + gamma: GAMMA, + p_draw: P_DRAW, + online: false, + epsilon: EPSILON, + iterations: ITERATIONS, + } + } +} + impl History { pub fn builder() -> HistoryBuilder { HistoryBuilder::default() @@ -595,7 +614,7 @@ mod tests { ); } - let mut h = History::builder().build(); + let mut h = History::default(); h.add_events(composition, results, vec![1, 2, 3], vec![], priors); @@ -649,7 +668,7 @@ mod tests { priors.insert(k.to_string(), player); } - let mut h1 = History::builder().build(); + let mut h1 = History::default(); h1.add_events(composition, results, times, vec![], priors); @@ -740,7 +759,7 @@ mod tests { priors.insert(k.to_string(), player); } - let mut h = History::builder().build(); + let mut h = History::default(); h.add_events(composition, results, times, vec![], priors); h.convergence(ITERATIONS, EPSILON, false); @@ -774,21 +793,17 @@ mod tests { ]; let results = vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]; - let mut h = History::new( - composition, - results, - vec![], - vec![], - HashMap::new(), - 25.0, - 25.0 / 3.0, - 25.0 / 6.0, - 25.0 / 300.0, - 0.0, - false, - ); + let mut h = History::builder() + .mu(25.0) + .sigma(25.0 / 3.0) + .beta(25.0 / 6.0) + .gamma(25.0 / 300.0) + .time(false) + .build(); - let (_step, _i) = h.convergence(ITERATIONS, EPSILON, false); + h.add_events(composition, results, vec![], vec![], HashMap::new()); + + h.convergence(ITERATIONS, EPSILON, false); assert_eq!(h.batches[2].skills["b"].elapsed, 1); assert_eq!(h.batches[2].skills["c"].elapsed, 1); @@ -819,19 +834,15 @@ mod tests { ]; let results = vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]; - let mut h = History::new( - composition, - results, - vec![], - vec![], - HashMap::new(), - 0.0, - 6.0, - 1.0, - 0.0, - 0.0, - false, - ); + let mut h = History::builder() + .mu(0.0) + .sigma(6.0) + .beta(1.0) + .gamma(0.0) + .time(false) + .build(); + + h.add_events(composition, results, vec![], vec![], HashMap::new()); let trueskill_log_evidence = h.log_evidence(false, &vec![]); let trueskill_log_evidence_online = h.log_evidence(true, &vec![]); @@ -904,21 +915,23 @@ mod tests { ]; let results = vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]; - let mut h = History::new( + let mut h = History::builder() + .mu(0.0) + .sigma(2.0) + .beta(1.0) + .gamma(0.0) + .time(false) + .build(); + + h.add_events( composition.clone(), results.clone(), vec![], vec![], HashMap::new(), - 0.0, - 2.0, - 1.0, - 0.0, - 0.0, - false, ); - let (_step, _i) = h.convergence(ITERATIONS, EPSILON, false); + h.convergence(ITERATIONS, EPSILON, false); assert_eq!(h.batches[2].skills["b"].elapsed, 1); assert_eq!(h.batches[2].skills["c"].elapsed, 1); @@ -984,20 +997,6 @@ mod tests { #[test] fn test_only_add_events() { - let mut h = History::new( - vec![], - vec![], - vec![], - vec![], - HashMap::new(), - 0.0, - 2.0, - 1.0, - 0.0, - 0.0, - false, - ); - let composition = vec![ vec![vec!["a"], vec!["b"]], vec![vec!["a"], vec!["c"]], @@ -1005,6 +1004,14 @@ mod tests { ]; let results = vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]; + let mut h = History::builder() + .mu(0.0) + .sigma(2.0) + .beta(1.0) + .gamma(0.0) + .time(false) + .build(); + h.add_events( composition.clone(), results.clone(), @@ -1013,7 +1020,7 @@ mod tests { HashMap::new(), ); - let (_step, _i) = h.convergence(ITERATIONS, EPSILON, false); + h.convergence(ITERATIONS, EPSILON, false); assert_eq!(h.batches[2].skills["b"].elapsed, 1); assert_eq!(h.batches[2].skills["c"].elapsed, 1); @@ -1081,19 +1088,9 @@ mod tests { fn test_log_evidence() { let composition = vec![vec![vec!["a"], vec!["b"]], vec![vec!["b"], vec!["a"]]]; - let mut h = History::new( - composition.clone(), - vec![], - vec![], - vec![], - HashMap::new(), - MU, - SIGMA, - BETA, - GAMMA, - P_DRAW, - false, - ); + let mut h = History::builder().time(false).build(); + + h.add_events(composition.clone(), vec![], vec![], vec![], HashMap::new()); let p_d_m_2 = h.log_evidence(false, &vec![]).exp() * 2.0; @@ -1130,19 +1127,9 @@ mod tests { epsilon = 0.00001 ); - let mut h = History::new( - composition, - vec![], - vec![], - vec![], - HashMap::new(), - MU, - SIGMA, - BETA, - GAMMA, - P_DRAW, - true, - ); + let mut h = History::builder().time(false).build(); + + h.add_events(composition, vec![], vec![], vec![], HashMap::new()); assert_ulps_eq!( ((0.5f64 * 0.1765).ln() / 2.0).exp(), @@ -1160,18 +1147,19 @@ mod tests { ]; let results = vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]; - let mut h = History::new( + let mut h = History::builder() + .mu(0.0) + .sigma(2.0) + .beta(1.0) + .gamma(0.0) + .build(); + + h.add_events( composition.clone(), results.clone(), vec![0, 10, 20], vec![], HashMap::new(), - 0.0, - 2.0, - 1.0, - 0.0, - 0.0, - false, ); h.convergence(ITERATIONS, EPSILON, false); @@ -1259,18 +1247,19 @@ mod tests { vec![vec!["b"], vec!["c"]], ]; - let mut h = History::new( + let mut h = History::builder() + .mu(0.0) + .sigma(2.0) + .beta(1.0) + .gamma(0.0) + .build(); + + h.add_events( composition.clone(), vec![], vec![0, 10, 20], vec![], HashMap::new(), - 0.0, - 2.0, - 1.0, - 0.0, - 0.0, - false, ); h.convergence(ITERATIONS, EPSILON, false); @@ -1350,19 +1339,15 @@ mod tests { let composition = vec![vec![vec!["a"], vec!["b"]], vec![vec!["b"], vec!["a"]]]; let weights = vec![vec![vec![5.0], vec![4.0]], vec![vec![5.0], vec![4.0]]]; - let mut h = History::new( - composition.clone(), - vec![], - vec![], - weights, - HashMap::new(), - 2.0, - 6.0, - 1.0, - 0.0, - 0.0, - false, - ); + let mut h = History::builder() + .mu(2.0) + .sigma(6.0) + .beta(1.0) + .gamma(0.0) + .time(false) + .build(); + + h.add_events(composition.clone(), vec![], vec![], weights, HashMap::new()); let lc = h.learning_curves();