perf(game): replace order.clone()+position() with inverse permutation
This commit is contained in:
10
src/game.rs
10
src/game.rs
@@ -192,15 +192,19 @@ impl<'a, D: Drift> Game<'a, D> {
|
|||||||
.map(|si| lhood_win[si] * lhood_lose[si])
|
.map(|si| lhood_win[si] * lhood_lose[si])
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// Map sorted-team likelihoods back to original team order.
|
// Inverse permutation: inv[orig_i] = sorted_i (O(n), avoids clone + O(n²) search).
|
||||||
let order = arena.sort_buf.clone();
|
let mut inv = vec![0usize; n_teams];
|
||||||
|
for (si, &orig_i) in arena.sort_buf.iter().enumerate() {
|
||||||
|
inv[orig_i] = si;
|
||||||
|
}
|
||||||
|
|
||||||
self.likelihoods = self
|
self.likelihoods = self
|
||||||
.teams
|
.teams
|
||||||
.iter()
|
.iter()
|
||||||
.zip(self.weights.iter())
|
.zip(self.weights.iter())
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(orig_i, (players, weights))| {
|
.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 m = m_t_ft[sorted_i];
|
||||||
let performance = players
|
let performance = players
|
||||||
.iter()
|
.iter()
|
||||||
|
|||||||
Reference in New Issue
Block a user