| Revision 172 (by dpavlin, 2010/02/21 14:33:05) |
show symetrical transfer as single dashed edge
|
#!/usr/bin/perl
use warnings;
use strict;
my $graph;
my ($max,$min);
foreach my $file ( glob '*/*.np' ) {
my $direction = $file;
$direction =~ s/\.np$//;
my ( $from, $to ) = split(m{/},$direction,2);
my $line = `tail -1 $file`;
$line =~ s{^\s+}{};
$line =~ s{\s+$}{};
my ( $size, $speed, $rtt ) = split(/\s+/, $line);
warn "$from -> $to | $size | $speed | $rtt\n";
my $len = int($speed / 100);
my $rev = qq|"$to" -> "$from"|;
# make edge bi-directional if speed difference is less then 10%
if ( $graph->{$rev} && abs($graph->{$rev}->{speed}->[0] - $speed) < ($speed/10) ) {
$graph->{$rev}->{speed}->[1] = int($speed);
$graph->{$rev}->{dir} = 'both';
} else {
$graph->{ qq|"$from" -> "$to"| } = {
size => $size,
speed => [ int($speed) ],
rtt => $rtt,
dir => 'forward',
};
}
$min ||= $speed;
$min = $speed if $speed < $min;
$max ||= $speed;
$max = $speed if $speed > $max;
}
warn "# speed $min ... $max\n";
print qq|
digraph "netpipe" {
|,
join("\n", map {
my $node = $_;
my @speed = @{ $graph->{$node}->{speed} };
my $speed = 0;
$speed += $_ foreach @speed;
$speed /= $#speed + 1;
my $c = 'ff0000';
$c = '00ff00' if ( $speed / 100 ) > 5;
$c = '0000ff' if ( $speed / 1000 ) > 1;
$c = '8888ff' if ( $speed / 1000 ) > 2;
my $label = qq|labelfontsize=10,weight=$speed,|;
$label .= qq|headlabel=$speed[0],| if $speed[0];
$label .= qq|taillabel=$speed[1],| if $speed[1];
$label .= qq|style=dashed,| if $graph->{$node}->{dir} eq 'both';
qq|$node [ $label color="#$c",dir=$graph->{$node}->{dir} ]|;
} keys %$graph),
qq|
}
|;