#!/usr/bin/perl -w

##
## Usage: ./GatherData.pl [--solver <solver>] [--runs N] [--loop]
##  --solver SOLVERSTRING : use solver SOLVERSTRING, e.g. "lw" or "ve" or
##       "ve --elim random"
##  --runs N : run solver N times on each query
##  --loop : run forever, logging output in batches of N
##
## e.g. ./GatherData.pl --runs 1 --solver "ve --elim greedy"
##

$JAVA = 'java -ea -Xmx512M -classpath .:./BN.jar';

my $Datestamp;

sub runtest {
  my ($solver, $query) = @_;

  # If java blows out, it won't output an elapsed-time, and this value
  # will be returned.
  my $time = 999999999999999;

  open (S, "$JAVA RunTest --solver $solver $query 2>&1 |");

  my $output = "";
  while (<S>) {
    $output .= $_;
    if (/Solver time elapsed: (\d+) milliseconds/) {
      $time = $1;
    }
  }
  close(S);

  return($time, $output);
}


sub dostuff {
  my ($solverref, $queriesref, $numberOfRuns) = @_;

  my @solversToTry = @{$solverref};
  my @queriesToRun = @{$queriesref};

  my %summary = ();

  my $logfile = "./runlog.$Datestamp";

  print "Logging solver output in $logfile\n";

  open (RUNLOG, ">>$logfile");
  foreach my $solver (@solversToTry) {
    foreach my $query (@queriesToRun) {
      my @data = ();
      for (my $i=0; $i < $numberOfRuns; $i++) {
	my ($time, $output) = &runtest($solver, $query);
	push @data, $time;
	print RUNLOG $output;

	print STDERR "."; # to reassure the user that progress occurs
      }
      
      $summary{$solver}{$query} = \@data;
    }
  }

  print STDERR "\n";
  return %summary;
}

sub tellabout {
  my(%summary) = @_;

  my $filename = "./timelog.$Datestamp";

  print "Archiving these *timing* results in file $filename\n\n";

  open(LOG, ">>$filename");
  foreach my $solver (sort keys %summary) {
    foreach my $query (sort keys %{$summary{$solver}}) {
      print "$solver : $query :: ",
	join(", ", @{$summary{$solver}{$query}}), "\n";
      print LOG "$solver : $query :: ",
	join(", ", @{$summary{$solver}{$query}}), "\n";
    }
  }
  close(LOG);
}

######################################################################

my $runforever = 0;
#### Can in theory run on more than one solver per batch, but for now
#### not doing it.
my @solversToTry = ("ve --elim random");
my @queriesToRun = ("2.1", "2.2", "2.3", "2.4");
my $numberOfRuns = 10;

while (@ARGV) {
  my $arg = shift @ARGV;
  if ($arg =~ /--loop/i) {
    $runforever = 1;
  } elsif ($arg =~ /--solver/i) {
    if ($#ARGV != -1) {
      @solversToTry = shift @ARGV;
    } else {
      die "--solver takes an argument!\n";
    }
  } elsif ($arg =~ /--runs/i) {
    if ($#ARGV != -1) {
      $numberOfRuns = shift @ARGV;
    } else {
      die "--runs takes an argument!\n";
    }
  } else {
    die "Unknown argument $arg\n";
  }
}

my $haverunonce = 0;
while ($runforever || !$haverunonce) {
  $Datestamp=`date '+%Y%m%d.%H%M'`;
  chomp $Datestamp;

  my %summ = &dostuff(\@solversToTry, \@queriesToRun, $numberOfRuns);
  &tellabout(%summ);
  $haverunonce = 1;
}
