]> mj.ucw.cz Git - anim.git/blob - goldberg.pl
Ported to Gtk3
[anim.git] / goldberg.pl
1 #!/usr/bin/perl -W
2
3 use strict;
4 use warnings;
5 use utf8;
6 use lib ".";
7
8 use Gtk3 -init;
9 use Cairo;
10
11 use AA;
12 use AA::Gfx;
13 use AA::UI;
14 use AA::Graph;
15 use AA::Net;
16 use AA::Anim;
17
18 my $show = shift @ARGV;
19 my $output = shift @ARGV || "";
20
21 my $ui = AA::UI->new($output);
22
23 my $back = AA::Background->new('bg');
24
25 my $title = AA::Label->new('title');
26 $title->MultiSet(
27         'text' => "Goldberg's Algorithm",
28         'size' => 60,
29         'x' => 1024/2,
30         'y' => 80,
31 );
32
33 my @v;
34 for (my $i=0; $i<5; $i++) {
35         my $v = AA::NetV->new("v$i");
36         $v->MultiSet(
37                 'x' => 100 + 180*$i,
38                 'y0' => 600,
39                 'label' => ($i == 0) ? "Z" : ($i == 4) ? "S" : $i,
40                 'h' => ($i == 0) ? 5 : 0,
41         );
42         push @v, $v;
43 }
44
45 my @e;
46 for (my $i=0; $i<4; $i++) {
47         my $e = AA::NetE->new("e$i", $v[$i], $v[$i+1]);
48         $e->Set('c', 5);
49         $e->Set('f', 0);
50         push @e, $e;
51 }
52
53 for (my $i=1; $i<@v; $i++) {
54         my $ii = $i;    # need to keep a copy in the current closure
55         $v[$i]->Bind('xs', sub { $e[$ii-1]->Get('f') - (($ii == @v-1) ? 0 : $e[$ii]->Get('f')) });
56 }
57 $v[4]->{XS}->Set('color', [0,1,0]);
58
59 sub flow($$) {
60         my ($i,$df) = @_;
61         $e[$i]->Set('f', $e[$i]->Get('f') + $df);
62 }
63
64 sub up($) {
65         my ($i) = @_;
66         my $v = $v[$i];
67         my $h = $v[$i]->Get('h');
68         $v->SetTicker('h', $h, $h+1, 10);
69 }
70
71 sub hint($) {
72         my ($h) = @_;
73         AA::Anim->add_final(sub {
74                 for (my $i=0; $i<@v; $i++) {
75                         $v[$i]->Set('hint', $i == $h);
76                 }
77         });
78 }
79
80 my $scenario;
81
82 if (!$show || $show eq "1") {
83         $scenario = [
84                 sub { },
85                 sub { flow(0, 5);       hint(1); },
86                 sub { up(1); },
87                 sub { flow(1, 5);       hint(2); },
88                 sub { up(2); },
89                 sub { flow(2, 5);       hint(3); },
90                 sub { up(3); },
91                 sub { flow(3, 5);       hint(-1); },
92         ];
93 } elsif ($show eq "2") {
94         $title->Set('text', "Goldberg Meets Bottleneck");
95         for (my $i=0; $i<@v-1; $i++) {
96                 $e[$i]->Set('c', 5-$i);
97         }
98         $scenario = [
99                 sub { },
100                 sub { flow(0, 5); hint(1); },
101                 sub { up(1); },
102                 sub { flow(1, 4); hint(2); },
103                 sub { up(2); },
104                 sub { flow(2, 3); hint(3); },
105                 sub { up(3); },
106                 sub { flow(3, 2); },
107                 sub { up(3); },
108                 sub { flow(2, -1); hint(2); },
109                 sub { up(2); },
110                 sub { flow(1, -2); hint(1); },
111                 sub { up(1); },
112                 sub { up(1); },
113                 sub { flow(1, 2); },
114                 sub { up(1); },
115                 sub { up(1); },
116                 sub { up(1); },
117                 sub { flow(0, -1); hint(2); },
118                 sub { up(2); },
119                 sub { flow(2, 1); hint(3); },
120                 sub { up(3); },
121                 sub { up(3); },
122                 sub { flow(2, -1); hint(2); },
123                 sub { up(2); },
124                 sub { up(2); },
125                 sub { flow(2, 1); hint(3); },
126                 sub { up(3); },
127                 sub { up(3); },
128                 sub { flow(2, -1); hint(2); },
129                 sub { up(2); },
130                 sub { up(2); },
131                 sub { flow(2, 1); },
132                 sub { flow(1, -1); hint(1); },
133                 sub { flow(0, -1); hint(3); },
134                 sub { up(3); },
135                 sub { up(3); },
136                 sub { flow(2, -1); hint(2); },
137                 sub { flow(1, -1); hint(1); },
138                 sub { flow(0, -1); hint(-1); },
139         ];
140 } elsif ($show eq "3") {
141         $title->Set('text', "Goldberg with Max Height Rule");
142         for (my $i=0; $i<@v-1; $i++) {
143                 $e[$i]->Set('c', 5-$i);
144         }
145         $scenario = [
146                 sub { },
147                 sub { flow(0, 5); hint(1); },
148                 sub { up(1); },
149                 sub { flow(1, 4); },
150                 sub { up(1); },
151                 sub { up(1); },
152                 sub { up(1); },
153                 sub { up(1); },
154                 sub { up(1); },
155                 sub { flow(0, -1); hint(2); },
156                 sub { up(2); },
157                 sub { flow(2, 3); },
158                 sub { up(2); },
159                 sub { up(2); },
160                 sub { up(2); },
161                 sub { up(2); },
162                 sub { up(2); },
163                 sub { up(2); },
164                 sub { flow(1, -1); hint(1); },
165                 sub { flow(0, -1); hint(3); },
166                 sub { up(3); },
167                 sub { flow(3, 2); },
168                 sub { up(3); },
169                 sub { up(3); },
170                 sub { up(3); },
171                 sub { up(3); },
172                 sub { up(3); },
173                 sub { up(3); },
174                 sub { up(3); },
175                 sub { flow(2, -1); hint(2); },
176                 sub { flow(1, -1); hint(1); },
177                 sub { flow(0, -1); hint(-1); },
178         ];
179 } else {
180         die "What do you want?\n";
181 }
182
183 $ui->RunScenario($scenario);