import re

begin_pattern = re.compile("^### BEGIN r_size = ([0-9]+), s_size = ([0-9]+), hit_ratio = 1, key_size = ([0-9]+), extra_cols = ([0-9]+)")
time_pattern = re.compile("^Time: ([0-9.]+) ms ")

def read_file(path):
  result = {}
  with open(path) as f:
    for line in f:
      groups = re.match(begin_pattern, line)
      if groups:
        key = groups.group(1, 2, 3, 4)
      groups = re.match(time_pattern, line)
      if groups:
        time = float(groups.group(1))
        if key in result:
          result[key].append(time)
        else:
          result[key] = [time]
  return result

master = read_file("test.master.out")
patched = read_file("test.patched.out")

r_size = 50000000
s_sizes = (1000, 100000, 10000000)
key_sizes = (0, 8, 16, 32, 64)
extra_colss = (0, 2, 4)

margin_width = 12
column_width = 21

print "".ljust(margin_width) + "".join(["s={:,}".format(s_size).ljust(column_width) for s_size in s_sizes])
print "".ljust(margin_width) + "".join(["=" * (column_width - 1) + " " for s_size in s_sizes])

for key_size in key_sizes:
  for extra_cols in extra_colss:
    if extra_cols == 0:
      if key_size == 0:
        line = "int"
      else:
        line = "text(%d)" % key_size
    else:
      line = " + %d cols" % extra_cols
    line = line.ljust(margin_width)
    for s_size in s_sizes:
      key = (str(r_size), str(s_size), str(key_size), str(extra_cols))
      if key in master and key in patched:
        master_times = sorted(master[key])
        patched_times = sorted(patched[key])
        master_worst_time = master_times[-1]
        patched_worst_time = patched_times[-1]
        master_median_time = master_times[1]
        patched_median_time = patched_times[1]
        cell = "w=%+.2f%%, m=%+.2f%%" % (((master_worst_time / patched_worst_time) - 1.0) * 100, ((master_median_time / patched_median_time) - 1.0) * 100)
      else:
        cell = ""
      line += cell.ljust(column_width)
    print line
