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';
24 my $locale = wloh_common::get_locale($cgi);
26 my $aux_parms = wloh_common::get_auxillary_parameters($dbh, $locale);
27 my $match_stddev = $aux_parms->{'score_stddev'} * sqrt(2.0);
29 print CGI->header(-type=>'text/html; charset=utf-8', -expires=>'+5m');
30 POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8');
33 <?xml version="1.0" encoding="UTF-8" ?>
35 html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
36 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
37 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="no">
39 <title>WLoH-rating</title>
40 <link rel="stylesheet" href="style" type="text/css" />
45 wloh_common::print_navbar($cgi, $dbh, $locale);
47 printf <<"EOF", $aux_parms->{'rating_prior_stddev'}, $match_stddev;
50 <p><em>Dette er et hobbyprosjekt fra tredjepart, og ikke en offisiell del av
51 <a href="http://wordfeud.aasmul.net/">Wordfeud Leage of Honour</a>.</em></p>
53 <p>Ratingen er dog basert på spilledata fra WLoH (takk til Lobotommy
54 for tilgang!), og oppdateres
55 hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
56 på WLoH, men brukes for å estimere vinnersannsynligheter i
57 <a href="index">sannsynlighetsberegningen</a>.</p>
59 <p>Modellen kan endre seg når som helst når jeg føler for det :-)
60 Ikke ta ratingen alt for alvorlig, selv om den er basert på
61 relativt fornuftige matematiske modeller. Husk at all statistikk
62 sier mer om fortiden enn om framtiden.</p>
64 <h2>Modellparametre</h2>
66 <p>For de som vet litt om slikt. Det finnes også en lengre, mer detaljert
67 <a href="ratings-explained">forklaring</a> beregnet på ikke-matematikere.</p>
70 <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: $aux_parms->{num_iterations}.</li>
71 <li>Rimelighetfunksjon, prior: Normalfordeling med µ=500, σ=%.1f (est.)</li>
72 <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), σ=%.1f (est.)</li>
73 <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
74 (likt med prior). Deretter eksponentielt synkende vekting, med
75 halveringstid på tre sesonger. Spill som er registrert med
76 0-0, 150-0, 0-150 eller 150-150 ignoreres.</li>
79 <h2>Divisjonsoversikt</h2>
89 my $season = wloh_common::get_max_season($dbh, $locale);
91 # Pick up all the subdivisions' ratings.
92 my %subdivision_ratings = ();
93 my $q = $dbh->prepare('SELECT divisjon, avdeling, serie_id, AVG(rating) AS avg_rating FROM ratings NATURAL JOIN siste_divisjon NATURAL JOIN spiller_kultur WHERE kultur=? AND sesong=? GROUP BY divisjon, avdeling, serie_id ORDER BY divisjon, avdeling');
94 $q->execute($locale, $season);
96 while (my $ref = $q->fetchrow_hashref) {
97 my $division = $ref->{'divisjon'};
98 my $rating = $ref->{'avg_rating'};
99 my $id = $ref->{'serie_id'};
101 push @{$subdivision_ratings{$division}}, [ $id, $rating ];
104 $q = $dbh->prepare('SELECT divisjon,AVG(rating) AS avg_rating,STDDEV(rating) AS stddev_rating FROM ratings NATURAL JOIN siste_divisjon NATURAL JOIN spiller_kultur WHERE kultur=? AND sesong=? GROUP BY divisjon ORDER BY divisjon');
105 $q->execute($locale, $season);
108 while (my $ref = $q->fetchrow_hashref) {
110 print " <tr class=\"odd\">\n";
112 print " <tr class=\"even\">\n";
114 printf " <th>%d.</th>\n", $ref->{'divisjon'};
115 printf " <td class=\"num\">%.1f</td>\n", $ref->{'avg_rating'};
116 printf " <td class=\"num\">%.1f</td>\n", $ref->{'stddev_rating'};
118 for my $arr (@{$subdivision_ratings{$ref->{'divisjon'}}}) {
119 my ($id, $rating) = @$arr;
120 printf " <td class=\"num\"><a href=\"http://wordfeud.aasmul.net/serie-%d\">%.1f</a></td>\n", $id, $rating;
128 <h2>Rankingliste</h2>
143 NATURAL JOIN kanonisk_navn
144 NATURAL JOIN siste_divisjon
145 NATURAL JOIN spiller_kultur
147 ORDER BY rating DESC');
148 $q->execute($locale);
151 while (my $ref = $q->fetchrow_hashref) {
153 print " <tr class=\"odd\">\n";
155 print " <tr class=\"even\">\n";
157 printf " <th>%d.</th>\n", $i;
158 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'}));
159 printf " <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
160 printf " <td class=\"num\">%.1f</td>\n", $ref->{'rating_stddev'};
161 printf " <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
166 wloh_common::output_last_sync($dbh);