Dry my eyes

This commit is contained in:
Anders Olsson
2023-10-24 09:50:16 +02:00
parent efa235be59
commit 59c256edad
2 changed files with 20 additions and 100 deletions

View File

@@ -107,94 +107,13 @@ pub struct Batch {
} }
impl Batch { impl Batch {
pub fn new( pub fn new(time: i64, p_draw: f64) -> Self {
composition: Vec<Vec<Vec<Index>>>, Self {
results: Vec<Vec<f64>>, events: Vec::new(),
weights: Vec<Vec<Vec<f64>>>, skills: HashMap::new(),
time: i64,
p_draw: f64,
agents: &HashMap<Index, Agent>,
) -> 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::<HashSet<_>>();
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::<HashMap<_, _>>();
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::<Vec<_>>();
Team {
items,
output: if results.is_empty() {
(event.len() - (t + 1)) as f64
} else {
results[e][t]
},
}
})
.collect::<Vec<_>>();
Event {
teams,
evidence: 0.0,
weights: if weights.is_empty() {
Vec::new()
} else {
weights[e].clone()
},
}
})
.collect::<Vec<_>>();
let mut this = Self {
time, time,
events,
skills,
p_draw, p_draw,
}; }
this.iteration(0, agents);
this
} }
pub(crate) fn add_events( 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![vec![a], vec![b]], vec![vec![a], vec![b]],
vec![vec![c], vec![d]], 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![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]],
vec![], vec![],
0,
0.0,
&agents, &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![vec![a], vec![b]], vec![vec![a], vec![b]],
vec![vec![a], vec![c]], 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![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]],
vec![], vec![],
0,
0.0,
&agents, &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![vec![a], vec![b]], vec![vec![a], vec![b]],
vec![vec![a], vec![c]], 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![vec![1.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0]],
vec![], vec![],
0,
0.0,
&agents, &agents,
); );

View File

@@ -367,17 +367,18 @@ impl History {
agent.message = b.forward_prior_out(a); agent.message = b.forward_prior_out(a);
} }
} else { } 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(); let agent = self.agents.get_mut(a).unwrap();
agent.last_time = if self.time { t } else { i64::MAX }; 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; k += 1;