func AssertRating(t *testing.T, expectedMean, expectedStddev float64, actual skills.Rating) { if r := actual.Mean(); math.Abs(r-expectedMean) > errorTolerance { t.Errorf("actual.Mean = %v, want %v\n%v", r, expectedMean, testLoc()) } if r := actual.Stddev(); math.Abs(r-expectedStddev) > errorTolerance { t.Errorf("actual.Stddev = %v, want %v\n%v", r, expectedStddev, testLoc()) } }
func srating2rating(s skills.Rating) Rating { return Rating{Mean: s.Mean(), Stddev: s.Stddev()} }
func twoPlayerCalcNewRating(gi *skills.GameInfo, selfRating, oppRating skills.Rating, comparison int) skills.Rating { drawMargin := drawMarginFromDrawProbability(gi.DrawProbability, gi.Beta) c := math.Sqrt(numerics.Sqr(selfRating.Stddev()) + numerics.Sqr(oppRating.Stddev()) + 2*numerics.Sqr(gi.Beta)) winningMean := selfRating.Mean() losingMean := oppRating.Mean() if comparison == skills.Lose { winningMean = oppRating.Mean() losingMean = selfRating.Mean() } meanDelta := winningMean - losingMean var v, w, rankMultiplier float64 if comparison != skills.Draw { v = vExceedsMarginC(meanDelta, drawMargin, c) w = wExceedsMarginC(meanDelta, drawMargin, c) rankMultiplier = float64(comparison) } else { v = vWithinMarginC(meanDelta, drawMargin, c) w = wWithinMarginC(meanDelta, drawMargin, c) rankMultiplier = 1 } meanMultiplier := (numerics.Sqr(selfRating.Stddev()) + numerics.Sqr(gi.DynamicsFactor)) / c varianceWithDynamics := numerics.Sqr(selfRating.Stddev()) + numerics.Sqr(gi.DynamicsFactor) stdDevMultiplier := varianceWithDynamics / numerics.Sqr(c) newMean := selfRating.Mean() + (rankMultiplier * meanMultiplier * v) newStdDev := math.Sqrt(varianceWithDynamics * (1 - w*stdDevMultiplier)) return skills.NewRating(newMean, newStdDev) }