this repo has no description

Update analysis script for Gecode

Changed files
+105 -59
+105 -59
analyse_gecode.py
···
import re
import sys
-
def compute_area(file):
-
area = -1
objectives = []
times = [0]
-
timeout = -1
objectives.append(0)
-
for line in contents:
# match = re.match(r'%\sinit_area\s=\s(\d+)', line)
# if match:
# objectives.append(int(match[1]))
···
if match:
objectives.append(int(match.group(1)))
continue
-
match = re.match(r"%\stime elapsed:\s(\d\.\d+)\ss", line)
if match:
times.append(float(match.group(1)))
continue
···
assert len(objectives) + 1 == len(times)
area = 0
for i in range(len(objectives)):
-
area += ((times[i + 1] - times[i]) / 1000) * objectives[i]
return int(area)
folder = sys.argv[1]
-
statistics = {}
-
for root, dirs, files in os.walk(folder):
-
for name in files:
-
if name.endswith(".sol"):
-
seed = 1
-
match = re.search(r"\.(\d+)\.sol", name)
-
if match:
-
seed = int(match.group(1))
-
with open(os.path.join(root, name)) as f:
-
contents = f.readlines()
-
# Area
-
area = compute_area(contents)
-
objective = "UNSAT"
-
for line in contents[::-1]:
-
# Best objective
-
match = re.match(r"objective\s=\s(\d+)", line)
-
if match:
-
objective = int(match.group(1))
-
break
-
nodes = -1
-
solvetime = -1
-
restarts = -1
-
for line in contents:
-
# Evaluation time
-
match = re.search(r"copies:\s+(\d+)", line)
-
if match:
-
nodes = int(match.group(1))
-
continue
-
# Solve time
-
match = re.search(r"solveTime=(\d+(.\d+)?)", line)
-
if match:
-
solvetime = float(match.group(1))
-
continue
-
# Restarts
-
match = re.search(r"restarts=(\d+)", line)
-
if match:
-
restarts = int(match.group(1))
-
continue
-
statistics[name[:-(4)].replace(".", ",")] = (
-
area,
-
objective,
-
solvetime,
-
restarts,
-
nodes,
-
)
-
sorted_stats = sorted(statistics.items())
-
a = sorted_stats[0][0][: sorted_stats[0][0].find(",")]
-
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)
···
import re
import sys
+
from statistics import stdev
+
def compute_area(file):
objectives = []
times = [0]
objectives.append(0)
+
for line in file:
+
# match = re.match(r'%\sinit_area\s=\s(\d+)', line)
# match = re.match(r'%\sinit_area\s=\s(\d+)', line)
# if match:
# objectives.append(int(match[1]))
···
if match:
objectives.append(int(match.group(1)))
continue
+
match = re.match(r"%\stime elapsed:\s(\d+\.\d+)\ss", line)
if match:
times.append(float(match.group(1)))
continue
···
assert len(objectives) + 1 == len(times)
area = 0
for i in range(len(objectives)):
+
area += (times[i + 1] - times[i]) * objectives[i]
return int(area)
folder = sys.argv[1]
+
statistics = dict()
+
instances = set()
+
for config in ["original", "restart", "replay"]:
+
for root, dirs, files in os.walk(folder + "/" + config):
+
for name in files:
+
if name.endswith(".sol"):
+
components = name[:-(4)].split(".")
+
data = components[0]
+
instances.add(data)
+
seed = 1
+
if len(components) > 1:
+
assert len(components) == 2
+
seed = components[1]
+
if data not in statistics:
+
statistics[data] = dict()
+
if config not in statistics[data]:
+
statistics[data][config] = []
+
with open(os.path.join(root, name)) as f:
+
contents = f.readlines()
+
# Area
+
area = compute_area(contents)
+
objective = "UNSAT"
+
for line in contents[::-1]:
+
# Best objective
+
match = re.match(r"objective\s=\s(\d+)", line)
+
if match:
+
objective = int(match.group(1))
+
break
+
+
nodes = -1
+
solvetime = -1
+
restarts = -1
+
for line in contents:
+
# Evaluation time
+
match = re.search(r"copies:\s+(\d+)", line)
+
if match:
+
nodes = int(match.group(1))
+
continue
+
# Solve time
+
match = re.search(r"solveTime=(\d+(.\d+)?)", line)
+
if match:
+
solvetime = float(match.group(1))
+
continue
+
# Restarts
+
match = re.search(r"restarts=(\d+)", line)
+
if match:
+
restarts = int(match.group(1))
+
continue
+
statistics[data][config].append(
+
(
+
area,
+
objective,
+
solvetime,
+
restarts,
+
nodes,
+
)
+
)
+
for data in instances:
+
for config in ["original", "restart", "replay"]:
+
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|}{Gecode} & \multicolumn{2}{c|}{Gecode Restart} & \multicolumn{2}{c}{Gecode Replay}\\\\
+
Instance & $\intobj$ & $\minobj$ & $\intobj$ & $\minobj$ & $\intobj$ & $\minobj$ \\\\
+
\midrule
+
"""
+
)
+
+
sorted_instances = sorted(instances)
+
for data in sorted_instances:
+
print(f"{data}", end="")
+
for config in ["original", "restart", "replay"]:
+
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(" \\\\")
+
+
# Print footer
+
print("\n\\bottomrule\n\end{tabular}")