]> mj.ucw.cz Git - eval.git/blob - mop/calibrate/cal-try.sh
mop: Added utilities for calibration of time limits
[eval.git] / mop / calibrate / cal-try.sh
1 #!/usr/bin/perl
2 # Time limit calibrator: Simulation
3 # (c) 2010 Martin Mares <mj@ucw.cz>
4
5 use strict;
6 use warnings;
7 use List::Util qw(max);
8
9 my $t = $ARGV[0] or die;
10 my $thresh = $ARGV[1] || 999;
11 my $debug = 0;
12
13 my %want = ();
14 my %points = ();
15 my %times = ();
16
17 for my $a (<cal/$t/*.points>) {
18         my $sol = $a;
19         $sol =~ s/^.*\///;
20         $sol =~ s/\.points$//;
21         my ($want) = ($sol =~ m{(\d+)}) or die "Cannot parse $sol\n";
22         print "$sol (want $want):" if $debug;
23         $want{$sol} = $want;
24
25         open PTS, $a or die;
26         while (<PTS>) {
27                 chomp;
28                 my ($test, $pts, $comment) = split /\s+/;
29                 $points{$sol}{$test} = $pts;
30         }
31         close PTS;
32
33         open LOG, "cal/$t/$sol.log" or die;
34         while (<LOG>) {
35                 chomp;
36                 my ($test, $time) = m{/(\d+[a-z]*)\.log:.*\(([0-9.]+) } or die "Log parse error: $_";
37                 $times{$sol}{$test} = $time;
38         }
39         close LOG;
40
41         for my $t (sort keys %{$points{$sol}}) {
42                 defined $times{$sol}{$t} or $times{$sol}{$t}=0;
43                 print " $t:", $points{$sol}{$t}, "/", $times{$sol}{$t} if $debug;
44         }
45
46         print "\n" if $debug;
47 }
48
49 print "\n## Threshold=$thresh\n\n";
50
51 for my $s (sort keys %want) {
52         my %groups = ();
53         my %oks = ();
54         my %pts = ();
55         my $maxtime = 0;
56         my @acc;
57         my $lastg = '';
58         for my $t (sort keys %{$points{$s}}) {
59                 my $g = $t;
60                 $g =~ s{\D+}{};
61                 if ($g ne $lastg && $lastg ne '') {
62                         push @acc, "|";
63                 }
64                 $lastg = $g;
65                 $groups{$g}++;
66                 $oks{$g} += 0;
67                 if ($times{$s}{$t} <= $thresh) {
68                         push @acc, ($points{$s}{$t} ? "+" : 0);
69                         $pts{$g} = $points{$s}{$t};
70                         $oks{$g}++ if $points{$s}{$t};
71                         $maxtime = max($maxtime, $times{$s}{$t});
72                 } else {
73                         push @acc, "T";
74                 }
75         }
76
77         my $sum = 0;
78         for my $g (keys %groups) {
79                 if ($groups{$g} == $oks{$g}) {
80                         $sum += $pts{$g};
81                 }
82         }
83         printf "%-40s %2d/%2d  %2.3f  %s\n", $s, $sum, $want{$s}, $maxtime, join("", @acc);
84 }