6 use CGI::Carp qw( fatalsToBrowser );
13 require '../config.pm';
15 my $dbh = DBI->connect($config::local_connstr, $config::local_username, $config::local_password)
16 or die "connect: " . $DBI::errstr;
17 $dbh->{AutoCommit} = 0;
18 $dbh->{RaiseError} = 1;
20 binmode STDOUT, ':utf8';
22 # Find auxillary parameters.
24 my $q = $dbh->prepare('SELECT * FROM ratings WHERE id < 0');
26 while (my $ref = $q->fetchrow_hashref) {
27 $params{$ref->{'id'}} = $ref->{'rating'};
29 my $match_stddev = $params{-2} * sqrt(2.0);
31 print CGI->header(-type=>'text/html; charset=utf-8', -expires=>'+5m');
32 POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8');
34 printf <<"EOF", $params{-3}, $match_stddev;
37 <title>WLoH-rating</title>
38 <link rel="stylesheet" href="/style" type="text/css" />
43 <p><em>Dette er et hobbyprosjekt fra tredjepart, og ikke en offisiell del av
44 <a href="http://wordfeud.aasmul.net/">Wordfeud Leage of Honour</a>.</em></p>
46 <p>Ratingen er dog basert på spilledata fra WLoH (takk til Lobotommy
47 for tilgang!), og oppdateres
48 hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
49 på WLoH, men brukes for å estimere vinnersannsynligheter i
50 <a href="/">sannsynlighetsberegningen</a>.</p>
53 er betydelig usikkerhetsmargin, spesielt for spillere som ikke
54 har spilt spesielt mange kamper.</p>
56 <p>Modellen kan endre seg når som helst når jeg føler for det :-)
57 Ikke ta ratingen alt for alvorlig, selv om den er basert på
58 relativt fornuftige matematiske modeller. Husk at all statistikk
59 sier mer om fortiden enn om framtiden.</p>
61 <h2>Modellparametre</h2>
63 <p>For de som vet litt om slikt. Mer utførlig forklaring for begynnere kommer seinere.</p>
66 <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>
67 <li>Rimelighetfunksjon, prior: Normalfordeling med µ=1500, σ=%.1f (est.)</li>
68 <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), σ=%.1f (est.)</li>
69 <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
70 (likt med prior). Deretter eksponentielt synkende vekting, med
71 halveringstid på tre sesonger. Spill som er registrert med
72 150-0, 0-150 eller 150-150 ignoreres.</li>
75 <h2>Divisjonsoversikt</h2>
85 $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');
89 while (my $ref = $q->fetchrow_hashref) {
91 print " <tr class=\"odd\">\n";
93 print " <tr class=\"even\">\n";
95 printf " <th>%d.</th>\n", $ref->{'divisjon'};
96 printf " <td class=\"num\">%.1f</td>\n", $ref->{'avg_rating'};
97 printf " <td class=\"num\">%.1f</td>\n", $ref->{'stddev_rating'};
104 <h2>Rankingliste</h2>
118 NATURAL JOIN kanonisk_navn
119 NATURAL JOIN siste_divisjon
120 ORDER BY rating DESC');
124 while (my $ref = $q->fetchrow_hashref) {
126 print " <tr class=\"odd\">\n";
128 print " <tr class=\"even\">\n";
130 printf " <th>%d.</th>\n", $i;
131 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'}));
132 printf " <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
133 printf " <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
143 $match_stddev = $params{-2} * sqrt(2.0);