Optimize recommender (for custom rulesets)

This commit is contained in:
Endrik Tombak
2020-04-17 18:15:11 +03:00
parent da9bd74e2e
commit 1ac9ee5990

View File

@ -51,8 +51,7 @@ namespace osu.Game.Screens.Select
foreach (var r in getBestRulesetOrder()) foreach (var r in getBestRulesetOrder())
{ {
if (!recommendedStarDifficulty.TryGetValue(ruleset.Value, out var stars)) recommendedStarDifficulty.TryGetValue(ruleset.Value, out var stars);
break;
beatmap = beatmaps.Where(b => b.Ruleset.Equals(r)).OrderBy(b => beatmap = beatmaps.Where(b => b.Ruleset.Equals(r)).OrderBy(b =>
{ {
@ -75,6 +74,7 @@ namespace osu.Game.Screens.Select
req.Success += result => req.Success += result =>
{ {
bestRulesetOrder = null;
// algorithm taken from https://github.com/ppy/osu-web/blob/e6e2825516449e3d0f3f5e1852c6bdd3428c3437/app/Models/User.php#L1505 // algorithm taken from https://github.com/ppy/osu-web/blob/e6e2825516449e3d0f3f5e1852c6bdd3428c3437/app/Models/User.php#L1505
recommendedStarDifficulty[rulesetInfo] = Math.Pow((double)(result.Statistics.PP ?? 0), 0.4) * 0.195; recommendedStarDifficulty[rulesetInfo] = Math.Pow((double)(result.Statistics.PP ?? 0), 0.4) * 0.195;
}; };
@ -87,22 +87,30 @@ namespace osu.Game.Screens.Select
private IEnumerable<RulesetInfo> getBestRulesetOrder() private IEnumerable<RulesetInfo> getBestRulesetOrder()
{ {
if (bestRulesetOrder != null) bestRulesetOrder ??= recommendedStarDifficulty.ToList()
return moveCurrentRulesetToFirst(); .OrderBy(pair => pair.Value)
.Select(pair => pair.Key)
bestRulesetOrder = recommendedStarDifficulty.ToList() .Reverse();
.OrderBy(pair => pair.Value)
.Select(pair => pair.Key)
.Reverse();
return moveCurrentRulesetToFirst(); return moveCurrentRulesetToFirst();
} }
private IEnumerable<RulesetInfo> moveCurrentRulesetToFirst() private IEnumerable<RulesetInfo> moveCurrentRulesetToFirst()
{ {
var orderedRulesets = bestRulesetOrder.ToList(); List<RulesetInfo> orderedRulesets = null;
orderedRulesets.Remove(ruleset.Value);
orderedRulesets.Insert(0, ruleset.Value); if (bestRulesetOrder.Contains(ruleset.Value))
{
orderedRulesets = bestRulesetOrder.ToList();
orderedRulesets.Remove(ruleset.Value);
orderedRulesets.Insert(0, ruleset.Value);
}
else
{
orderedRulesets = new List<RulesetInfo> { ruleset.Value };
orderedRulesets.AddRange(bestRulesetOrder);
}
return orderedRulesets; return orderedRulesets;
} }