Update analysis scripts
This commit is contained in:
parent
ac89bcb3da
commit
9c494bac60
@ -13,6 +13,8 @@ import os
|
|||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from statistics import stdev
|
||||||
|
|
||||||
|
|
||||||
def compute_area(file, time):
|
def compute_area(file, time):
|
||||||
area = -1
|
area = -1
|
||||||
@ -30,74 +32,124 @@ def compute_area(file, time):
|
|||||||
if match:
|
if match:
|
||||||
objectives.append(int(match.group(1)))
|
objectives.append(int(match.group(1)))
|
||||||
continue
|
continue
|
||||||
match = re.match(r"%\stime elapsed:\s(\d+)\sms", line)
|
match = re.match(r"%\stime elapsed:\s(\d+\.\d+)\ss", line)
|
||||||
if match:
|
if match:
|
||||||
times.append(int(match.group(1)))
|
times.append(float(match.group(1)))
|
||||||
continue
|
continue
|
||||||
times.append(time)
|
# Not proven optimal
|
||||||
|
if len(times) == len(objectives):
|
||||||
|
times.append(time)
|
||||||
|
|
||||||
assert len(objectives) > 0
|
assert len(objectives) > 0
|
||||||
assert len(objectives) + 1 == len(times)
|
assert len(objectives) + 1 == len(times)
|
||||||
area = 0
|
area = 0
|
||||||
for i in range(len(objectives)):
|
for i in range(len(objectives)):
|
||||||
area += ((times[i + 1] - times[i]) / 1000) * objectives[i]
|
area += (times[i + 1] - times[i]) * objectives[i]
|
||||||
return int(area)
|
return int(area)
|
||||||
|
|
||||||
|
|
||||||
folder = sys.argv[1]
|
folder = sys.argv[1]
|
||||||
stats = {}
|
statistics = dict()
|
||||||
for root, dirs, files in os.walk(folder):
|
instances = set()
|
||||||
for name in files:
|
for config in ["original", "restart"]:
|
||||||
if name.endswith(".sol"):
|
for root, dirs, files in os.walk(folder + "/" + config):
|
||||||
seed = 1
|
for name in files:
|
||||||
match = re.search(r"\.(\d+)\.sol", name)
|
if name.endswith(".sol"):
|
||||||
if match:
|
components = name[:-(4)].split(".")
|
||||||
seed = int(match.group(1))
|
data = components[0]
|
||||||
with open(os.path.join(root, name)) as f:
|
instances.add(data)
|
||||||
contents = f.readlines()
|
seed = 1
|
||||||
|
if len(components) > 1:
|
||||||
|
assert len(components) == 2
|
||||||
|
seed = components[1]
|
||||||
|
|
||||||
statistics = {}
|
if data not in statistics:
|
||||||
print(contents)
|
statistics[data] = dict()
|
||||||
for line in contents:
|
if config not in statistics[data]:
|
||||||
# Nodes
|
statistics[data][config] = []
|
||||||
match = re.search(r"nodes=(\d+)", line)
|
|
||||||
if match:
|
|
||||||
statistics["nodes"] = int(match.group(1))
|
|
||||||
continue
|
|
||||||
# Solve time
|
|
||||||
match = re.search(r"solveTime=(\d+\.\d+)", line)
|
|
||||||
if match:
|
|
||||||
statistics["search_time"] = int(float(match.group(1)) * 1000)
|
|
||||||
continue
|
|
||||||
# Restarts
|
|
||||||
match = re.search(r"restart count:\s+(\d+)", line)
|
|
||||||
if match:
|
|
||||||
statistics["restarts"] = int(match.group(1))
|
|
||||||
continue
|
|
||||||
|
|
||||||
for line in contents[::-1]:
|
with open(os.path.join(root, name)) as f:
|
||||||
# Best objective
|
contents = f.readlines()
|
||||||
match = re.match(r"objective\s=\s(\d+)", line)
|
|
||||||
if match:
|
|
||||||
statistics["objective"] = int(match.group(1))
|
|
||||||
break
|
|
||||||
# Area
|
|
||||||
area = compute_area(contents, statistics["search_time"])
|
|
||||||
|
|
||||||
stats[name[:-(4)].replace(".", ",")] = (
|
nodes = None
|
||||||
area,
|
solvetime = None
|
||||||
statistics["objective"],
|
restarts = None
|
||||||
statistics["search_time"],
|
objective = None
|
||||||
statistics["restarts"],
|
for line in contents:
|
||||||
statistics["nodes"],
|
# Nodes
|
||||||
|
match = re.search(r"%%%mzn-stat: nodes=(\d+)", line)
|
||||||
|
if match:
|
||||||
|
nodes = int(match.group(1))
|
||||||
|
continue
|
||||||
|
# Solve time
|
||||||
|
match = re.search(r"%%%mzn-stat: solveTime=(\d+\.\d+)", line)
|
||||||
|
if match:
|
||||||
|
solvetime = float(match.group(1))
|
||||||
|
continue
|
||||||
|
# Restarts
|
||||||
|
match = re.search(r"%%%mzn-stat: restarts=(\d+)", line)
|
||||||
|
if match:
|
||||||
|
restarts = int(match.group(1))
|
||||||
|
continue
|
||||||
|
|
||||||
|
for line in contents[::-1]:
|
||||||
|
# Best objective
|
||||||
|
match = re.match(r"%%%mzn-stat: objective=(-?\d+)", line)
|
||||||
|
if match:
|
||||||
|
objective = int(match.group(1))
|
||||||
|
break
|
||||||
|
# Area
|
||||||
|
area = compute_area(contents, solvetime)
|
||||||
|
|
||||||
|
statistics[data][config].append(
|
||||||
|
(
|
||||||
|
area,
|
||||||
|
objective,
|
||||||
|
solvetime,
|
||||||
|
restarts,
|
||||||
|
nodes,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for data in instances:
|
||||||
|
for config in ["original", "restart"]:
|
||||||
|
stats = statistics[data][config]
|
||||||
|
cumulative = stats[0]
|
||||||
|
for i in range(1, len(stats)):
|
||||||
|
cumulative = tuple(map(sum, zip(cumulative, stats[i])))
|
||||||
|
avg = tuple([x / len(stats) for x in cumulative])
|
||||||
|
dev = stdev([x[1] for x in stats]) if len(stats) > 1 else 0
|
||||||
|
# (avg area, avg objective, stdev objective)
|
||||||
|
statistics[data][config] = (avg[0], avg[1], dev)
|
||||||
|
|
||||||
|
# Print header
|
||||||
|
print(
|
||||||
|
"""
|
||||||
|
\\begin{tabular}{l|rr|rr|rr}
|
||||||
|
\\toprule
|
||||||
|
& \multicolumn{2}{c|}{Chuffed} & \multicolumn{2}{c|}{Chuffed Restart} \\\\
|
||||||
|
Instance & $\intobj$ & $\minobj$ & $\intobj$ & $\minobj$ \\\\
|
||||||
|
\midrule
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
sorted_instances = sorted(instances)
|
||||||
|
for data in sorted_instances:
|
||||||
|
print(f"{data}", end="")
|
||||||
|
for config in ["original", "restart"]:
|
||||||
|
print(
|
||||||
|
f" & {int(statistics[data][config][0] / 1000) }k & {int(statistics[data][config][1])}",
|
||||||
|
end="",
|
||||||
|
)
|
||||||
|
if statistics[data][config][2] != 0:
|
||||||
|
print("^{", end="")
|
||||||
|
print(
|
||||||
|
int(statistics[data][config][2] / statistics[data][config][1] * 100),
|
||||||
|
# int(statistics[data][config][2]),
|
||||||
|
end="",
|
||||||
)
|
)
|
||||||
|
print("}", end="")
|
||||||
|
print(" \\\\")
|
||||||
|
|
||||||
sorted_stats = sorted(stats.items())
|
# Print footer
|
||||||
a = sorted_stats[0][0][: sorted_stats[0][0].find(",")]
|
print("\n\\bottomrule\n\end{tabular}")
|
||||||
for key, val in sorted_stats:
|
|
||||||
if key[: key.find(",")] != a:
|
|
||||||
print("\n\n")
|
|
||||||
a = key[: key.find(",")]
|
|
||||||
print("%s,%s" % (key, ",".join([v.__str__() for v in val])))
|
|
||||||
|
|
||||||
exit(1)
|
|
||||||
|
@ -8,7 +8,6 @@ area which can be found by adding
|
|||||||
'constraint trace("% init_area = \(ub(objective));\n", true);'
|
'constraint trace("% init_area = \(ub(objective));\n", true);'
|
||||||
to the model in question.
|
to the model in question.
|
||||||
"""
|
"""
|
||||||
import csv
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
Reference in New Issue
Block a user