You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
multirow/infinity/benchmark/scripts/table.rb

169 lines
3.8 KiB

#!/usr/bin/env ruby
require 'yaml'
def gmean(x, shift)
sum=0.0
x.each {|v| sum += Math.log(v+shift)}
sum /= x.size
Math.exp(sum)-shift
end
def mean(x)
sum=0.0
x.each {|v| sum += v}
sum /= x.size
end
data = YAML::load(File.open("data/data.yaml"))
n = 0
exact_cuts = []
exact_gaps = []
exact_times = []
greedy_cuts = []
greedy_gaps = []
greedy_times = []
mir_cuts = []
mir_gaps = []
percut_times = []
improv = []
missing = []
no_improvement = []
mir_differs = []
count = 1
print("%4s " % "")
print("%16s " % "instance")
print("%9s " % "g-mir")
print("%9s " % "g-infty")
print("%9s " % "g-exact")
print("%9s " % "improv")
print("%9s " % "t-total")
print("%9s " % "t-per-cut")
print("%6s " % "n-cuts")
print("\n")
Dir[ARGV[0] + "*yaml"].sort.each do |f|
yaml = YAML::load(File.open(f))
instance = yaml['input-filename'].gsub("instances/", "").gsub(".pre.mps.gz", "")
d = data[instance]
obj_lp = yaml['obj-value'][0]
obj_ip = d['ip']
gap_pi = d[ARGV[1]]
obj_mir = yaml['obj-value'][1]
obj_greedy = yaml['obj-value'][2]
gap_mir = (obj_mir - obj_lp) / (obj_ip - obj_lp) * 100
gap_greedy = (obj_greedy - obj_lp) / (obj_ip - obj_lp) * 100
#gap_pi = [gap_pi, gap_greedy].max
improv_greedy = (gap_greedy - gap_mir) / (gap_pi - gap_mir) * 100
improv_greedy = 0 if improv_greedy.abs < 0.01
if (gap_mir - d['gmi']).abs > 1
mir_differs.push([instance, gap_mir, d['gmi']])
end
begin
time_percut = yaml['time-per-cut'][2] * 1000
rescue NoMethodError
time_percut = 0.0
end
percut_times.push(time_percut)
mir_gaps.push(gap_mir)
greedy_gaps.push(gap_greedy)
exact_gaps.push(gap_pi)
improv.push(improv_greedy)
print("%4d " % count)
print("%16s " % instance)
print("%8.2f%% " % (gap_mir))
print("%8.2f%% " % (gap_greedy))
print("%8.2f%% " % (gap_pi))
if (gap_pi - gap_mir).abs > 0.01
print("%8.2f%% " % (improv_greedy))
else
print("%8s " % "---")
end
print("%6d:%02d " % [yaml['user-cpu-time'][2] / 60, yaml['user-cpu-time'][2] % 60])
print("%6d ms " % (time_percut))
print("%6d " % (yaml['added-cuts'][2]))
print("\n")
count += 1
end
mean_exact = mean(exact_gaps)
mean_greedy = mean(greedy_gaps)
mean_mir = mean(mir_gaps)
#ncuts_exact = gmean(exact_cuts, 10)
#ncuts_greedy = gmean(greedy_cuts, 10)
#ncuts_mir = gmean(mir_cuts, 10)
#
#time_exact = gmean(exact_times, 5)
#time_greedy = gmean(greedy_times, 5)
#time_percut = gmean(percut_times, 5)
#
print("\n%22s" % "")
print("%8.2f%% " % mean_mir)
print("%8.2f%% " % mean_greedy)
print("%8.2f%% " % mean_exact)
#print("%8.1f%% " % mean(improv))
#print(" %8d " % ncuts_mir)
#print("%8d " % ncuts_greedy)
#print("%8d " % ncuts_exact)
#print("%4d:%02d " % [time_greedy / 60, time_greedy % 60])
#print("%4d:%02d " % [time_exact / 60, time_exact % 60])
#print(" %4.0f ms" % time_percut)
print("\n")
#print("%30s" % "")
#print("%5.1f%% " % ((mean_greedy / mean_mir - 1) * 100))
#print("%5.1f%% " % ((mean_exact / mean_mir - 1) * 100))
#print("\n")
print("%34s" % "")
print("%6.2f%% " % ((mean_greedy - mean_mir) / (mean_exact - mean_mir) * 100))
print("\n")
if missing.size > 0
print("Missing data:\n")
missing.each do |m|
print(" %s\n" % m)
end
end
#if mir_differs.size > 0
# print("MIR differs:\n")
# mir_differs.each do |m|
# print("%4d %16s %6.2f %6.2f\n" % [count, m[0], m[1], m[2]])
# count += 1
# end
# print("\n")
#end
print("Disabled:\n")
Dir["instances/off/*"].each do |f|
print("%4d %16s\n" % [count, f.gsub("instances/off/", "").gsub(".pre.mps.gz", "")])
count += 1
end
print("\n")
print("Error:\n")
Dir[ARGV[0] + "*.err*"].sort.each do |f|
instance = f.gsub("greedy/", "").gsub(".pre.err.", " ").split(" ")
print("%4d %-30s %4d\n" % [count, instance[0], instance[1]])
count += 1
end