belive: Remove the visited bitset for liveness calculation.
[libfirm] / scripts / statev_examples / plottools.pl
1 #!/usr/bin/perl -w
2
3 our $tikzinterval_x;
4 our $tikzinterval_y;
5
6 $tikzlen_x = "0.2cm";
7 $tikzlen_y = "0.2cm";
8 $labelspace_x = "0.3cm";
9 $labelspace_y = "0.3cm";
10
11 sub set_data_bounds_from_data {
12         my $values = shift;
13
14         foreach $aref ( @$values ) {
15                 my $x = @$aref[0];
16                 my $y = @$aref[1];
17                 if(!defined($minx)) {
18                         $minx = $maxx = $x;
19                         $miny = $maxy = $y;
20                 }
21                 $minx = $x if $x < $minx;
22                 $maxx = $x if $x > $maxx;
23                 $miny = $y if $y < $miny;
24                 $maxy = $y if $y > $maxy;
25         }
26 }
27
28 sub set_data_bounds {
29         ($minx, $miny, $maxx, $maxy) = @_;
30 }
31
32 sub setup_transforms {
33         $addx = -$minx;
34         $addy = -$miny;
35         $scalex = $box_width / ($maxx - $minx);
36         $scaley = $box_height / ($maxy - $miny);
37 }
38
39 sub set_picture_size {
40         ($box_width, $box_height) = @_;
41 }
42
43 sub outputcoord {
44         my $x = shift;
45         my $y = shift;
46         my $optional = shift;
47
48         $x = ($x + $addx) * $scalex;
49         $y = ($y + $addy) * $scaley;
50         print("(");
51         if(defined($optional)) {
52                 print("[$optional]");
53         }
54         print(" $x, $y)");
55 }
56
57 sub outputpoint {
58         my $x = shift;
59         my $y = shift;
60         $x = ($x + $addx) * $scalex;
61         $y = ($y + $addy) * $scaley;
62         print "\\pgfpoint{${x}cm}{${y}cm}";
63 }
64
65 sub outputbox {
66         my ($tikzinterval_x, $tikzinterval_y) = @_;
67         setup_transforms();
68 print <<__EOF__;
69         \\begin{scope}
70                 \\draw (0, 0) rectangle +($box_width, $box_height);
71 __EOF__
72
73         my $t;
74         for($t = $minx; $t < $maxx; $t += $tikzinterval_x) {
75                 print "\t\t\\node at ";
76                 outputcoord($t, $miny, "yshift=-$labelspace_x");
77                 print " { $t };\n";
78                 print "\t\t\\draw ";
79                 outputcoord($t, $miny);
80                 print " -- ";
81                 outputcoord($t, $miny, "yshift=$tikzlen_x");
82                 print ";\n";
83         }
84
85         for($t = $miny; $t < $maxy; $t += $tikzinterval_y) {
86                 print "\t\t\\node at ";
87                 outputcoord($minx, $t, "xshift=-$labelspace_y");
88                 print " { $t };\n";
89                 print "\t\t\\draw ";
90                 outputcoord($minx, $t);
91                 print " -- ";
92                 outputcoord($minx, $t, "xshift=$tikzlen_y");
93                 print ";\n";
94         }
95
96         print <<__EOF__;
97         \\end{scope}
98 __EOF__
99 }
100
101 sub plot {
102         my $values = shift;
103
104         print <<__EOF__;
105         \\pgfplotstreamstart
106 __EOF__
107
108         VALUE: foreach $aref ( @$values ) {
109                 my $x = @$aref[0];
110                 my $y = @$aref[1];
111                 next VALUE if !defined($x) || !defined($y);
112                 next VALUE if $x < $minx or $x >= $maxx or $y < $miny or $y >= $maxy;
113
114                 print "\t\t\\pgfplotstreampoint{";
115                 outputpoint($x, $y);
116                 print "}\n";
117         }
118
119         print <<__EOF__;
120         \\pgfplotstreamend
121 __EOF__
122 }
123
124 sub draw_regression {
125         # see http://de.wikipedia.org/wiki/Regressionsanalyse#Berechnung_der_Regressionsgeraden
126         my $values = shift;
127         my $style  = shift;
128         my $start_x = shift;
129         my $end_x   = shift;
130
131         if (!defined($start_x)) { $start_x = $minx; }
132         if (!defined($end_x)) { $end_x = $maxx; }
133
134         my $avg_x = 0.0;
135         my $avg_y = 0.0;
136         my $count = 0.0;
137         V1: foreach $aref (@$values) {
138                 my $x = @$aref[0];
139                 my $y = @$aref[1];
140                 next V1 if (!defined($x) || !defined($y));
141
142                 if ($minx <= $x && $x <= $maxx && $miny <= $y && $y <= $maxy) {
143                         $avg_x += $x;
144                         $avg_y += $y;
145                         $count++;
146                 }
147         }
148         $avg_x /= $count;
149         $avg_y /= $count;
150
151         my $nominator   = 0.0;
152         my $denominator = 0.0;
153         V2: foreach $aref (@$values) {
154                 my $x = @$aref[0];
155                 my $y = @$aref[1];
156                 next V2 if (!defined($x) || !defined($y));
157
158                 if ($minx <= $x && $x <= $maxx && $miny <= $y && $y <= $maxy) {
159                         $nominator   += ($x - $avg_x) * ($y - $avg_y);
160                         $denominator += ($x - $avg_x) * ($x - $avg_x);
161                 }
162         }
163         my $b = $nominator / $denominator;
164         my $a = $avg_y - $b * $avg_x;
165
166         print "\t\\draw[$style] ";
167         outputcoord($start_x, $a + $start_x * $b);
168         print " -- ";
169         outputcoord($end_x, $a + $end_x * $b);
170         print ";\n";
171 }