6 use CGI::Carp qw( fatalsToBrowser );
13 require '../config.pm';
14 require '../common.pm';
16 my $dbh = DBI->connect($config::local_connstr, $config::local_username, $config::local_password)
17 or die "connect: " . $DBI::errstr;
18 $dbh->{AutoCommit} = 0;
19 $dbh->{RaiseError} = 1;
21 binmode STDOUT, ':utf8';
23 # Find auxillary parameters.
25 my $q = $dbh->prepare('SELECT * FROM ratings WHERE id < 0');
27 while (my $ref = $q->fetchrow_hashref) {
28 $params{$ref->{'id'}} = $ref->{'rating'};
30 my $match_stddev = $params{-2} * sqrt(2.0);
32 print CGI->header(-type=>'text/html; charset=utf-8', -expires=>'+5m');
33 POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8');
35 printf <<"EOF", $params{-3}, $match_stddev;
36 <?xml version="1.0" encoding="UTF-8" ?>
38 html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
39 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
40 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="no">
42 <title>WLoH-rating</title>
43 <link rel="stylesheet" href="/style" type="text/css" />
48 <p><em>Dette er et hobbyprosjekt fra tredjepart, og ikke en offisiell del av
49 <a href="http://wordfeud.aasmul.net/">Wordfeud Leage of Honour</a>.</em></p>
51 <p>Ratingen er dog basert på spilledata fra WLoH (takk til Lobotommy
52 for tilgang!), og oppdateres
53 hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
54 på WLoH, men brukes for å estimere vinnersannsynligheter i
55 <a href="/">sannsynlighetsberegningen</a>.</p>
57 <p>Modellen kan endre seg når som helst når jeg føler for det :-)
58 Ikke ta ratingen alt for alvorlig, selv om den er basert på
59 relativt fornuftige matematiske modeller. Husk at all statistikk
60 sier mer om fortiden enn om framtiden.</p>
62 <h2>Modellparametre</h2>
64 <p>For de som vet litt om slikt. Det finnes også en lengre, mer detaljert
65 <a href="/ratings-explained">forklaring</a> beregnet på ikke-matematikere.</p>
68 <li>MLE-basert modell med én skalar (styrke) per spiller og to globale skalarer (begge standardavvik, se under), løst med syklisk MM (minorization-maximization). Antall iterasjoner før konvergens: $params{-1}.</li>
69 <li>Rimelighetfunksjon, prior: Normalfordeling med µ=500, σ=%.1f (est.)</li>
70 <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), σ=%.1f (est.)</li>
71 <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
72 (likt med prior). Deretter eksponentielt synkende vekting, med
73 halveringstid på tre sesonger. Spill som er registrert med
74 150-0, 0-150 eller 150-150 ignoreres.</li>
77 <h2>Divisjonsoversikt</h2>
87 $q = $dbh->prepare('SELECT divisjon,AVG(rating) AS avg_rating,STDDEV(rating) AS stddev_rating FROM ratings NATURAL JOIN siste_divisjon GROUP BY divisjon ORDER BY divisjon');
91 while (my $ref = $q->fetchrow_hashref) {
93 print " <tr class=\"odd\">\n";
95 print " <tr class=\"even\">\n";
97 printf " <th>%d.</th>\n", $ref->{'divisjon'};
98 printf " <td class=\"num\">%.1f</td>\n", $ref->{'avg_rating'};
99 printf " <td class=\"num\">%.1f</td>\n", $ref->{'stddev_rating'};
106 <h2>Rankingliste</h2>
121 NATURAL JOIN kanonisk_navn
122 NATURAL JOIN siste_divisjon
123 ORDER BY rating DESC');
127 while (my $ref = $q->fetchrow_hashref) {
129 print " <tr class=\"odd\">\n";
131 print " <tr class=\"even\">\n";
133 printf " <th>%d.</th>\n", $i;
134 printf " <td><a href=\"http://wordfeud.aasmul.net/bruker-%d\">%s</a></td>\n", $ref->{'id'}, HTML::Entities::encode_entities(Encode::decode_utf8($ref->{'navn'}));
135 printf " <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
136 printf " <td class=\"num\">%.1f</td>\n", $ref->{'rating_stddev'};
137 printf " <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
142 wloh_common::output_last_sync($dbh);
149 $match_stddev = $params{-2} * sqrt(2.0);