Buckets:
| """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.