Files
sim-numerics/table_all_corpora.py
T

55 lines
2.3 KiB
Python

"""Wins and losses of A' (and A, the plain rule) against the library Chandrupatla, Brent and
TOMS748 on all six corpora, from the saved server results only (no new run):
sweep_fourth_seen.json (APS, CHA, new corpus 1, Roots.jl, applied - uniform sign-change
criterion) and sweep_fourth_fourth.json (the fourth corpus).
python -u table_all_corpora.py
"""
from __future__ import annotations
import json
from sweep_oos import sign_p
MAXFEV = 200
NAMES = {"APS": "APS (154)", "CHA": "Chandrupatla (45)", "NEW": "new corpus 1 (206)",
"RJL": "Roots.jl (78)", "APP": "applied+GSL (132)", "D": "FOURTH (240)"}
def cost(v):
return v[0] if v[1] else MAXFEV
def main():
R = json.load(open("sweep_fourth_seen.json", encoding="utf8"))
F = json.load(open("sweep_fourth_fourth.json", encoding="utf8"))
for k in R:
R[k].update(F[k])
print("TOTALS (violations of the 2x-bisection bound in brackets)")
print(f" {'corpus':<20}" + "".join(f"{n:>16}" for n in
("A'", "A", "plain", "Chandrupatla", "Brent", "TOMS748")))
for s in NAMES:
cells = []
for k in ("Aprime", "A", "base", "chandrupatla", "brent", "toms748"):
r = R[k][s]
cells.append(f"{sum(cost(v) for v in r.values())} ({sum(v[2] for v in r.values())})")
print(f" {NAMES[s]:<20}" + "".join(f"{c:>16}" for c in cells))
print("\nA' PER PROBLEM against each rival: wins/ties/losses (sign-test p); total difference")
for s in NAMES:
line = f" {NAMES[s]:<20}"
for rv in ("chandrupatla", "brent", "toms748"):
a, o = R["Aprime"][s], R[rv][s]
w = sum(cost(a[p]) < cost(o[p]) for p in a)
l = sum(cost(a[p]) > cost(o[p]) for p in a)
ta, to = sum(cost(v) for v in a.values()), sum(cost(v) for v in o.values())
line += f" {rv[:5]} {w}/{len(a) - w - l}/{l} p={sign_p(w, l):.1g} {100 * (ta - to) / to:+.0f}%"
print(line)
tot = {k: sum(cost(v) for s in NAMES for v in R[k][s].values()) for k in R}
n_all = sum(len(R["Aprime"][s]) for s in NAMES)
print(f"\nALL SIX CORPORA ({n_all} problems):",
" ".join(f"{k} {tot[k]}" for k in ("Aprime", "A", "base", "chandrupatla", "brent", "toms748")))
if __name__ == "__main__":
main()