import matplotlib.pyplot as plt
import results_h48
import results_vcube
# Table sizes in bytes
sizes_h48 = {
6: 1897951528,
7: 3793842344,
8: 7585624040,
9: 15169187432,
10: 30336314216,
11: 60670567784,
}
sizes_vcube = {
112: 2603089920,
208: 7809269760,
308: 22777036800,
404: 34165555200,
212: 62474158080,
}
# Printing tables in markdown format
def print_row(solver_name, solver_size, dict, mul_by_size, superflip_star):
if dict is None:
return
solver_gib = solver_size / (2**30)
m = solver_gib if mul_by_size else 1
s = " (a) " if superflip_star else " "
cols = [f"{solver_name: <10}", f"{solver_gib:>4.1f} Gib"] + [
f"{dict[key]*m/25:>8.2f}" if key in dict else " "
for key in [17, 18, 19, 20]
] + [
f"{dict["superflip"]*m:>9.2f}" if "superflip" in dict else s
]
sep = "|"
print(sep + sep.join(cols) + sep)
def print_table(h48, vcube, ms, st):
vcube = vcube or {}
print("| Solver | Size |17 moves|18 moves|19 moves|20 moves|Superflip|")
print("|:---------|:-------|-------:|-------:|-------:|-------:|--------:|")
print_row("vcube 212", sizes_vcube[212], vcube.get(212), ms, not st)
print_row("H48 h11", sizes_h48[11], h48[11], ms, False)
print_row("vcube 404", sizes_vcube[404], vcube.get(404), ms, not st)
print_row("H48 h10", sizes_h48[10], h48[10], ms, False)
print_row("vcube 308", sizes_vcube[308], vcube.get(308), ms, not st)
print_row("H48 h9", sizes_h48[9], h48[9], ms, False)
print_row("vcube 208", sizes_vcube[208], vcube.get(208), ms, not st)
print_row("H48 h8", sizes_h48[8], h48[8], ms, False)
print_row("H48 h7", sizes_h48[7], h48[7], ms, False)
print_row("vcube 112", sizes_vcube[112], vcube.get(112), ms, not st)
print_row("H48 h6", sizes_h48[6], h48[6], ms, False)
print("Single solution, single thread
")
print()
print("Time per cube (in seconds, lower is better).")
print()
print_table(results_h48.h48_single_thread, results_vcube.vcube_single_thread, False, True)
print()
print("Time per cube adjusted for table size (in seconds \\* GiB, lower is better).")
print()
print_table(results_h48.h48_single_thread, results_vcube.vcube_single_thread, True, True)
print()
print(
'
\n'
'
\n'
'
\n'
'
\n'
)
print(" ")
print("Single solution, 4 threads
")
print()
print("Time per cube (in seconds, lower is better).")
print()
print_table(results_h48.h48_4_threads, results_vcube.vcube_4_threads, False, False)
print()
print("Time per cube adjusted for table size (in seconds \\* GiB, lower is better).")
print()
print_table(results_h48.h48_4_threads, results_vcube.vcube_4_threads, True, False)
print()
print(
'
\n'
'
\n'
'
\n'
'
\n'
)
print()
print("(a) vcube cannot parallelize on a single scramble, the results for the")
print("superflip are going to be the same as in the single thread case.")
print(" ")
print("Single solution, 16 threads
")
print()
print("Time per cube (in seconds, lower is better).")
print()
print_table(results_h48.h48_16_threads, results_vcube.vcube_16_threads, False, False)
print()
print("Time per cube adjusted for table size (in seconds \\* GiB, lower is better).")
print()
print_table(results_h48.h48_16_threads, results_vcube.vcube_16_threads, True, False)
print()
print(
'
\n'
'
\n'
'
\n'
'
\n'
)
print()
print("(a) vcube cannot parallelize on a single scramble, the results for the")
print("superflip are going to be the same as in the single thread case.")
print(" ")
print("All solutions, 16 threads
")
print()
print("*Note: vcube does not have an option for finding multiple solutions.*")
print()
print("Time per cube (in seconds, lower is better).")
print()
print_table(results_h48.h48_all_solutions, None, False, False)
print()
print("Time per cube adjusted for table size (in seconds \\* GiB, lower is better).")
print()
print_table(results_h48.h48_all_solutions, None, True, False)
print()
print(" ")
# Plotting
def plot(title, hd, vd, key):
d = 1 if key == "superflip" else 25
h48x = [sizes_h48[m]/(2**30) for m in hd.keys() if key in hd[m]]
vcubex = [sizes_vcube[m]/(2**30) for m in vd.keys() if key in vd[m]]
h48y = [d[key] for _, d in hd.items() if key in d]
vcubey = [d[key] for _, d in vd.items() if key in d]
plt.clf()
plt.title(title)
plt.xlabel("Table size (GiB)")
plt.ylabel("Time to solve (s / cube)")
plt.plot(h48x, h48y, "o--", label = "H48")
plt.plot(vcubex, vcubey, "o--", label = "vcube")
plt.legend(loc = "right")
filename = title.replace(" ", "").replace(",", "") + ".png"
plt.savefig("benchmarks/img/" + filename, dpi=300)
#plt.show()
rh, rv = results_h48.h48_single_thread, results_vcube.vcube_single_thread
for m in [17, 18, 19, 20]:
plot(f"{m} moves 1 thread", rh, rv, m)
rh, rv = results_h48.h48_4_threads, results_vcube.vcube_4_threads
for m in [17, 18, 19, 20]:
plot(f"{m} moves 4 threads", rh, rv, m)
rh, rv = results_h48.h48_16_threads, results_vcube.vcube_16_threads
for m in [17, 18, 19, 20]:
plot(f"{m} moves 16 threads", rh, rv, m)