diff options
Diffstat (limited to 'doc/threads/stats-filter-2d.pl')
-rw-r--r-- | doc/threads/stats-filter-2d.pl | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/doc/threads/stats-filter-2d.pl b/doc/threads/stats-filter-2d.pl new file mode 100644 index 00000000..70ce335a --- /dev/null +++ b/doc/threads/stats-filter-2d.pl @@ -0,0 +1,137 @@ +#!/usr/bin/perl + +use common::sense; +use Data::Dump; +use List::Util; + +my @GROUP_BY = qw/VERSION PEERS TOTAL_ROUTES/; +my @VALUES = qw/TIMEDIF/; + +my ($FILE, $TYPE, $OUTPUT) = @ARGV; + +### Load data ### +my %data; +open F, "<", $FILE or die $!; +my @header = split /;/, <F>; +chomp @header; + +my $line = undef; +while ($line = <F>) +{ + chomp $line; + $line =~ s/;;(.*);;/;;\1;/; + $line =~ s/v2\.0\.8-1[89][^;]+/bgp/; + $line =~ s/v2\.0\.8-[^;]+/sark/; + $line =~ s/master;/v2.0.8;/; + my %row; + @row{@header} = split /;/, $line; + push @{$data{join ";", @row{@GROUP_BY}}}, { %row } if $row{TYPE} eq $TYPE; +} + +### Do statistics ### +sub avg { + return List::Util::sum(@_) / @_; +} + +sub stdev { + my $avg = shift; + return 0 if @_ <= 1; + return sqrt(List::Util::sum(map { ($avg - $_)**2 } @_) / (@_-1)); +} + +my %output; +my %vers; +my %peers; + +STATS: +foreach my $k (keys %data) +{ + my %cols = map { my $vk = $_; $vk => [ map { $_->{$vk} } @{$data{$k}} ]; } @VALUES; + + my %avg = map { $_ => avg(@{$cols{$_}})} @VALUES; + my %stdev = map { $_ => stdev($avg{$_}, @{$cols{$_}})} @VALUES; + + foreach my $v (@VALUES) { + next if $stdev{$v} / $avg{$v} < 0.035; + + for (my $i=0; $i<@{$cols{$v}}; $i++) + { + my $dif = $cols{$v}[$i] - $avg{$v}; + next if $dif < $stdev{$v} * 2 and $dif > $stdev{$v} * (-2); +=cut + printf "Removing an outlier for %s/%s: avg=%f, stdev=%f, variance=%.1f%%, val=%f, valratio=%.1f%%\n", + $k, $v, $avg{$v}, $stdev{$v}, (100 * $stdev{$v} / $avg{$v}), $cols{$v}[$i], (100 * $dif / $stdev{$v}); +=cut + splice @{$data{$k}}, $i, 1, (); + redo STATS; + } + } + + $vers{$data{$k}[0]{VERSION}}++; + $peers{$data{$k}[0]{PEERS}}++; + $output{$data{$k}[0]{VERSION}}{$data{$k}[0]{PEERS}}{$data{$k}[0]{TOTAL_ROUTES}} = { %avg }; +} + +(3 == scalar %vers) and $vers{sark} and $vers{bgp} and $vers{"v2.0.8"} or die "vers size is " . (scalar %vers) . ", items ", join ", ", keys %vers; + +### Export the data ### + +open PLOT, "|-", "gnuplot" or die $!; + +say PLOT <<EOF; +set logscale + +set term pdfcairo size 20cm,15cm + +set xlabel "Total number of routes" offset 0,-1.5 +set xrange [10000:1500000] +set xtics offset 0,-0.5 +set xtics (10000,15000,30000,50000,100000,150000,300000,500000,1000000) + +set ylabel "Time to converge (s)" +set yrange [0.5:10800] + +set grid + +set key right bottom + +set output "$OUTPUT" +EOF + +my @colors = ( + [ 1, 0.3, 0.3 ], + [ 1, 0.7, 0 ], + [ 0.3, 1, 0 ], + [ 0, 1, 0.3 ], + [ 0, 0.7, 1 ], + [ 0.3, 0.3, 1 ], +); + +my $steps = (scalar %peers) - 1; + +my @plot_data; +foreach my $v (sort keys %vers) { + my $color = shift @colors; + my $endcolor = shift @colors; + my $stepcolor = [ map +( ($endcolor->[$_] - $color->[$_]) / $steps ), (0, 1, 2) ]; + + foreach my $p (sort { int $a <=> int $b } keys %peers) { + my $vnodot = $v; $vnodot =~ s/\.//g; + say PLOT "\$data_${vnodot}_${p} << EOD"; + foreach my $tr (sort { int $a <=> int $b } keys %{$output{$v}{$p}}) { + say PLOT "$tr $output{$v}{$p}{$tr}{TIMEDIF}"; + } + say PLOT "EOD"; + + my $colorstr = sprintf "linecolor rgbcolor \"#%02x%02x%02x\"", map +( int($color->[$_] * 255 + 0.5)), (0, 1, 2); + push @plot_data, "\$data_${vnodot}_${p} using 1:2 with lines $colorstr linewidth 2 title \"$v, $p peers\""; + $color = [ map +( $color->[$_] + $stepcolor->[$_] ), (0, 1, 2) ]; + } +} + +push @plot_data, "2 with lines lt 1 dashtype 2 title \"Measurement instability\""; + +say PLOT "plot ", join ", ", @plot_data; +close PLOT; + + |