changeset 11359 | e6a9528f02f7 |
parent 11358 | 55360683db75 |
child 11380 | ff0fa38bdb18 |
11358:55360683db75 | 11359:e6a9528f02f7 |
---|---|
22 ε = 0.000001 |
22 ε = 0.000001 |
23 |
23 |
24 g_φ :: Double -> Double |
24 g_φ :: Double -> Double |
25 g_φ φ = 1 / sqrt (1 + 3 * φ^2 / pi^2) |
25 g_φ φ = 1 / sqrt (1 + 3 * φ^2 / pi^2) |
26 |
26 |
27 calcE :: GameData -> (Double, Double) |
27 calcE :: GameData -> (Double, Double, Double) |
28 calcE (GameData oldRating oppRating s) = ( |
28 calcE (GameData oldRating oppRating s) = ( |
29 1 / (1 + exp (g_φᵢ * (μᵢ - μ))) |
29 1 / (1 + exp (g_φᵢ * (μᵢ - μ))) |
30 , g_φᵢ |
30 , g_φᵢ |
31 , s |
|
31 ) |
32 ) |
32 where |
33 where |
33 μ = (ratingValue oldRating - 1500) / 173.7178 |
34 μ = (ratingValue oldRating - 1500) / 173.7178 |
34 φ = rD oldRating / 173.7178 |
35 φ = rD oldRating / 173.7178 |
35 μᵢ = (ratingValue oppRating - 1500) / 173.7178 |
36 μᵢ = (ratingValue oppRating - 1500) / 173.7178 |
37 g_φᵢ = g_φ φᵢ |
38 g_φᵢ = g_φ φᵢ |
38 |
39 |
39 |
40 |
40 calcNewRating :: [GameData] -> RatingData |
41 calcNewRating :: [GameData] -> RatingData |
41 calcNewRating [] = undefined |
42 calcNewRating [] = undefined |
42 calcNewRating games@(GameData oldRating _ _ : _) = undefined |
43 calcNewRating games@(GameData oldRating _ _ : _) = RatingData (173.7178 * μ' + 1500) (173.7178 * sqrt φ'sqr) σ' |
43 where |
44 where |
44 _Es = map calcE games |
45 _Es = map calcE games |
45 υ = 1 / sum (map υ_p _Es) |
46 υ = 1 / sum (map υ_p _Es) |
46 υ_p (_Eᵢ, g_φᵢ) = g_φᵢ ^ 2 * _Eᵢ * (1 - _Eᵢ) |
47 υ_p (_Eᵢ, g_φᵢ, _) = g_φᵢ ^ 2 * _Eᵢ * (1 - _Eᵢ) |
47 _Δ = υ * sum (map _Δ_p $ zip _Es (map gameScore games)) |
48 _Δ = υ * part1 |
48 _Δ_p ((_Eᵢ, g_φᵢ), sᵢ) = g_φᵢ * (sᵢ - _Eᵢ) |
49 part1 = sum (map _Δ_p _Es) |
50 _Δ_p (_Eᵢ, g_φᵢ, sᵢ) = g_φᵢ * (sᵢ - _Eᵢ) |
|
49 |
51 |
50 μ = (ratingValue oldRating - 1500) / 173.7178 |
52 μ = (ratingValue oldRating - 1500) / 173.7178 |
51 φ = rD oldRating / 173.7178 |
53 φ = rD oldRating / 173.7178 |
52 σ = volatility oldRating |
54 σ = volatility oldRating |
53 |
55 |
61 fB = f _B |
63 fB = f _B |
62 σ' = (\(_A, _, _, _) -> exp (_A / 2)) . head . dropWhile (\(_A, _, _B, _) -> abs (_B - _A) > ε) $ iterate step5 (_A, fA, _B, fB) |
64 σ' = (\(_A, _, _, _) -> exp (_A / 2)) . head . dropWhile (\(_A, _, _B, _) -> abs (_B - _A) > ε) $ iterate step5 (_A, fA, _B, fB) |
63 step5 (_A, fA, _B, fB) = let _C = _A + (_A - _B) * fA / (fB - fA); fC = f _C in |
65 step5 (_A, fA, _B, fB) = let _C = _A + (_A - _B) * fA / (fB - fA); fC = f _C in |
64 if fC * fB < 0 then (_B, fB, _C, fC) else (_A, fA / 2, _C, fC) |
66 if fC * fB < 0 then (_B, fB, _C, fC) else (_A, fA / 2, _C, fC) |
65 |
67 |
68 φ'sqr = 1 / (1 / (φ ^ 2 + σ' ^ 2) + 1 / υ) |
|
69 μ' = μ + φ'sqr * part1 |
|
66 |
70 |
67 main = undefined |
71 main = undefined |