]> git.sesse.net Git - wloh/blob - train.pl
When doing Monte Carlo, player strength should be constant within a simulated round.
[wloh] / train.pl
1 #! /usr/bin/perl
2 use DBI;
3 use strict;
4 use warnings;
5 no warnings qw(once);
6 use POSIX;
7 require './config.pm';
8
9 my $dbh = DBI->connect($config::local_connstr, $config::local_username, $config::local_password)
10         or die "connect: " . $DBI::errstr;
11 $dbh->{AutoCommit} = 0;
12 $dbh->{RaiseError} = 1;
13
14 # Find last completely done season 
15 my $ref = $dbh->selectrow_hashref('SELECT sesong FROM fotballserier GROUP BY sesong HAVING COUNT(*)=COUNT(avgjort=1 OR NULL) ORDER BY sesong DESC LIMIT 1');
16 my $last_season = $ref->{'sesong'};
17
18 # Fetch games
19 my $q = $dbh->prepare('
20 SELECT
21   deltager1.id as p1, deltager2.id as p2, maalfor, maalmot, least(pow(2.0, (sesong - ? + 3) / 3.0), 1.0) AS vekt
22 FROM
23   Fotballresultater resultater
24   JOIN Fotballdeltagere deltager1 ON resultater.Lagrecno=deltager1.Nr AND resultater.Serie=deltager1.Serie
25   JOIN Fotballdeltagere deltager2 ON resultater.Motstander=deltager2.Nr AND resultater.Serie=deltager2.Serie
26   JOIN Fotballserier serier on resultater.Serie=serier.Nr
27 WHERE deltager1.Nr > deltager2.nr
28 ');
29 $q->execute($last_season);
30
31 my @games = ();
32 my %ids = ();
33
34 while (my $ref = $q->fetchrow_hashref) {
35         next if ($ref->{'maalfor'} == 150 && $ref->{'maalmot'} == 0);
36         next if ($ref->{'maalfor'} == 0 && $ref->{'maalmot'} == 150);
37         next if ($ref->{'maalfor'} == 150 && $ref->{'maalmot'} == 150);
38         push @games, { %$ref };
39         $ids{$ref->{'p1'}} = 1;
40         $ids{$ref->{'p2'}} = 1;
41 }
42
43 # Output to file
44 my $tmpnam = POSIX::tmpnam();
45 open DATA, ">", $tmpnam
46         or die "$tmpnam: $!";
47
48 printf DATA "%d\n", scalar keys %ids;
49 for my $id (keys %ids) {
50         printf DATA "%d\n", $id;
51 }
52 for my $ref (@games) {
53         printf DATA "%d %d %d %d %f\n", $ref->{'p1'}, $ref->{'p2'}, $ref->{'maalfor'}, $ref->{'maalmot'}, $ref->{'vekt'};
54 }
55 close DATA;
56
57 $dbh->do('DELETE FROM ratings');
58 my $iq = $dbh->prepare('INSERT INTO ratings ( id, rating, rating_stddev ) VALUES (?, ?, ?)');
59
60 open RATINGS, "$config::base_dir/bayeswf < $tmpnam |"
61         or die "bayeswf: $!";
62 while (<RATINGS>) {
63         /(.*) (.*) (.*)/ or next;
64         $iq->execute($3, $1, $2);
65 }
66
67 $dbh->commit;
68 unlink($tmpnam);