Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Kill the useless xbt_free (was define'd to free)
[simgrid.git] / tools / platform_generation / graph_viz.pm
1 #!/usr/bin/perl -w
2 use strict;
3
4 #################################
5 ###    GRAPH VISUALISATION    ###
6 #################################
7
8 sub graph2viz{
9     my($nodes,$edges,$filename) = @_;
10
11     open VIZ, "> $filename.dot";
12     print VIZ "graph essai  { \n";
13     print VIZ "  graph [overlap=scale]\n";
14     #print VIZ "  graph [overlap=false spline=true]\n";
15     print VIZ "  node [shape=box, style=filled]\n";
16     print VIZ "  node [width=.3, height=.3, style=filled, color=skyblue]\n";
17
18     my($u,$e);
19     foreach $u (sort (keys %$nodes)){
20         print VIZ "  \"$u\" [label=\"$u\"";
21 #       if((defined($$nodes{$u}{max_interf}))&&($$nodes{$u}{max_interf}==1)) {print VIZ ",color=green";}
22         if(defined($$nodes{$u}{host}) && ($$nodes{$u}{host}==1)) {print VIZ ",color=red";}
23         print VIZ "];\n";
24     }
25
26     foreach $e (sort (keys %$edges)){
27         my($src)=$$edges{$e}{src};
28         my($dst)=$$edges{$e}{dst};
29 #       my($len)=log(10000/$$edges{$e}{bw});
30         print VIZ "  \"$src\" -- \"$dst\" [";
31 #       print VIZ "len=$len";
32 #       print VIZ "label=$e";
33         if($#{$$edges{$e}{using_path}}>=0) {
34             print VIZ "color=red";
35         } else {
36             print VIZ "color=gray";
37         }
38         print VIZ "];\n";
39     }
40
41     print VIZ "}\n";
42     close VIZ;
43
44     system("neato -Tps $filename.dot  > $filename.ps");
45 #    system("gv $filename.ps");
46     system("pstoedit -f fig $filename.ps $filename.fig 2>/dev/null");
47 #    system("xfig -startg 0 $filename.fig ");
48 }
49
50 sub digraph2viz{
51     my($nodes,$edges,$filename) = @_;
52
53     open VIZ, "> $filename.dot";
54     print VIZ "digraph essai  { \n";
55     print VIZ "  graph [overlap=scale]\n";
56     #print VIZ "  graph [overlap=false spline=true]\n";
57     print VIZ "  node [shape=box, style=filled]\n";
58     print VIZ "  node [width=.3, height=.3, style=filled, color=skyblue]\n";
59
60     my($u,$e);
61     foreach $u (sort (keys %$nodes)){
62         print VIZ "  $u [label=$u";
63         if((defined($$nodes{$u}{host}))&&($$nodes{$u}{host}==1)) {print VIZ ",color=red";}
64         print VIZ "];\n";
65     }
66
67     foreach $e (sort (keys %$edges)){
68         my($src)=$$edges{$e}{src};
69         my($dst)=$$edges{$e}{dst};
70 #       my($len)=log(10000/$$edges{$e}{bw});
71         print VIZ "  $src -> $dst\n";
72 #       print VIZ "len=$len";
73 #       print VIZ "label=$e";
74     }
75
76     print VIZ "}\n";
77     close VIZ;
78
79     system("dot -Tps $filename.dot  > $filename.ps");
80 #    system("gv $filename.ps");
81     system("pstoedit -f fig $filename.ps $filename.fig 2>/dev/null");
82     system("xfig -startg 0 $filename.fig ");
83 }
84
85 sub graph2fig_basic{
86     my($nodes,$edges,$filename) = @_;
87
88     open VIZ, "> $filename.fig";
89
90     print VIZ "#FIG 3.2\n";
91     print VIZ "Landscape\n";
92     print VIZ "Center\n";
93     print VIZ "Metric\n";
94     print VIZ "A4\n";
95     print VIZ "100.00\n";
96     print VIZ "Single\n";
97     print VIZ "-2\n";
98     print VIZ "1200 2\n";
99
100     my($scale)=5;
101
102     my($u,$e);
103     foreach $u (sort (keys %$nodes)){
104         my($x) = $scale * $$nodes{$u}{X};
105         my($y) = $scale * $$nodes{$u}{Y};
106         print VIZ "4 1 0 50 -1 0 12 0.0000 0 135 270 $x $y $u\\001\n";
107     }
108
109     foreach $e (sort (keys %$edges)){
110         my($src)=$$edges{$e}{src};
111         my($dst)=$$edges{$e}{dst};
112         my($x1) = $scale * $$nodes{$src}{X};
113         my($y1) = $scale * $$nodes{$src}{Y};
114         my($x2) = $scale * $$nodes{$dst}{X};
115         my($y2) = $scale * $$nodes{$dst}{Y};
116         print VIZ "2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2\n";
117         print VIZ "\t $x1 $y1 $x2 $y2\n";
118     }
119     close VIZ;
120
121     system("xfig -startg 0 $filename.fig ");
122 }
123
124 sub interfgraph2viz{
125     my($nodes,$edges,$count_interferences,$value_interferences,$figbase,$filename) = @_;
126
127     system("cp $figbase.fig $filename.fig");
128     open FIG, ">> $filename.fig";
129     my($e);
130     foreach $e (@{$$count_interferences{$value_interferences}}){
131         my($src)=$$e[0];
132         my($dst)=$$e[1];
133         my(@tab);
134         print STDERR "($src - $dst)\n";
135         $src = `grep ' $src\\\\001' $filename.fig`;
136         $dst = `grep ' $dst\\\\001' $filename.fig`;
137         @tab = split(/\s+/,$src);
138         my($x1) = $tab[11];
139         my($y1) = $tab[12];
140         @tab = split(/\s+/,$dst);
141         my($x2) = $tab[11];
142         my($y2) = $tab[12];
143         print FIG "2 1 0 3 14 7 999 -1 -1 0.000 0 0 -1 0 0 2\n";
144         print FIG "\t $x1 $y1 $x2 $y2\n";
145 #       print VIZ "  $src -- $dst [color=green];\n";
146     }
147     close(FIG);
148 #    system("xfig -startg 0 $filename.fig ");
149     system("fig2dev -L png $filename.fig $filename.png");
150     unlink("$filename.fig");
151 }
152
153
154 sub graph_get_layout{
155     my($nodes,$edges,$filename) = @_;
156
157     graph2viz($nodes,$edges,$filename);
158     
159     my($u);
160     foreach $u (sort (keys %$nodes)){
161         my($val_u) = `grep ' $u\\\\001' $filename.fig`;
162         my(@tab) = split(/\s+/,$val_u);
163         my($x1) = $tab[11];
164         my($y1) = $tab[12];
165         $$nodes{$u}{X}=$x1;
166         $$nodes{$u}{Y}=$y1;
167     }
168 }
169
170 sub graph2viz_withlayout{
171     my($nodes,$edges,$filename) = @_;
172
173     open FIG, ">> $filename.fig";
174     my($e,$u);
175     foreach $u (sort (keys %$nodes)){
176         my($x1) = int ($$nodes{$u}{X});
177         my($y1) = int ($$nodes{$u}{Y});
178         print FIG "1 3 0 1 0 31 50 -1 20 0.000 1 0.0000 $x1 $y1 75 75 $x1 $y1 ".($x1+75)." $y1\n";
179     }
180     foreach $e (sort (keys %$edges)){
181         my($src)=$$edges{$e}{src};
182         my($dst)=$$edges{$e}{dst};
183         my($x1) = int ($$nodes{$src}{X});
184         my($y1) = int ($$nodes{$src}{Y});
185         my($x2) = int ($$nodes{$dst}{X});
186         my($y2) = int ($$nodes{$dst}{Y});
187         print FIG "2 1 0 3 14 7 60 -1 -1 0.000 0 0 -1 0 0 2\n";
188         print FIG "\t $x1 $y1 $x2 $y2\n";
189     }
190     close(FIG);
191 #    system("xfig -startg 0 $filename.fig ");
192 #    system("fig2dev -L png $filename.fig $filename.png");
193 }
194
195 sub print_matrix{
196     my($M) = shift;
197
198     if(!defined($M)) {return;}
199     my($u,$v);
200
201     my(@node_list) = sort (keys %$M);
202     my($n) =  scalar(@node_list);
203
204     foreach $u (0..$n-1){
205         print "==";
206     }
207     print "\n";
208
209     foreach $u (@node_list){
210         if(defined($$M{$u})) {
211             foreach $v (@node_list){
212                 if(defined($$M{$u}{$v})){
213                     print "$$M{$u}{$v} ";
214                 } else {
215                     print "  ";
216                 }
217             }
218         }
219         print "\n";
220     }
221     foreach $u (0..$n-1){
222         print "==";
223     }
224     print "\n\n";
225 }
226
227 sub matrix2viz{
228     my($M) = shift;
229     my($filename) = "foo";
230     open VIZ, "> $filename.dot";
231
232     print VIZ "# Brite topology translated by Alvin\n";
233     print VIZ "graph essai  { \n";
234     print VIZ "  graph [overlap=scale]\n";
235
236     #print VIZ "  graph [overlap=false spline=true]\n";
237     print VIZ "  node [shape=box, style=filled]\n";
238     print VIZ "  node [width=.3, height=.3, style=filled, color=skyblue]\n";
239     my(@node_list) = sort (keys %$M);
240     my($n) =  scalar(@node_list);
241
242     my($u,$v);
243     foreach $u (@node_list){
244         print VIZ "  $u [label=$u, color = red];\n";
245     }
246
247     foreach $u (@node_list){
248         foreach $v (@node_list){
249             if($$M{$u}{$v}!=0){
250                 print VIZ "  $u -- $v ;\n";
251             }
252         }
253     }
254     print VIZ "}\n";
255     close VIZ;
256
257     system("neato -Tps $filename.dot  > $filename.ps");
258     system("gv $filename.ps");
259 }
260
261
262 sub print_object {
263     my($M) = @_;
264     my($key);
265     if(!defined($M)) {
266     } elsif (!ref($M)) {
267         print "\"$M\"";
268         return;
269     } elsif (ref($M) eq "SCALAR") {
270         print "\"$$M\"";
271         return;
272     } elsif (ref($M) eq "HASH") {
273         print "{";
274         foreach $key (sort (keys %{$M})) {
275             if($key eq "number_hops") {next;}
276             if($key eq "shortest_route") {next;}
277             if($key eq "using_path") {next;}
278             print "\"$key\" => ";
279             print_object($$M{$key});
280             print ","
281         }
282         print "}";
283     } elsif (ref($M) eq "ARRAY") {
284         print "[";
285         foreach $key (0..$#$M) {
286             print_object($$M[$key]);
287             print ","
288         }
289         print "]";
290     } else {
291     }
292 }
293
294 # sub print_object{
295 #     my($indent,$M) = @_;
296 #     my($key);
297 #     if (!ref($M)) {
298 #       print "$M";
299 #       return;
300 #     } elsif (ref($M) eq "SCALAR") {
301 #       print "$$M";
302 #       return;
303 #     } elsif (ref($M) eq "HASH") {
304 #       print "\n";
305 #       foreach $key (sort (keys %{$M})) {
306 #           print "$indent $key => { ";
307 #           print_object($indent."  ", $$M{$key});
308 #           print "$indent }\n"
309 #       }
310 #     } elsif (ref($M) eq "ARRAY") {
311 #       print "\n";
312 #       foreach $key (0..$#$M) {
313 #           print "$indent $key : [";
314 #           print_object($indent."  ", $$M[$key]);
315 #           print "$indent ]\n"
316 #       }
317 #     } else {
318 #     }
319 # }
320
321 1;