#!/usr/sww/bin/perl

# die if they didn't give us work to do
#
die "Please enter a list of files (or extensions) to report on!\n"
  if (@ARGV == 0);

# read all the files
#
$maxgen = 0;
for ($i = 0; $i < @ARGV; $i++) {

  # try to open the file
  #
  $file = $ARGV[$i];
  if (!open(DATA, $file)) {
    if (!open(DATA, 'longrun.'.$file)) {
      print STDERR "Couldn't read data file $file!\n";
      next;
    }

    # they only specified the extension
    #
    $file = 'longrun.'.$file;
  }

  # figure out what the array should be called
  #
  if ($file =~ /.*\.([^.]*$)/) {
    $array = $1;
  } else {
    $array = $file;
  }
  push(@arraylist, $array);

  while (<DATA>) {
    if (/[ 0-9]*: Seed=[0-9.]*, Last=([0-9]*), Best=[0-9]*, Time=([0-9.]*)/) {
      ($last,$time) = ($1,$2);
      $cmd = '$' . $array . "[$last]++;";
      eval $cmd;
      $cmd = '$' . $array . "tot[$last] += $time;";
      eval $cmd;
      $cmd = '$' . $array . "cnt[$last]++;";
      eval $cmd;
      $maxgen = $last if ($maxgen < $last);
    } else {
      print STDERR "Mismatch '$_'"
	if (! /^Initial seed = / && !/^\s+[0-9]+: H\[.*\] S\[.*\]/);
    }
  }
  close(DATA);
}

print "   ";
foreach $array (@arraylist) {
  for ($i = 0; $i <= $maxgen; $i++) {
    $cmd = '$' . $array . "[$i] += 0;";
    eval $cmd;
    $cmd = '$total{"' . $array . '"} += $' . $array . "[$i];";
    eval $cmd;
  }
  printf "         %6s          ", $array;
}
print "\n";

for ($i = 0; $i <= $maxgen; $i++) {
  printf "%2d:", $i;
  foreach $array (@arraylist) {
    $cmd = 'printf " %4d",$' . $array . "[$i];";
    eval $cmd;
    $cmd = '$flag = $' . $array . "cnt[$i] > 0;";
    eval $cmd;
    if ($flag) {
      $timeavg = $genavg = 0;
      $cmd = '$timeavg = $genavg = $' . $array . "tot[$i]/" . '$' . $array .
	"cnt[$i] if (" . '$' . $array . "cnt[$i] > 0);";
      eval $cmd;
      $genavg /= $i if ($i > 0);
      $cmd = '$' . $array . 'gentot += $' . $array . "tot[$i];";
      eval $cmd;
      $cmd = '$' . $array . 'gencnt += $' . $array . "cnt[$i] * $i";
      eval $cmd;
    } else {
      $cmd = '$timeavg = $genavg = $' . $array . "tot[$i];";
      eval $cmd;
    }
    $cmd = '$flag = $' . $array . "tot[$i] > 0;";
    eval $cmd;
    if ($flag) {
      $cmd = '$' . $array . 'tot += $' . $array . "tot[$i];";
      eval $cmd;
      $cmd = '$' . $array . 'cnt += $' . $array . "cnt[$i];";
      eval $cmd;
    }
    if ($timeavg > 0.0) {
      printf " %9.3f %9.3f",$timeavg, $genavg;
    } else {
      print  "         0         0";
    }
  }
  print "\n";
}

print "TOT";
foreach $array (@arraylist) {
  printf " %4d", $total{$array};
  $cmd = '$timetot = $' . $array . 'tot;';
  eval $cmd;
  $cmd = '$timecnt = $' . $array . 'cnt;';
  eval $cmd;
  $cmd = '$gentot = $' . $array . 'gentot;';
  eval $cmd;
  $cmd = '$gencnt = $' . $array . 'gencnt;';
  eval $cmd;
  if ($timecnt > 0) {
    $timetot /= $timecnt;
  } else {
    $timetot = 0;
  }
  if ($gencnt > 0) {
    $gentot /= $gencnt;
  } else {
    $gentot = 0;
  }
  printf " %9.3f %9.3f",$timetot, $gentot;
  $avg{$array} = $gencnt / $total{$array} if ($total{$array} > 0);
}
print "\n";

print "AVG#GEN";
$first = 1;
foreach $array (@arraylist) {
  if ($first) {
    $fmt = "      %5d          ";
    $first = 0;
  } else {
    $fmt = "          %5d          ";
  }
  printf $fmt, $avg{$array};
}
print "\n";
exit 0;
