X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a63b491b014ce7061f61b6fd94876b9abd6ceff2..a2aa100e524cc55b0d79218ab9d3d577e761017d:/tools/platform_generation/graph_viz.pm diff --git a/tools/platform_generation/graph_viz.pm b/tools/platform_generation/graph_viz.pm new file mode 100644 index 0000000000..2338d07ff0 --- /dev/null +++ b/tools/platform_generation/graph_viz.pm @@ -0,0 +1,321 @@ +#!/usr/bin/perl -w +use strict; + +################################# +### GRAPH VISUALISATION ### +################################# + +sub graph2viz{ + my($nodes,$edges,$filename) = @_; + + open VIZ, "> $filename.dot"; + print VIZ "graph essai { \n"; + print VIZ " graph [overlap=scale]\n"; + #print VIZ " graph [overlap=false spline=true]\n"; + print VIZ " node [shape=box, style=filled]\n"; + print VIZ " node [width=.3, height=.3, style=filled, color=skyblue]\n"; + + my($u,$e); + foreach $u (sort (keys %$nodes)){ + print VIZ " \"$u\" [label=\"$u\""; +# if((defined($$nodes{$u}{max_interf}))&&($$nodes{$u}{max_interf}==1)) {print VIZ ",color=green";} + if(defined($$nodes{$u}{host}) && ($$nodes{$u}{host}==1)) {print VIZ ",color=red";} + print VIZ "];\n"; + } + + foreach $e (sort (keys %$edges)){ + my($src)=$$edges{$e}{src}; + my($dst)=$$edges{$e}{dst}; +# my($len)=log(10000/$$edges{$e}{bw}); + print VIZ " \"$src\" -- \"$dst\" ["; +# print VIZ "len=$len"; +# print VIZ "label=$e"; + if($#{$$edges{$e}{using_path}}>=0) { + print VIZ "color=red"; + } else { + print VIZ "color=gray"; + } + print VIZ "];\n"; + } + + print VIZ "}\n"; + close VIZ; + + system("neato -Tps $filename.dot > $filename.ps"); +# system("gv $filename.ps"); + system("pstoedit -f fig $filename.ps $filename.fig 2>/dev/null"); +# system("xfig -startg 0 $filename.fig "); +} + +sub digraph2viz{ + my($nodes,$edges,$filename) = @_; + + open VIZ, "> $filename.dot"; + print VIZ "digraph essai { \n"; + print VIZ " graph [overlap=scale]\n"; + #print VIZ " graph [overlap=false spline=true]\n"; + print VIZ " node [shape=box, style=filled]\n"; + print VIZ " node [width=.3, height=.3, style=filled, color=skyblue]\n"; + + my($u,$e); + foreach $u (sort (keys %$nodes)){ + print VIZ " $u [label=$u"; + if((defined($$nodes{$u}{host}))&&($$nodes{$u}{host}==1)) {print VIZ ",color=red";} + print VIZ "];\n"; + } + + foreach $e (sort (keys %$edges)){ + my($src)=$$edges{$e}{src}; + my($dst)=$$edges{$e}{dst}; +# my($len)=log(10000/$$edges{$e}{bw}); + print VIZ " $src -> $dst\n"; +# print VIZ "len=$len"; +# print VIZ "label=$e"; + } + + print VIZ "}\n"; + close VIZ; + + system("dot -Tps $filename.dot > $filename.ps"); +# system("gv $filename.ps"); + system("pstoedit -f fig $filename.ps $filename.fig 2>/dev/null"); + system("xfig -startg 0 $filename.fig "); +} + +sub graph2fig_basic{ + my($nodes,$edges,$filename) = @_; + + open VIZ, "> $filename.fig"; + + print VIZ "#FIG 3.2\n"; + print VIZ "Landscape\n"; + print VIZ "Center\n"; + print VIZ "Metric\n"; + print VIZ "A4\n"; + print VIZ "100.00\n"; + print VIZ "Single\n"; + print VIZ "-2\n"; + print VIZ "1200 2\n"; + + my($scale)=5; + + my($u,$e); + foreach $u (sort (keys %$nodes)){ + my($x) = $scale * $$nodes{$u}{X}; + my($y) = $scale * $$nodes{$u}{Y}; + print VIZ "4 1 0 50 -1 0 12 0.0000 0 135 270 $x $y $u\\001\n"; + } + + foreach $e (sort (keys %$edges)){ + my($src)=$$edges{$e}{src}; + my($dst)=$$edges{$e}{dst}; + my($x1) = $scale * $$nodes{$src}{X}; + my($y1) = $scale * $$nodes{$src}{Y}; + my($x2) = $scale * $$nodes{$dst}{X}; + my($y2) = $scale * $$nodes{$dst}{Y}; + print VIZ "2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2\n"; + print VIZ "\t $x1 $y1 $x2 $y2\n"; + } + close VIZ; + + system("xfig -startg 0 $filename.fig "); +} + +sub interfgraph2viz{ + my($nodes,$edges,$count_interferences,$value_interferences,$figbase,$filename) = @_; + + system("cp $figbase.fig $filename.fig"); + open FIG, ">> $filename.fig"; + my($e); + foreach $e (@{$$count_interferences{$value_interferences}}){ + my($src)=$$e[0]; + my($dst)=$$e[1]; + my(@tab); + print STDERR "($src - $dst)\n"; + $src = `grep ' $src\\\\001' $filename.fig`; + $dst = `grep ' $dst\\\\001' $filename.fig`; + @tab = split(/\s+/,$src); + my($x1) = $tab[11]; + my($y1) = $tab[12]; + @tab = split(/\s+/,$dst); + my($x2) = $tab[11]; + my($y2) = $tab[12]; + print FIG "2 1 0 3 14 7 999 -1 -1 0.000 0 0 -1 0 0 2\n"; + print FIG "\t $x1 $y1 $x2 $y2\n"; +# print VIZ " $src -- $dst [color=green];\n"; + } + close(FIG); +# system("xfig -startg 0 $filename.fig "); + system("fig2dev -L png $filename.fig $filename.png"); + unlink("$filename.fig"); +} + + +sub graph_get_layout{ + my($nodes,$edges,$filename) = @_; + + graph2viz($nodes,$edges,$filename); + + my($u); + foreach $u (sort (keys %$nodes)){ + my($val_u) = `grep ' $u\\\\001' $filename.fig`; + my(@tab) = split(/\s+/,$val_u); + my($x1) = $tab[11]; + my($y1) = $tab[12]; + $$nodes{$u}{X}=$x1; + $$nodes{$u}{Y}=$y1; + } +} + +sub graph2viz_withlayout{ + my($nodes,$edges,$filename) = @_; + + open FIG, ">> $filename.fig"; + my($e,$u); + foreach $u (sort (keys %$nodes)){ + my($x1) = int ($$nodes{$u}{X}); + my($y1) = int ($$nodes{$u}{Y}); + 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"; + } + foreach $e (sort (keys %$edges)){ + my($src)=$$edges{$e}{src}; + my($dst)=$$edges{$e}{dst}; + my($x1) = int ($$nodes{$src}{X}); + my($y1) = int ($$nodes{$src}{Y}); + my($x2) = int ($$nodes{$dst}{X}); + my($y2) = int ($$nodes{$dst}{Y}); + print FIG "2 1 0 3 14 7 60 -1 -1 0.000 0 0 -1 0 0 2\n"; + print FIG "\t $x1 $y1 $x2 $y2\n"; + } + close(FIG); +# system("xfig -startg 0 $filename.fig "); +# system("fig2dev -L png $filename.fig $filename.png"); +} + +sub print_matrix{ + my($M) = shift; + + if(!defined($M)) {return;} + my($u,$v); + + my(@node_list) = sort (keys %$M); + my($n) = scalar(@node_list); + + foreach $u (0..$n-1){ + print "=="; + } + print "\n"; + + foreach $u (@node_list){ + if(defined($$M{$u})) { + foreach $v (@node_list){ + if(defined($$M{$u}{$v})){ + print "$$M{$u}{$v} "; + } else { + print " "; + } + } + } + print "\n"; + } + foreach $u (0..$n-1){ + print "=="; + } + print "\n\n"; +} + +sub matrix2viz{ + my($M) = shift; + my($filename) = "foo"; + open VIZ, "> $filename.dot"; + + print VIZ "# Brite topology translated by Alvin\n"; + print VIZ "graph essai { \n"; + print VIZ " graph [overlap=scale]\n"; + + #print VIZ " graph [overlap=false spline=true]\n"; + print VIZ " node [shape=box, style=filled]\n"; + print VIZ " node [width=.3, height=.3, style=filled, color=skyblue]\n"; + my(@node_list) = sort (keys %$M); + my($n) = scalar(@node_list); + + my($u,$v); + foreach $u (@node_list){ + print VIZ " $u [label=$u, color = red];\n"; + } + + foreach $u (@node_list){ + foreach $v (@node_list){ + if($$M{$u}{$v}!=0){ + print VIZ " $u -- $v ;\n"; + } + } + } + print VIZ "}\n"; + close VIZ; + + system("neato -Tps $filename.dot > $filename.ps"); + system("gv $filename.ps"); +} + + +sub print_object { + my($M) = @_; + my($key); + if(!defined($M)) { + } elsif (!ref($M)) { + print "\"$M\""; + return; + } elsif (ref($M) eq "SCALAR") { + print "\"$$M\""; + return; + } elsif (ref($M) eq "HASH") { + print "{"; + foreach $key (sort (keys %{$M})) { + if($key eq "number_hops") {next;} + if($key eq "shortest_route") {next;} + if($key eq "using_path") {next;} + print "\"$key\" => "; + print_object($$M{$key}); + print "," + } + print "}"; + } elsif (ref($M) eq "ARRAY") { + print "["; + foreach $key (0..$#$M) { + print_object($$M[$key]); + print "," + } + print "]"; + } else { + } +} + +# sub print_object{ +# my($indent,$M) = @_; +# my($key); +# if (!ref($M)) { +# print "$M"; +# return; +# } elsif (ref($M) eq "SCALAR") { +# print "$$M"; +# return; +# } elsif (ref($M) eq "HASH") { +# print "\n"; +# foreach $key (sort (keys %{$M})) { +# print "$indent $key => { "; +# print_object($indent." ", $$M{$key}); +# print "$indent }\n" +# } +# } elsif (ref($M) eq "ARRAY") { +# print "\n"; +# foreach $key (0..$#$M) { +# print "$indent $key : ["; +# print_object($indent." ", $$M[$key]); +# print "$indent ]\n" +# } +# } else { +# } +# } + +1;