diff --git a/benches/batch.rs b/benches/batch.rs index b87dc06..2f30794 100644 --- a/benches/batch.rs +++ b/benches/batch.rs @@ -36,7 +36,7 @@ fn criterion_benchmark(criterion: &mut Criterion) { let kinds = vec![EventKind::Ranked; composition.len()]; let mut time_slice = TimeSlice::new(1, P_DRAW, ConvergenceOptions::default()); - time_slice.add_events(composition, results, weights, kinds, &agents); + time_slice.add_events(composition, Some(results), Some(weights), kinds, &agents); criterion.bench_function("Batch::iteration", |b| { b.iter(|| time_slice.iteration(0, &agents)) diff --git a/src/history.rs b/src/history.rs index cd90079..746ca84 100644 --- a/src/history.rs +++ b/src/history.rs @@ -651,17 +651,22 @@ impl, O: Observer, K: Eq + Hash + Clone> History>>, - results: Vec>, + results: Option>>, times: Vec, - weights: Vec>>, + weights: Option>>>, kinds: Vec, mut priors: HashMap>, ) -> Result<(), InferenceError> { - if !results.is_empty() && results.len() != composition.len() { + if results + .as_ref() + .is_some_and(|r| r.len() != composition.len()) + { + let got = results.as_ref().map_or(0, Vec::len); + return Err(InferenceError::MismatchedShape { kind: "results", expected: composition.len(), - got: results.len(), + got, }); } if times.len() != composition.len() { @@ -671,11 +676,16 @@ impl, O: Observer, K: Eq + Hash + Clone> History, O: Observer, K: Eq + Hash + Clone> History, O: Observer, K: Eq + Hash + Clone> History>(); - let results = if results.is_empty() { - Vec::new() - } else { - (i..j).map(|e| results[o[e]].clone()).collect::>() - }; + let results = results + .as_ref() + .map(|results| (i..j).map(|e| results[o[e]].clone()).collect::>()); - let weights = if weights.is_empty() { - Vec::new() - } else { - (i..j).map(|e| weights[o[e]].clone()).collect::>() - }; + let weights = weights + .as_ref() + .map(|weights| (i..j).map(|e| weights[o[e]].clone()).collect::>()); let kinds_chunk: Vec = (i..j).map(|e| kinds[o[e]]).collect(); @@ -861,9 +867,9 @@ impl, O: Observer, K: Eq + Hash + Clone> History, O: Observer, K: Eq + Hash + Clone> History, O: Observer, K: Eq + Hash + Clone> History TimeSlice { pub fn add_events>( &mut self, composition: Vec>>, - results: Vec>, - weights: Vec>>, + results: Option>>, + weights: Option>>>, kinds: Vec, agents: &CompetitorStore, ) { @@ -328,22 +328,21 @@ impl TimeSlice { Team { items, - output: if results.is_empty() { - (event.len() - (t + 1)) as f64 - } else { - results[e][t] + output: match &results { + Some(results) => results[e][t], + // No explicit result: rank by position, first team best. + None => (event.len() - (t + 1)) as f64, }, } }) .collect::>(); - let weights = if weights.is_empty() { - teams + let weights = match &weights { + Some(weights) => weights[e].clone(), + None => teams .iter() .map(|team| vec![1.0; team.items.len()]) - .collect::>() - } else { - weights[e].clone() + .collect::>(), }; Event { @@ -828,8 +827,8 @@ mod tests { vec![vec![c], vec![d]], vec![vec![e], vec![f]], ], - vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], - vec![], + Some(vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]), + None, vec![EventKind::Ranked; 3], &agents, ); @@ -905,8 +904,8 @@ mod tests { vec![vec![a], vec![c]], vec![vec![b], vec![c]], ], - vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], - vec![], + Some(vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]), + None, vec![EventKind::Ranked; 3], &agents, ); @@ -985,8 +984,8 @@ mod tests { vec![vec![a], vec![c]], vec![vec![b], vec![c]], ], - vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], - vec![], + Some(vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]), + None, vec![EventKind::Ranked; 3], &agents, ); @@ -1017,8 +1016,8 @@ mod tests { vec![vec![a], vec![c]], vec![vec![b], vec![c]], ], - vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], - vec![], + Some(vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]]), + None, vec![EventKind::Ranked; 3], &agents, ); @@ -1088,8 +1087,8 @@ mod tests { vec![vec![c], vec![d]], vec![vec![a], vec![c]], ], - vec![vec![1.0, 0.0], vec![1.0, 0.0], vec![1.0, 0.0]], - vec![], + Some(vec![vec![1.0, 0.0], vec![1.0, 0.0], vec![1.0, 0.0]]), + None, vec![EventKind::Ranked; 3], &agents, );