From 5f1b2bd914f9b960405fa02d809968dc7d455a36 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Fri, 23 Jun 2023 19:20:50 -0700 Subject: [PATCH] only fetch ratings once when suggesting a game --- lib/rank_king.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/rank_king.rb b/lib/rank_king.rb index 384f916..3fb5215 100644 --- a/lib/rank_king.rb +++ b/lib/rank_king.rb @@ -5,14 +5,17 @@ module RankKing OS = OpenSkill.new Match = Data.define(:a, :b) + # rates all possible 1v1 games to find which generally decreases sigma + # regardless of the winner/loser - is this mathematically sound? I have + # no idea def self.suggest_game(axis) items = axis.pool.items + ratings = items.to_h { [_1.id, Rating.first(axis:, item: _1) || OS.rating] } items.combination(2).sort_by {|combo| - # TODO get all the ratings at once - ratings = combo.map {|item| Rating.first(axis:, item:) || OS.rating } + game = combo.map { ratings.fetch(_1.id) } Math.sqrt( - [ratings, ratings.reverse] + [game, game.reverse] .map {|game| [game, OS.rate(*game).flatten] } .sum {|pre,post| pre.zip(post).sum { (_1.sigma - _2.sigma)**2 }} )