#!/usr/bin/perl

$DIR = "results";

if ($ARGV[0] == 1) {
	`$0 | pl -x11 ~/bin/ploticus_stack.pl data=- delim=tab x=1 y=5 y2=11 y3=13 err=10 errunder=yes xlbl="Type" name="Overhead" name2="Remote Get" name3="Remote Set" ylbl="Messages (1000s)" color="black" color2="blue" color3="orange" title="Comparison of Different Token Assignment Strategies" legend="max-1 max"`;
	`$0 | pl -eps -o data1.eps ~/bin/ploticus_stack.pl data=- delim=tab x=1 y=5 y2=11 y3=13 err=10 errunder=yes xlbl="Type" name="Overhead" name2="Remote Get" name3="Remote Set" ylbl="Messages (1000s)" color="black" color2="blue" color3="orange" title="Comparison of Different Token Assignment Strategies" legend="max-1 max"`;
	exit;
} elsif ($ARGV[0] == 2) {
	`$0 | pl -x11 -prefab vbars data=- delim=tab x=1 y=7 err=8 errunder=yes xlbl="Type" name="Duration" ylbl="Time (sec)" -ylbldet=adjust=-0.2,0 color="blue" title="Comparison of Different Token Assignment Strategies" legend="max-1 max"`;
	`$0 | pl -eps -o data2.eps -prefab vbars data=- delim=tab x=1 y=7 err=8 errunder=yes xlbl="Type" name="Duration" ylbl="Time (sec)" -ylbldet=adjust=-0.2,0 color="blue" title="Comparison of Different Token Assignment Strategies" legend="max-1 max"`;
	exit;
}

@TESTS = (1, 2, 5, 7, 3, 6, 8, 0, 11, 9, 10);

for $i (@TESTS) {
	undef @REMOTE;
	undef @REMOTEGET;
	undef @REMOTESET;
	undef @OVERHEAD;
	undef @LOCAL;
	undef @DURATION;
	undef @COST;

	for ($n = 0; true; $n++) {
		$loc = "$DIR-$i.$n";
		last if (! -e $loc);
		open FH, "$loc/stats.txt";
		<FH>;
		push (@COST, 0);
		while (<FH>) {
			last if (/^--/);
			chomp();
			($name, $value) = split(/\t/);
			push (@REMOTE, ($value / 1000)) if ($name eq "REMOTE");
			$COST[$#COST] += ($value / 1000) if ($name eq "REMOTE");
			push (@OVERHEAD, ($value / 1000)) if ($name eq "OVERHEAD");
			$COST[$#COST] += ($value / 1000) if ($name eq "OVERHEAD");
			push (@LOCAL, ($value / 1000)) if ($name eq "LOCAL");
			push (@DURATION, $value) if ($name eq "DURATION");
		}
		while (<FH>) {
			last if (/^--/);
			chomp();
			($name, $value) = split(/\t/);
			push (@REMOTEGET, ($value / 1000)) if ($name eq "REMOTE GET");
			push (@REMOTESET, ($value / 1000)) if ($name eq "REMOTE SET");
		}
		close FH;
	}
	next if ($n == 0);

	$type = "S" if ($i == 0);
	$type = "C" if ($i == 1);
	$type = "LW" if ($i == 2);
	$type = "LWP" if ($i == 3);
	$type = "LR" if ($i == 4);
	$type = "FR" if ($i == 5);
	$type = "FRP" if ($i == 6);
	$type = "FW" if ($i == 7);
	$type = "FWP" if ($i == 8);
	$type = "FWAP" if ($i == 9);
	$type = "SAP" if ($i == 10);
	$type = "FRAP" if ($i == 11);

	print join ("\t", $type,
		computeaverage(@LOCAL),
		computeaverage(@REMOTE),
		computestddev(@REMOTE),
		computeaverage(@OVERHEAD),
		computestddev(@OVERHEAD),
		computeaverage(@DURATION),
		computestddev(@DURATION),
		computeaverage(@COST),
		computestddev(@COST),
		computeaverage(@REMOTEGET),
		computestddev(@REMOTEGET),
		computeaverage(@REMOTESET),
		computestddev(@REMOTESET)
	) . "\n" if (1);
	print join ("\t", $type, @DURATION) . "\n" if (0);
}

sub computeaverage() {
	my (@array) = @_;
	my $total = 0;

	for (my $i = 0; $i < @array; $i++) {
		$total += $array[$i];
	}

	return (@array > 0) ? $total / @array : 0;
}

sub computestddev() {
	my (@array) = @_;
	my $average = &computeaverage(@array);
	my $total = 0;

	for (my $i = 0; $i < @array; $i++) {
		$total += ($array[$i] - $average) * ($array[$i] - $average);
	}

	return (@array > 1) ? sqrt($total / (@array - 1)) : 0;
}

