SabaPivot's picture
download
raw
3.36 kB
"""Claim 6, extended: push eps down until BOTH schemes are bias-limited, so the
ULMC/composite ratio can be read off in its asymptotic (saturated) regime."""
import numpy as np
import common as C, grid1d as G, ulmc_core as U
import exp_nonquadratic2 as X # reuses the potentials and the cached floors
res = {}
NGRID = U.n_grid(int(4e9), 1.04)
HS = {"ulmc": np.geomspace(0.055, 1 / C.gamma_of(X.BETA), 11),
"lmc": np.geomspace(0.002, 0.9, 22),
"composite": np.geomspace(0.002, 0.9, 22)}
tab, floors = {}, {}
for scheme in ("ulmc", "lmc", "composite"):
tab[scheme] = []
floors[scheme] = []
for h in HS[scheme]:
h = float(h)
if scheme == "ulmc":
fl, conv = X.ulmc_floor(X.f, X.df, X.ddf, X.BETA, h)
else:
fl, conv = X.od_floor(scheme, X.f, X.df, X.BETA, X.ALPHA, h)
floors[scheme].append({"h": h, "stiff_floor": fl, "rel_change": conv})
a = np.array([X.ALPHA]); mult = np.array([float(X.D - X.M_RIDGE)])
S0, m0 = C.init_cold(a, X.BETA)
mp = (U.ulmc_maps(a, h, C.gamma_of(X.BETA)) if scheme == "ulmc"
else U.lmc_maps(a, h) if scheme == "lmc"
else U.composite_lmc_maps(a, h, X.ALPHA))
tab[scheme].append((h, U.kl_curve(mp, S0, m0, a, mult, NGRID) + X.M_RIDGE * fl))
print("built", scheme, flush=True)
rows = []
for eps in (0.048, 0.035, 0.026, 0.019, 0.014, 0.0105, 0.008):
row = {"eps": float(eps)}
for scheme in ("ulmc", "lmc", "composite"):
best = None
for h, curve in tab[scheme]:
n = U.first_below(NGRID, curve, eps * eps)
if n and (best is None or n < best[0]):
best = (n, h)
row[scheme] = {"N_eps": best[0] if best else None,
"h_star": best[1] if best else None,
"bias_limited": bool(best and best[1] < HS[scheme][-1] * 0.999)}
if row["ulmc"]["N_eps"] and row["composite"]["N_eps"]:
row["speedup_ulmc_over_composite"] = row["composite"]["N_eps"] / row["ulmc"]["N_eps"]
row["speedup_ulmc_over_lmc"] = row["lmc"]["N_eps"] / row["ulmc"]["N_eps"]
rows.append(row)
print("eps %.4f" % eps, {k: (row[k]["N_eps"], row[k]["bias_limited"])
for k in ("ulmc", "lmc", "composite")},
"speedup %.3f" % row.get("speedup_ulmc_over_composite", 0), flush=True)
sat = [r for r in rows if r["ulmc"]["bias_limited"] and r["composite"]["bias_limited"]]
res["extended"] = {
"rows": rows, "floors": floors,
"saturated_rows": [(r["eps"], r["speedup_ulmc_over_composite"]) for r in sat],
"asymptotic_speedup": float(np.mean([r["speedup_ulmc_over_composite"] for r in sat[-3:]])) if len(sat) >= 3 else None,
"ulmc_ever_beats_composite": bool(any(r.get("speedup_ulmc_over_composite", 0) > 1 for r in rows)),
}
for sch in ("ulmc", "lmc", "composite"):
ok = [r for r in rows if r[sch]["N_eps"] and r[sch]["bias_limited"]]
s, r2 = C.fit_exponent([r["eps"] for r in ok], [r[sch]["N_eps"] for r in ok])
res["extended"][f"{sch}_eps_exponent_bias_limited_only"] = s
res["extended"][f"{sch}_r2"] = r2
res["extended"][f"{sch}_n_bias_limited_points"] = len(ok)
C.dump("c6_extended", res)
print("asymptotic speedup:", res["extended"]["asymptotic_speedup"],
"ever beats:", res["extended"]["ulmc_ever_beats_composite"])

Xet Storage Details

Size:
3.36 kB
·
Xet hash:
61e5198b9e329748208b0c1533d906368ee4bac5eedd1b3fc1d5194f1904b7da

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.