diff --git a/src/batch.rs b/src/batch.rs index fd040c5..e97769c 100644 --- a/src/batch.rs +++ b/src/batch.rs @@ -107,94 +107,13 @@ pub struct Batch { } impl Batch { - pub fn new( - composition: Vec>>, - results: Vec>, - weights: Vec>>, - time: i64, - p_draw: f64, - agents: &HashMap, - ) -> Self { - assert!( - results.is_empty() || results.len() == composition.len(), - "TODO: Add a comment here" - ); - assert!( - weights.is_empty() || weights.len() == composition.len(), - "TODO: Add a comment here" - ); - - let this_agent = composition - .iter() - .flatten() - .flatten() - .collect::>(); - - let skills = this_agent - .iter() - .map(|&idx| { - let elapsed = compute_elapsed(agents[idx].last_time, time); - - ( - *idx, - Skill { - forward: agents[idx].receive(elapsed), - elapsed, - ..Default::default() - }, - ) - }) - .collect::>(); - - let events = composition - .iter() - .enumerate() - .map(|(e, event)| { - let teams = event - .iter() - .enumerate() - .map(|(t, team)| { - let items = team - .iter() - .map(|&agent| Item { - agent, - likelihood: N_INF, - }) - .collect::>(); - - Team { - items, - output: if results.is_empty() { - (event.len() - (t + 1)) as f64 - } else { - results[e][t] - }, - } - }) - .collect::>(); - - Event { - teams, - evidence: 0.0, - weights: if weights.is_empty() { - Vec::new() - } else { - weights[e].clone() - }, - } - }) - .collect::>(); - - let mut this = Self { + pub fn new(time: i64, p_draw: f64) -> Self { + Self { + events: Vec::new(), + skills: HashMap::new(), time, - events, - skills, p_draw, - }; - - this.iteration(0, agents); - - this + } } pub(crate) fn add_events( @@ -492,7 +411,9 @@ mod tests { ); } - let mut batch = Batch::new( + let mut batch = Batch::new(0, 0.0); + + batch.add_events( vec![ vec![vec![a], vec![b]], vec![vec![c], vec![d]], @@ -500,8 +421,6 @@ mod tests { ], vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], vec![], - 0, - 0.0, &agents, ); @@ -568,7 +487,9 @@ mod tests { ); } - let mut batch = Batch::new( + let mut batch = Batch::new(0, 0.0); + + batch.add_events( vec![ vec![vec![a], vec![b]], vec![vec![a], vec![c]], @@ -576,8 +497,6 @@ mod tests { ], vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], vec![], - 0, - 0.0, &agents, ); @@ -647,7 +566,9 @@ mod tests { ); } - let mut batch = Batch::new( + let mut batch = Batch::new(0, 0.0); + + batch.add_events( vec![ vec![vec![a], vec![b]], vec![vec![a], vec![c]], @@ -655,8 +576,6 @@ mod tests { ], vec![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]], vec![], - 0, - 0.0, &agents, ); diff --git a/src/history.rs b/src/history.rs index 0e4fb51..4780205 100644 --- a/src/history.rs +++ b/src/history.rs @@ -367,17 +367,18 @@ impl History { agent.message = b.forward_prior_out(a); } } else { - let b = Batch::new(composition, results, weights, t, self.p_draw, &self.agents); + let mut batch: Batch = Batch::new(t, self.p_draw); + batch.add_events(composition, results, weights, &self.agents); - self.batches.insert(k, b); + self.batches.insert(k, batch); - let b = &self.batches[k]; + let batch = &self.batches[k]; - for a in b.skills.keys() { + for a in batch.skills.keys() { let agent = self.agents.get_mut(a).unwrap(); agent.last_time = if self.time { t } else { i64::MAX }; - agent.message = b.forward_prior_out(a); + agent.message = batch.forward_prior_out(a); } k += 1;