#!/usr/bin/perl -w

open (IN, "<timelog.ve.all");

%summary = ();

while (<IN>) {
  chomp;

  if (/^([^:]+\S)\s*:\s*([^\s:]+)\s*::\s*(\S.*)$/) {
    my $solver  = $1;
    my $query   = $2;
    my $datastr = $3;

    my @data = split(", ", $datastr);

    push @{$summary{$solver}{$query}}, @data;
  } else {
    chomp;
    die "Unknown time-log entry \"$_\"!\n";
  }
}

foreach my $solver (sort keys %summary) {
  foreach my $query (sort keys %{$summary{$solver}}) {
    my $varname  = "$solver.$query";
    $varname =~ s/ /_/g;
    $varname =~ s/-//g;
    $varname =~ s/\./_/g;

    my $filename = "./matlab/$varname.m";

    print "Data for solver $solver vs $query in $filename\n";
    open (DAT, ">$filename");
    print DAT "% Runtimes for solver $solver\n";
    print DAT "% using query $query\n";
    print DAT "times_$varname = [ ";
    print DAT join(",  ", &tidydata(@{$summary{$solver}{$query}}));
    print DAT " ];\n";

    if (($solver eq "ve --elim random") &&
	(($query eq "2.3") || ($query eq "2.4"))) {
      print DAT "hist(times_$varname, 10);\n";
      print DAT "xlabel('x = milliseconds');\n";
      print DAT "ylabel('Number of trials of length (x) milliseconds');\n";
    } else {
      print DAT "hist(log10(times_$varname), 35);\n";
      print DAT "xlabel('x = Log_{10}(milliseconds)');\n";
      print DAT "ylabel('Number of trials of length 10^x milliseconds ');\n";
    }
    print DAT "print -deps2 $varname";
    close (DAT);
  }
}

sub tidydata {
  my (@data) = @_;

  my $magic_time = 999999999999999;
  my $max_normal_time = 0;

  for my $n (@data) {
    if (($n != $magic_time) && ($n > $max_normal_time)) {
      $max_normal_time = $n;
    }
  }

  $new_magic_time = int(1.2*$max_normal_time);

  @data = map { if ($_ == $magic_time) {
                   $new_magic_time;
		 } else {
		   $_;
		 }
	      } @data;

  return(sort { $a <=> $b } @data);
}
