From c02d5ca0ab3973c8704895fd6536ae649f2ac485 Mon Sep 17 00:00:00 2001 From: Anders Olsson Date: Fri, 24 Apr 2026 08:58:09 +0200 Subject: [PATCH] perf(game): replace order.clone()+position() with inverse permutation --- src/game.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/game.rs b/src/game.rs index 131fb82..e45d676 100644 --- a/src/game.rs +++ b/src/game.rs @@ -192,15 +192,19 @@ impl<'a, D: Drift> Game<'a, D> { .map(|si| lhood_win[si] * lhood_lose[si]) .collect(); - // Map sorted-team likelihoods back to original team order. - let order = arena.sort_buf.clone(); + // Inverse permutation: inv[orig_i] = sorted_i (O(n), avoids clone + O(n²) search). + let mut inv = vec![0usize; n_teams]; + for (si, &orig_i) in arena.sort_buf.iter().enumerate() { + inv[orig_i] = si; + } + self.likelihoods = self .teams .iter() .zip(self.weights.iter()) .enumerate() .map(|(orig_i, (players, weights))| { - let sorted_i = order.iter().position(|&x| x == orig_i).unwrap(); + let sorted_i = inv[orig_i]; let m = m_t_ft[sorted_i]; let performance = players .iter()