]> git.sesse.net Git - wloh/blob - www/rating.pl
README update.
[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>Ratingen er basert på spilledata fra WLoH (takk til Lobotommy
64       for tilgang!), og oppdateres
65       hver hele time. Den er fullstendig uoffisiell, og har ingen innflytelse
66       på WLoH, men brukes for å estimere vinnersannsynligheter i
67       <a href="/">sannsynlighetsberegningen</a>.</p>
68
69     <p>Vær obs på at det
70       er betydelig usikkerhetsmargin, spesielt for spillere som ikke
71       har spilt spesielt mange kamper.</p>
72
73     <p>Modellen kan endre seg når som helst når jeg føler for det :-)
74       Ikke ta ratingen alt for alvorlig, selv om den er basert på
75       relativt fornuftige matematiske modeller. Husk at all statistikk
76       sier mer om fortiden enn om framtiden.</p>
77
78     <h2>Modellparametre</h2>
79
80     <p>For de som vet litt om slikt. Mer utførlig forklaring for begynnere kommer seinere.</p>
81
82     <ul>
83       <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>
84       <li>Rimelighetfunksjon, prior: Normalfordeling med µ=1500, &sigma;=%.1f (est.)</li>
85       <li>Rimelighetfunksjon, per kamp: Normalfordeling med µ=(score1 - score2), &sigma;=%.1f (est.)</li>
86       <li>Vekting: Inneværende sesong samt de tre siste vektes fullt ut
87         (likt med prior). Deretter eksponentielt synkende vekting, med
88         halveringstid på tre sesonger. Spill som er registrert med
89         150-0, 0-150 eller 150-150 ignoreres.</li>
90     </ul>
91
92   <h2>Rankingliste</h2>
93
94   <table>
95     <tr>
96       <th></th>
97       <th>Nick</th>
98       <th>Ranking</th>
99       <th>Sist sett</th>
100     </tr>
101 EOF
102
103 $q = $dbh->prepare('
104 SELECT *
105 FROM ratings
106   NATURAL JOIN kanonisk_navn
107   NATURAL JOIN siste_divisjon
108 ORDER BY rating DESC');
109 $q->execute;
110
111 my $i = 0;
112 while (my $ref = $q->fetchrow_hashref) {
113         if (++$i % 2 == 0) {
114                 print "    <tr class=\"odd\">\n";
115         } else {
116                 print "    <tr class=\"even\">\n";
117         }
118         printf "      <th>%d.</th>\n", $i;
119         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'}));
120         printf "      <td class=\"num\">%.1f</td>\n", $ref->{'rating'};
121         printf "      <td><a href=\"http://wordfeud.aasmul.net/serie-%d\">%s</a></td>\n", $ref->{'serie_id'}, $ref->{'serie_navn'};
122         print "    </tr>\n";
123 }
124
125 print <<"EOF";
126     </table>
127   </body>
128 </html>
129 EOF
130
131 $match_stddev = $params{-2} * sqrt(2.0);
132
133 $dbh->rollback;