From 5f747c6cd80fee99db12dc26853c8cf0d51e5bde Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 15 Dec 2025 14:56:15 +0900 Subject: [PATCH 1/4] Update test data to produce failing tests Taken from https://github.com/vivekjoshy/openskill.py/blob/c9d3210ed068570cfa11a3f56586255c93d1a4c8/tests/models/data/plackettluce.json --- .../Models/Data/plackettluce.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OpenSkillSharp.Tests/Models/Data/plackettluce.json b/OpenSkillSharp.Tests/Models/Data/plackettluce.json index 2b8d58e..41fe81e 100644 --- a/OpenSkillSharp.Tests/Models/Data/plackettluce.json +++ b/OpenSkillSharp.Tests/Models/Data/plackettluce.json @@ -86,21 +86,21 @@ ], "team_2": [ { - "mu": 23.083700519022745, + "mu": 20.599656070925114, "sigma": 8.222674397835641 }, { - "mu": 21.717476072569045, + "mu": 20.47545384852023, "sigma": 8.277466291367071 } ], "team_3": [ { - "mu": 21.717476072569045, + "mu": 20.47545384852023, "sigma": 8.277466291367071 }, { - "mu": 23.083700519022745, + "mu": 20.599656070925114, "sigma": 8.222674397835641 } ], @@ -160,7 +160,7 @@ "ties": { "team_1": [ { - "mu": 23.241111866333558, + "mu": 21.63766806988004, "sigma": 8.310709773172306 } ], @@ -176,15 +176,15 @@ ], "team_3": [ { - "mu": 21.479966996534408, + "mu": 19.87652320008089, "sigma": 8.237522411103104 }, { - "mu": 21.479966996534408, + "mu": 19.87652320008089, "sigma": 8.237522411103104 }, { - "mu": 21.479966996534408, + "mu": 19.87652320008089, "sigma": 8.237522411103104 } ] @@ -261,4 +261,4 @@ } ] } -} \ No newline at end of file +} From 2c39577d897bb6038267db6e27a6da00ae69a90f Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 15 Dec 2025 14:57:37 +0900 Subject: [PATCH 2/4] Fix PlackettLuce handling of ties --- OpenSkillSharp/Models/PlackettLuce.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSkillSharp/Models/PlackettLuce.cs b/OpenSkillSharp/Models/PlackettLuce.cs index 88e4703..f8358d0 100644 --- a/OpenSkillSharp/Models/PlackettLuce.cs +++ b/OpenSkillSharp/Models/PlackettLuce.cs @@ -40,7 +40,7 @@ protected override IEnumerable Compute( return ( sumOmega: acc.sumOmega + ( iTeamIndex == qTeamIndex - ? 1 - (iMuOverCeOverSumQ / rankOccurrences[qTeamIndex]) + ? (1 - iMuOverCeOverSumQ) / rankOccurrences[qTeamIndex] : -1 * iMuOverCeOverSumQ / rankOccurrences[qTeamIndex] ), sumDelta: acc.sumDelta + From ad9cc65d6b6f5b0d92c550734e3c2ef6b258c4f6 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 15 Dec 2025 15:06:33 +0900 Subject: [PATCH 3/4] Add another failing test --- OpenSkillSharp.Tests/Models/PlackettLuceTests.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OpenSkillSharp.Tests/Models/PlackettLuceTests.cs b/OpenSkillSharp.Tests/Models/PlackettLuceTests.cs index 549b03c..b199fa8 100644 --- a/OpenSkillSharp.Tests/Models/PlackettLuceTests.cs +++ b/OpenSkillSharp.Tests/Models/PlackettLuceTests.cs @@ -149,4 +149,16 @@ public void Rate_Balance() // Assert Assertions.RatingResultsEqual(expectedRatings, results); } + + [Fact] + public void Rate_AllScoresTied() + { + PlackettLuce model = new PlackettLuce { Mu = 30, Sigma = 30.0 / 3 }; + + ITeam[] teams = [new Team { Players = [model.Rating()] }, new Team { Players = [model.Rating()] }]; + ITeam[] result = model.Rate(teams, scores: [0, 0]).ToArray(); + + Assert.Equal(30, result[0].Players.Single().Mu); + Assert.Equal(30, result[1].Players.Single().Mu); + } } \ No newline at end of file From d551f2fb077cb794eb5ef06601d71b5c5b84a099 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 15 Dec 2025 15:06:56 +0900 Subject: [PATCH 4/4] Fix exception when all scores are tied --- OpenSkillSharp/OpenSkillModelBase.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSkillSharp/OpenSkillModelBase.cs b/OpenSkillSharp/OpenSkillModelBase.cs index 05c8c85..3ef8f0b 100644 --- a/OpenSkillSharp/OpenSkillModelBase.cs +++ b/OpenSkillSharp/OpenSkillModelBase.cs @@ -289,6 +289,7 @@ protected IEnumerable CalculateMarginAdjustedMu( double sign = qTeamScore > iTeamScore ? 1D : -1D; return (qTeam.Mu - iTeam.Mu) * (marginFactor - 1) * sign; }) + .DefaultIfEmpty(0) .Average(); return qTeam.Mu + muAdjustment;