12 if (/^(.*)(#.*): ([\d\.]+)$/) {
13 push @presets, $1 unless defined $presets{$1};
14 push @{$presets{$1}}, $3;
15 $maxval = $3 if $maxval < $3;
23 <meta http-equiv="Content-Type" content="text/html; charset=ASCII" />
24 <title>Puzzle generation-time benchmarks</title>
25 <script type="text/javascript">
27 function choose_scale_ticks(scale) {
28 var nscale = 1, j = 0, factors = [2,2.5,2];
29 while (scale / nscale > 20) {
31 j = (j+1) % factors.length;
35 function initPlots() {
36 var canvases = document.getElementsByTagName('canvas');
37 for (var i = 0; i < canvases.length; i++) {
38 var canvas = canvases[i];
39 var scale = eval(canvas.getAttribute("data-scale"));
40 var add = 20.5, mult = (canvas.width - 2*add) / scale;
41 var data = eval(canvas.getAttribute("data-points"));
42 var ctx = canvas.getContext('2d');
43 ctx.lineWidth = '1px';
44 ctx.lineCap = 'round';
45 ctx.lineJoin = 'round';
46 ctx.strokeStyle = ctx.fillStyle = '#000000';
47 if (data === "scale") {
49 ctx.font = "16px sans-serif";
50 ctx.textAlign = "center";
51 ctx.textBaseline = "alphabetic";
52 var nscale = choose_scale_ticks(scale);
53 for (var x = 0; x <= scale; x += nscale) {
55 ctx.moveTo(add+mult*x, canvas.height);
56 ctx.lineTo(add+mult*x, canvas.height - 3);
58 ctx.fillText(x + "s", add+mult*x, canvas.height - 6);
62 function quantile(x) {
63 var n = (data.length * x) | 0;
64 return (data[n-1] + data[n]) / 2;
67 var q1 = quantile(0.25), q2 = quantile(0.5), q3 = quantile(0.75);
69 var top = 0.5, bot = canvas.height - 1.5, mid = (top+bot)/2;
70 var wlo = null, whi = null; // whisker ends
72 ctx.strokeStyle = '#bbbbbb';
73 var nscale = choose_scale_ticks(scale);
74 for (var x = 0; x <= scale; x += nscale) {
76 ctx.moveTo(add+mult*x, 0);
77 ctx.lineTo(add+mult*x, canvas.height);
80 ctx.strokeStyle = '#000000';
84 if (x >= q1 - 1.5 * iqr && x <= q3 + 1.5 * iqr) {
85 if (wlo === null || wlo > x)
87 if (whi === null || whi < x)
91 ctx.arc(add+mult*x, mid, 2, 0, 2*Math.PI);
93 if (x >= q1 - 3 * iqr && x <= q3 + 3 * iqr)
101 ctx.moveTo(add+mult*q1, top);
102 ctx.lineTo(add+mult*q3, top);
103 ctx.lineTo(add+mult*q3, bot);
104 ctx.lineTo(add+mult*q1, bot);
108 ctx.moveTo(add+mult*q2, top);
109 ctx.lineTo(add+mult*q2, bot);
112 ctx.moveTo(add+mult*q1, mid);
113 ctx.lineTo(add+mult*wlo, mid);
114 ctx.moveTo(add+mult*wlo, top);
115 ctx.lineTo(add+mult*wlo, bot);
118 ctx.moveTo(add+mult*q3, mid);
119 ctx.lineTo(add+mult*whi, mid);
120 ctx.moveTo(add+mult*whi, top);
121 ctx.lineTo(add+mult*whi, bot);
130 <body onLoad="initPlots();">
131 <h1 align=center>Puzzle generation-time benchmarks</h1>
133 <tr><th>Preset</th><td><canvas width=700 height=30 data-points='"scale"' data-scale="$maxval"></td></tr>
136 for my $preset (@presets) {
137 print "<tr><td>", &escape($preset), "</td><td><canvas width=700 height=15 data-points=\"[";
138 print join ",", sort { $a <=> $b } @{$presets{$preset}};
139 print "]\" data-scale=\"$maxval\"></td></tr>\n";
149 $text =~ s/&/&/g;