]> git.sesse.net Git - wloh/blob - www/rating.pl
Add some disclaimers.
[wloh] / www / rating.pl
1 #! /usr/bin/perl
2 use strict;
3 use warnings;
4 no warnings qw(once);
5 use CGI;
6 use CGI::Carp qw( fatalsToBrowser );
7 use DBI;
8 use Encode;
9 use POSIX;
10 use HTML::Entities;
11 use utf8;
12 use locale;
13 require '../config.pm';
14
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;
19
20 binmode STDOUT, ':utf8';
21
22 # Find auxillary parameters.
23 my %params = ();
24 my $q = $dbh->prepare('SELECT * FROM ratings WHERE id < 0');
25 $q->execute;
26 while (my $ref = $q->fetchrow_hashref) {
27         $params{$ref->{'id'}} = $ref->{'rating'};
28 }
29 my $match_stddev = $params{-2} * sqrt(2.0);
30
31 print CGI->header(-type=>'text/html; charset=utf-8', -expires=>'+5m');
32 POSIX::setlocale(&POSIX::LC_ALL, 'nb_NO.UTF-8');
33
34 printf <<"EOF", $params{-3}, $match_stddev;
35 <html>
36   <head>
37     <title>WLoH-rating</title>
38     <style type="text/css">
39 body {
40         color: black;
41         background: white;
42         font-family: sans-serif;
43 }
44 table {
45         border-collapse: collapse;
46         border: 1px solid black;
47 }
48 td, th {
49         border: 1px solid black;
50         padding: 5px;
51 }
52 td.num {
53         text-align: right;
54 }
55 .even {
56         background-color: #ddd;
57 }
58     </style>
59   </head>
60   <body>
61     <h1>WLoH-rating</h1>
62
63     <p><em>Dette er et hobbyprosjekt fra tredjepart, og ikke en offisiell del av
64       <a href="http://wordfeud.aasmul.net/">Wordfeud Leage of Honour</a>.</em></p>
65
66     <p>Ratingen er dog basert på spilledata fra WLoH (takk til Lobotommy
67       for tilgang!), og oppdateres
68       hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
69       på WLoH, men brukes for å estimere vinnersannsynligheter i
70       <a href="/">sannsynlighetsberegningen</a>.</p>
71
72     <p>Vær obs på at det
73       er betydelig usikkerhetsmargin, spesielt for spillere som ikke
74       har spilt spesielt mange kamper.</p>
75
76     <p>Modellen kan endre seg når som helst når jeg føler for det :-)
77       Ikke ta ratingen alt for alvorlig, selv om den er basert på
78       relativt fornuftige matematiske modeller. Husk at all statistikk
79       sier mer om fortiden enn om framtiden.</p>
80
81     <h2>Modellparametre</h2>
82
83     <p>For de som vet litt om slikt. Mer utførlig forklaring for begynnere kommer seinere.</p>
84
85     <ul>
86       <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>
87       <li>Rimelighetfunksjon, prior: Normalfordeling med µ=1500, &sigma;=%.1f (est.)</li>
88       <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), &sigma;=%.1f (est.)</li>
89       <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
90         (likt med prior). Deretter eksponentielt synkende vekting, med
91         halveringstid på tre sesonger. Spill som er registrert med
92         150-0, 0-150 eller 150-150 ignoreres.</li>
93     </ul>
94
95   <h2>Rankingliste</h2>
96
97   <table>
98     <tr>
99       <th></th>
100       <th>Nick</th>
101       <th>Ranking</th>
102       <th>Sist sett</th>
103     </tr>
104 EOF
105
106 $q = $dbh->prepare('
107 SELECT *
108 FROM ratings
109   NATURAL JOIN kanonisk_navn
110   NATURAL JOIN siste_divisjon
111 ORDER BY rating DESC');
112 $q->execute;
113
114 my $i = 0;
115 while (my $ref = $q->fetchrow_hashref) {
116         if (++$i % 2 == 0) {
117                 print "    <tr class=\"odd\">\n";
118         } else {
119                 print "    <tr class=\"even\">\n";
120         }
121         printf "      <th>%d.</th>\n", $i;
122         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'}));
123         printf "      <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
124         printf "      <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
125         print "    </tr>\n";
126 }
127
128 print <<"EOF";
129     </table>
130   </body>
131 </html>
132 EOF
133
134 $match_stddev = $params{-2} * sqrt(2.0);
135
136 $dbh->rollback;