#!/usr/sww/bin/perl

# see if we should read from a file or STDIN
#
if (@ARGV == 0) {
  $FILE = "<STDIN>";
  open(STATS, "<-") || die "Couldn't reopen STDIN!\n";
} else {
  $FILE = pop(ARGV);
  open(STATS, $FILE) || die "Couldn't open \"$FILE\"!\n";
}

@hitbest = @hitavg = @hitworst = ();
@stdbest = @stdavg = @stdworst = ();
# @normbest = @normavg = @normworst = ();
@deepest = @depthavg = @shallowest = ();
@compbest = @compavg = ();
@unique = ();

while (<STATS>) {
  chop;
  if (/^Hits: Best=([0-9\.]*), Average=([0-9\.]*), Worst=([0-9\.]*)/) {
    push(hitbest, $1);
    push(hitavg, $2);
    push(hitworst, $3);
  } elsif (/^Standardized Fitness: Best=([0-9\.]*), Average=([0-9\.]*), Worst=([0-9\.]*)/) {
    push(stdbest, $1);
    push(stdavg, $2);
    push(stdworst, $3);
#  } elsif (/^Normalized Fitness: Best=([0-9\.]*), Average=([0-9\.]*), Worst=([0-9\.]*)/) {
#    push(normbest, $1);
#    push(normavg, $2);
#    push(normworst, $3);
  } elsif (/^Depth: Deepest=([0-9]*), Average=([0-9]*), Most Shallow=([0-9]*)/) {
    push(deepest, $1);
    push(depthavg, $2);
    push(shallowest, $3);
  } elsif ((/^Structural Complexity: Best Of Run=([0-9\.]*), Average=([0-9\.]*)/) ||
	  (/^Structural Complexity: Best Of Generation=([0-9\.]*), Average=([0-9\.]*)/)) {
    push(compbest, $1);
    push(compavg, $2);
  } elsif (/^% of Unique Programs: ([0-9\.]*)/) {
    push(unique, $1);
  }
}
close(STATS);

open(FILE, ">hit.xgraph") ||
  die "Couldn't write hits graph!\n";
&hitreport(*FILE);
close(FILE);
&background('xgraph hit.xgraph &');

open(FILE, ">std.xgraph") ||
  die "Couldn't write standardized fitness graph!\n";
&stdreport(*FILE);
close(FILE);
&background('xgraph std.xgraph &');

# open(FILE, ">norm.xgraph") ||
#   die "Couldn't write normalized fitness graph!\n";
# &normreport(*FILE);
# close(FILE);
# &background('xgraph norm.xgraph &');

open(FILE, ">depth.xgraph") ||
  die "Couldn't write depth graph!\n";
&depthreport(*FILE);
close(FILE);
&background('xgraph depth.xgraph &');

open(FILE, ">comp.xgraph") ||
  die "Couldn't write structural complexity graph!\n";
&compreport(*FILE);
close(FILE);
&background('xgraph comp.xgraph &');

open(FILE, ">unique.xgraph") ||
  die "Couldn't write program uniqueness graph!\n";
&uniquereport(*FILE);
close(FILE);
&background('xgraph unique.xgraph &');

exit 0;

sub hitreport {
  local(*FILE) = @_;
  local($i, $n);

  print FILE "TitleText: Hits\n";

  # print best
  #
  print FILE "\n\"Best\"\n";
  $n = 0;
  foreach $i (@hitbest) {
    print FILE "$n $i\n";
    $n++;
  }

  # print average
  #
  print FILE "\n\"Average\"\n";
  $n = 0;
  foreach $i (@hitavg) {
    print FILE "$n $i\n";
    $n++;
  }

  # print worst
  #
  print FILE "\n\"Worst\"\n";
  $n = 0;
  foreach $i (@hitworst) {
    print FILE "$n $i\n";
    $n++;
  }
}

sub stdreport {
  local(*FILE) = @_;
  local($i, $n);

  print FILE "TitleText: Standardized Fitness\n";

  # print best
  #
  print FILE "\n\"Best\"\n";
  $n = 0;
  foreach $i (@stdbest) {
    print FILE "$n $i\n";
    $n++;
  }

  # print average
  #
  print FILE "\n\"Average\"\n";
  $n = 0;
  foreach $i (@stdavg) {
    print FILE "$n $i\n";
    $n++;
  }

  # print worst
  #
  print FILE "\n\"Worst\"\n";
  $n = 0;
  foreach $i (@stdworst) {
    print FILE "$n $i\n";
    $n++;
  }
}

sub normreport {
  local(*FILE) = @_;
  local($i, $n);

  print FILE "TitleText: Normalized Fitness\n";

  # print best
  #
  print FILE "\n\"Best\"\n";
  $n = 0;
  foreach $i (@normbest) {
    print FILE "$n $i\n";
    $n++;
  }

  # print average
  #
  print FILE "\n\"Average\"\n";
  $n = 0;
  foreach $i (@normavg) {
    print FILE "$n $i\n";
    $n++;
  }

  # print worst
  #
  print FILE "\n\"Worst\"\n";
  $n = 0;
  foreach $i (@normworst) {
    print FILE "$n $i\n";
    $n++;
  }
}

sub depthreport {
  local(*FILE) = @_;
  local($i, $n);

  print FILE "TitleText: Program Depth\n";

  # print best
  #
  print FILE "\n\"Deepest\"\n";
  $n = 0;
  foreach $i (@deepest) {
    print FILE "$n $i\n";
    $n++;
  }

  # print average
  #
  print FILE "\n\"Average\"\n";
  $n = 0;
  foreach $i (@depthavg) {
    print FILE "$n $i\n";
    $n++;
  }

  # print worst
  #
  print FILE "\n\"Most Shallow\"\n";
  $n = 0;
  foreach $i (@shallowest) {
    print FILE "$n $i\n";
    $n++;
  }
}

sub compreport {
  local(*FILE) = @_;
  local($i, $n);

  print FILE "TitleText: Structural Complexity\n";

  # print best of run complexity
  #
  print FILE "\n\"Best Of Run\"\n";
  $n = 0;
  foreach $i (@compbest) {
    print FILE "$n $i\n";
    $n++;
  }

  # print average complexity
  #
  print FILE "\n\"Average Complexity\"\n";
  $n = 0;
  foreach $i (@compavg) {
    print FILE "$n $i\n";
    $n++;
  }
}

sub uniquereport {
  local(*FILE) = @_;
  local($i, $n);

  print FILE "TitleText: % of unique programs\n";

  # print percent of unique programs for each generation
  #
  $n = 0;
  foreach $i (@unique) {
    print FILE "$n $i\n";
    $n++;
  }
}

sub background {
  local($cmd) = @_;

  if (fork) {

    # parent waits to give daemon a chance to start
    #
    sleep(3);
  } else {

    # start subprocess
    #
    exec $cmd || die "Cant start subprocess '$cmd'!\n";
  }
}
