← Session 6 — Recover crashed run; plan all-forks execution
thinking (1640 chars)
Now E-012: toy illustration. Design:
- Load E-002 zeros (10^4).
- Compute consecutive gaps δ_j = γ_{j+1} − γ_j; two-body collision time t_c = −δ²/8 (from dδ²/dt = 8: δ²(t) = δ₀² + 8t → collision at t = −δ₀²/8).
Wait, check the factor: two zeros x₁ < x₂, δ = x₂ − x₁. dx₁/dt = 2/(x₁−x₂) = −2/δ; dx₂/dt = 2/(x₂−x₁) = +2/δ. dδ/dt = 4/δ. dδ²/dt = 2δ·4/δ = 8. So δ²(t) = δ₀² + 8t; backward (t<0) collision at t_c = −δ₀²/8. Good. (Note: the Rodgers–Tao ODE has factor 2 in the sum; with only mutual interaction this is the two-body truncation. Also the real H_t zero variables are rescaled vs γ — but as a toy, using γ's directly is fine, stated as such.)
- Also run full backward ODE (all-to-all) on first ~300 zeros using scipy solve_ivp, integrating backward until first gap closes; compare measured first-collision time vs two-body prediction for the minimal pair. Validate that two-body underestimates/overestimates.
- Checks: V1 two-body collision times distribution (min, median, max); V2 full-ODE first collision time within factor ~2 of two-body estimate for the binding pair; V3 monotonicity: collision times scale as δ² (correlation).
- Output CSV: per-gap rows (j, δ_j, t_c two-body) for 10^4 gaps + summary JSON including full-ODE result.
Runtime: trivial (seconds). ODE: 300 particles, all-to-all force, backward until min gap < threshold — solve_ivp with event. Fine.
Then update indices: derivations index.md add D-021, db add-derivation, E-012 log-experiment, graveyard G-003 file + index + NGUYEN.md §6, mark 3.3 closed in NGUYEN.md §5, journal update session-004, STATE.md (fork 3 done), commit.
Let me write E-012 script.
D-021 filed. Now the toy experiment E-012 to quantify axis 2 (extremal vs averaged).
tool: Write
input
{
"file_path": "D:\\Python\\Quantum\\research\\numerics\\scripts\\E-012-dbn-heat-flow-toy.py",
"content": "\"\"\"E-012 \u2014 de Bruijn-Newman heat-flow toy: collision-time statistics.\n\nIllustration for D-021 (task 3.3): the de Bruijn-Newman constant Lambda is\nset by the FIRST zero collision under the backward heat flow \u2014 an EXTREMAL\nstatistic (smallest rescaled gap) \u2014 whereas the 2/3 certificate is an\nAVERAGED (second-moment) statement. This script quantifies the mismatch on\nthe E-002 table (first 10^4 zeros, dps 25).\n\nTwo-body truncation of the Rodgers-Tao zero ODE\n dx_j/dt = 2 * sum_{k != j} 1/(x_j - x_k):\nisolated pair with gap delta obeys d(delta^2)/dt = 8, hence backward\ncollision time t_c = -delta^2 / 8.\n\nPart 1: t_c distribution over all 10^4 - 1 consecutive gaps (spread in\norders of magnitude; binding pair vs mean/median).\nPart 2: full all-to-all backward ODE integration on the first N_ODE = 300\nzeros (scipy solve_ivp, event at min-gap closure) to check the two-body\nestimate against the many-body dynamics.\n\nChecks:\n V1. two-body t_c computed for all gaps; min/max spread >= 4 orders of\n magnitude documented (extremal sensitivity).\n V2. full-ODE first-collision time agrees with two-body estimate for the\n binding pair within a factor of 4 (many-body correction modest).\n V3. Spearman-style sanity: the pair with the smallest gap is the pair\n that collides first in the full ODE.\n\nNOTE (toy conventions): gamma's are used directly as H_0 zero coordinates;\nthe physical H_t flow uses rescaled variables. Absolute t_c values are\nconvention-dependent; the ORDER-OF-MAGNITUDE SPREAD and the\nextremal-vs-averaged point are not.\n\nOutputs: research/numerics/data/E-012-dbn-heat-flow-toy.csv (+ .json)\n\"\"\"\nimport json\nimport time\nfrom datetime import datetime, timezone\nfrom pathlib import Path\n\nimport numpy as np\nfrom scipy.integrate import solve_ivp\n\nREPO = Path(__file__).resolve().parents[3]\nDATA = REPO / \"research\" / \"numerics\" / \"data\"\nZEROS_CSV = DATA / \"E-002-zeros-first-10000.csv\"\nCSV = DATA / \"E-012-dbn-heat-flow-toy.csv\"\nJSON = DATA / \"E-012-dbn-heat-flow-toy.json\"\n\nN_ODE = 300\nGAP_TOL = 1e-10\n\n\ndef load_zeros():\n with ZEROS_CSV.open() as f:\n f.readline()\n return np.array([float(line.split(\",\")[1]) for line in f])\n\n\ndef force(x):\n \"\"\"dx_j/dt = 2 * sum_{k != j} 1/(x_j - x_k), pairwise-vectorized.\"\"\"\n d = x[None, :] - x[:, None] # d[j, k] = x_k - x_j\n np.fill_diagonal(d, np.inf)\n return -2.0 * np.sum(1.0 / d, axis=1)\n\n\ndef main() -> int:\n if CSV.exists() and \"--force\" not in __import__(\"sys\").argv:\n print(f\"cached: {CSV.exists()} (use --force to recompute)\")\n return 0\n t0 = time.time()\n gam = load_zeros()\n gaps = np.diff(gam)\n\n # ---- Part 1: two-body collision-time distribution\n tc = gaps ** 2 / 8.0 # backward time |t_c| to collision\n order = np.argsort(tc)\n spread = tc.max() / tc.min()\n stats = {\n \"n_gaps\": int(len(gaps)),\n \"tc_min\": float(tc.min()),\n \"tc_median\": float(np.median(tc)),\n \"tc_max\": float(tc.max()),\n \"spread_orders\": float(np.log10(spread)),\n \"binding_pair_index\": int(order[0]) + 1, # 1-based zero index j of pair (j, j+1)\n \"binding_gap\": float(gaps[order[0]]),\n \"mean_gap\": float(gaps.mean()),\n \"min_gap\": float(gaps.min()),\n \"max_gap\": float(gaps.max()),\n }\n\n # ---- Part 2: full backward ODE on first N_ODE zeros\n x0 = gam[:N_ODE].copy()\n\n def rhs(t, x):\n return force(x)\n\n def event(t, x):\n return np.diff(x).min() - GAP_TOL\n event.terminal = True\n event.direction = 1 # integrating backward (t decreasing): gap shrinks\n\n t_span = (0.0, -10.0 * tc[: N_ODE - 1].min())\n sol = solve_ivp(rhs, t_span, x0, method=\"DOP853\", events=event,\n rtol=1e-11, atol=1e-13, dense_output=False)\n t_coll_ode = float(sol.t[-1])\n x_end = sol.y[:, -1]\n end_gaps = np.diff(x_end)\n j_coll = int(np.argmin(end_gaps))\n # two-body prediction: binding pair within the ODE window\n j_tb = int(np.argmin(gaps[: N_ODE - 1]))\n t_coll_tb = -float(gaps[j_tb] ** 2 / 8.0)\n ode_stats = {\n \"n_ode_zeros\": N_ODE,\n \"t_collision_ode\": t_coll_ode,\n \"colliding_pair_index\": j_coll + 1,\n \"two_body_pair_index\": j_tb + 1,\n \"t_collision_two_body\": t_coll_tb,\n \"ratio_ode_over_two_body\": t_coll_ode / t_coll_tb if t_coll_tb else None,\n \"same_pair\": bool(j_coll == j_tb),\n \"terminated_on_event\": bool(sol.status == 1),\n }\n\n check_v1 = bool(stats[\"spread_orders\"] >= 4.0)\n check_v2 = bool(ode_stats[\"terminated_on_event\"] and\n 0.25 <= ode_stats[\"ratio_ode_over_two_body\"] <= 4.0)\n check_v3 = bool(ode_stats[\"same_pair\"])\n checks = {\n \"V1_spread_ge_4_orders\": check_v1,\n \"V2_ode_vs_two_body_factor4\": check_v2,\n \"V3_smallest_gap_collides_first\": check_v3,\n }\n\n with CSV.open(\"w\", encoding=\"utf-8\", newline=\"\") as f:\n f.write(\"pair_index_j,gap,two_body_collision_time_abs\\n\")\n for j in range(len(gaps)):\n f.write(f\"{j + 1},{gaps[j]:.17e},{tc[j]:.17e}\\n\")\n\n meta = {\n \"experiment\": \"E-012\",\n \"task\": \"3.3: de Bruijn-Newman heat-flow toy (D-021 illustration)\",\n \"description\": \"Two-body Rodgers-Tao collision times from E-002 \"\n \"gaps (10^4 zeros) + full all-to-all backward ODE on \"\n \"first 300 zeros; extremal-vs-averaged mismatch\",\n \"script\": \"research/numerics/scripts/E-012-dbn-heat-flow-toy.py\",\n \"parameters\": {\"n_zeros\": len(gam), \"n_ode\": N_ODE},\n \"checks\": checks,\n \"key_values\": {**stats, **ode_stats},\n \"caveats\": [\n \"toy conventions: gammas used directly as H_0 zero \"\n \"coordinates; absolute t_c convention-dependent \u2014 only the \"\n \"spread and ordering carry the argument\",\n \"two-body truncation ignores many-body forces; Part 2 ODE \"\n \"quantifies the correction on the binding window\",\n ],\n \"elapsed_seconds\": round(time.time() - t0, 1),\n \"timestamp_utc\": datetime.now(timezone.utc).isoformat(),\n \"row_count\": int(len(gaps)),\n }\n JSON.write_text(json.dumps(meta, indent=2), encoding=\"utf-8\")\n ok = all(checks.values())\n print(f\"spread: {stats['spread_orders']:.1f} orders; \"\n f\"t_c min {stats['tc_min']:.3e} vs median {stats['tc_median']:.3e}\")\n print(f\"ODE first collision at t={t_coll_ode:.6e} (pair {j_coll + 1}); \"\n f\"two-body {t_coll_tb:.6e} (pair {j_tb + 1}); \"\n f\"ratio {ode_stats['ratio_ode_over_two_body']:.3f}\")\n print(f\"wrote {CSV.name}, {JSON.name} \u2014 \"\n f\"{'ALL CHECKS PASS' if ok else 'CHECK FAILURE: ' + str(checks)}\")\n return 0 if ok else 1\n\n\nif __name__ == \"__main__\":\n raise SystemExit(main())\n"
}
raw content_json (database row)
[{"type":"thinking","thinking":"Now E-012: toy illustration. Design:\n- Load E-002 zeros (10^4).\n- Compute consecutive gaps δ_j = γ_{j+1} − γ_j; two-body collision time t_c = −δ²/8 (from dδ²/dt = 8: δ²(t) = δ₀² + 8t → collision at t = −δ₀²/8).\n\nWait, check the factor: two zeros x₁ < x₂, δ = x₂ − x₁. dx₁/dt = 2/(x₁−x₂) = −2/δ; dx₂/dt = 2/(x₂−x₁) = +2/δ. dδ/dt = 4/δ. dδ²/dt = 2δ·4/δ = 8. So δ²(t) = δ₀² + 8t; backward (t<0) collision at t_c = −δ₀²/8. Good. (Note: the Rodgers–Tao ODE has factor 2 in the sum; with only mutual interaction this is the two-body truncation. Also the real H_t zero variables are rescaled vs γ — but as a toy, using γ's directly is fine, stated as such.)\n\n- Also run full backward ODE (all-to-all) on first ~300 zeros using scipy solve_ivp, integrating backward until first gap closes; compare measured first-collision time vs two-body prediction for the minimal pair. Validate that two-body underestimates/overestimates.\n- Checks: V1 two-body collision times distribution (min, median, max); V2 full-ODE first collision time within factor ~2 of two-body estimate for the binding pair; V3 monotonicity: collision times scale as δ² (correlation).\n- Output CSV: per-gap rows (j, δ_j, t_c two-body) for 10^4 gaps + summary JSON including full-ODE result.\n\nRuntime: trivial (seconds). ODE: 300 particles, all-to-all force, backward until min gap < threshold — solve_ivp with event. Fine.\n\nThen update indices: derivations index.md add D-021, db add-derivation, E-012 log-experiment, graveyard G-003 file + index + NGUYEN.md §6, mark 3.3 closed in NGUYEN.md §5, journal update session-004, STATE.md (fork 3 done), commit.\n\nLet me write E-012 script.","signature":""},{"type":"text","text":"D-021 filed. Now the toy experiment E-012 to quantify axis 2 (extremal vs averaged)."},{"type":"tool_use","id":"Write_68","name":"Write","input":{"file_path":"D:\\Python\\Quantum\\research\\numerics\\scripts\\E-012-dbn-heat-flow-toy.py","content":"\"\"\"E-012 — de Bruijn-Newman heat-flow toy: collision-time statistics.\n\nIllustration for D-021 (task 3.3): the de Bruijn-Newman constant Lambda is\nset by the FIRST zero collision under the backward heat flow — an EXTREMAL\nstatistic (smallest rescaled gap) — whereas the 2/3 certificate is an\nAVERAGED (second-moment) statement. This script quantifies the mismatch on\nthe E-002 table (first 10^4 zeros, dps 25).\n\nTwo-body truncation of the Rodgers-Tao zero ODE\n dx_j/dt = 2 * sum_{k != j} 1/(x_j - x_k):\nisolated pair with gap delta obeys d(delta^2)/dt = 8, hence backward\ncollision time t_c = -delta^2 / 8.\n\nPart 1: t_c distribution over all 10^4 - 1 consecutive gaps (spread in\norders of magnitude; binding pair vs mean/median).\nPart 2: full all-to-all backward ODE integration on the first N_ODE = 300\nzeros (scipy solve_ivp, event at min-gap closure) to check the two-body\nestimate against the many-body dynamics.\n\nChecks:\n V1. two-body t_c computed for all gaps; min/max spread >= 4 orders of\n magnitude documented (extremal sensitivity).\n V2. full-ODE first-collision time agrees with two-body estimate for the\n binding pair within a factor of 4 (many-body correction modest).\n V3. Spearman-style sanity: the pair with the smallest gap is the pair\n that collides first in the full ODE.\n\nNOTE (toy conventions): gamma's are used directly as H_0 zero coordinates;\nthe physical H_t flow uses rescaled variables. Absolute t_c values are\nconvention-dependent; the ORDER-OF-MAGNITUDE SPREAD and the\nextremal-vs-averaged point are not.\n\nOutputs: research/numerics/data/E-012-dbn-heat-flow-toy.csv (+ .json)\n\"\"\"\nimport json\nimport time\nfrom datetime import datetime, timezone\nfrom pathlib import Path\n\nimport numpy as np\nfrom scipy.integrate import solve_ivp\n\nREPO = Path(__file__).resolve().parents[3]\nDATA = REPO / \"research\" / \"numerics\" / \"data\"\nZEROS_CSV = DATA / \"E-002-zeros-first-10000.csv\"\nCSV = DATA / \"E-012-dbn-heat-flow-toy.csv\"\nJSON = DATA / \"E-012-dbn-heat-flow-toy.json\"\n\nN_ODE = 300\nGAP_TOL = 1e-10\n\n\ndef load_zeros():\n with ZEROS_CSV.open() as f:\n f.readline()\n return np.array([float(line.split(\",\")[1]) for line in f])\n\n\ndef force(x):\n \"\"\"dx_j/dt = 2 * sum_{k != j} 1/(x_j - x_k), pairwise-vectorized.\"\"\"\n d = x[None, :] - x[:, None] # d[j, k] = x_k - x_j\n np.fill_diagonal(d, np.inf)\n return -2.0 * np.sum(1.0 / d, axis=1)\n\n\ndef main() -> int:\n if CSV.exists() and \"--force\" not in __import__(\"sys\").argv:\n print(f\"cached: {CSV.exists()} (use --force to recompute)\")\n return 0\n t0 = time.time()\n gam = load_zeros()\n gaps = np.diff(gam)\n\n # ---- Part 1: two-body collision-time distribution\n tc = gaps ** 2 / 8.0 # backward time |t_c| to collision\n order = np.argsort(tc)\n spread = tc.max() / tc.min()\n stats = {\n \"n_gaps\": int(len(gaps)),\n \"tc_min\": float(tc.min()),\n \"tc_median\": float(np.median(tc)),\n \"tc_max\": float(tc.max()),\n \"spread_orders\": float(np.log10(spread)),\n \"binding_pair_index\": int(order[0]) + 1, # 1-based zero index j of pair (j, j+1)\n \"binding_gap\": float(gaps[order[0]]),\n \"mean_gap\": float(gaps.mean()),\n \"min_gap\": float(gaps.min()),\n \"max_gap\": float(gaps.max()),\n }\n\n # ---- Part 2: full backward ODE on first N_ODE zeros\n x0 = gam[:N_ODE].copy()\n\n def rhs(t, x):\n return force(x)\n\n def event(t, x):\n return np.diff(x).min() - GAP_TOL\n event.terminal = True\n event.direction = 1 # integrating backward (t decreasing): gap shrinks\n\n t_span = (0.0, -10.0 * tc[: N_ODE - 1].min())\n sol = solve_ivp(rhs, t_span, x0, method=\"DOP853\", events=event,\n rtol=1e-11, atol=1e-13, dense_output=False)\n t_coll_ode = float(sol.t[-1])\n x_end = sol.y[:, -1]\n end_gaps = np.diff(x_end)\n j_coll = int(np.argmin(end_gaps))\n # two-body prediction: binding pair within the ODE window\n j_tb = int(np.argmin(gaps[: N_ODE - 1]))\n t_coll_tb = -float(gaps[j_tb] ** 2 / 8.0)\n ode_stats = {\n \"n_ode_zeros\": N_ODE,\n \"t_collision_ode\": t_coll_ode,\n \"colliding_pair_index\": j_coll + 1,\n \"two_body_pair_index\": j_tb + 1,\n \"t_collision_two_body\": t_coll_tb,\n \"ratio_ode_over_two_body\": t_coll_ode / t_coll_tb if t_coll_tb else None,\n \"same_pair\": bool(j_coll == j_tb),\n \"terminated_on_event\": bool(sol.status == 1),\n }\n\n check_v1 = bool(stats[\"spread_orders\"] >= 4.0)\n check_v2 = bool(ode_stats[\"terminated_on_event\"] and\n 0.25 <= ode_stats[\"ratio_ode_over_two_body\"] <= 4.0)\n check_v3 = bool(ode_stats[\"same_pair\"])\n checks = {\n \"V1_spread_ge_4_orders\": check_v1,\n \"V2_ode_vs_two_body_factor4\": check_v2,\n \"V3_smallest_gap_collides_first\": check_v3,\n }\n\n with CSV.open(\"w\", encoding=\"utf-8\", newline=\"\") as f:\n f.write(\"pair_index_j,gap,two_body_collision_time_abs\\n\")\n for j in range(len(gaps)):\n f.write(f\"{j + 1},{gaps[j]:.17e},{tc[j]:.17e}\\n\")\n\n meta = {\n \"experiment\": \"E-012\",\n \"task\": \"3.3: de Bruijn-Newman heat-flow toy (D-021 illustration)\",\n \"description\": \"Two-body Rodgers-Tao collision times from E-002 \"\n \"gaps (10^4 zeros) + full all-to-all backward ODE on \"\n \"first 300 zeros; extremal-vs-averaged mismatch\",\n \"script\": \"research/numerics/scripts/E-012-dbn-heat-flow-toy.py\",\n \"parameters\": {\"n_zeros\": len(gam), \"n_ode\": N_ODE},\n \"checks\": checks,\n \"key_values\": {**stats, **ode_stats},\n \"caveats\": [\n \"toy conventions: gammas used directly as H_0 zero \"\n \"coordinates; absolute t_c convention-dependent — only the \"\n \"spread and ordering carry the argument\",\n \"two-body truncation ignores many-body forces; Part 2 ODE \"\n \"quantifies the correction on the binding window\",\n ],\n \"elapsed_seconds\": round(time.time() - t0, 1),\n \"timestamp_utc\": datetime.now(timezone.utc).isoformat(),\n \"row_count\": int(len(gaps)),\n }\n JSON.write_text(json.dumps(meta, indent=2), encoding=\"utf-8\")\n ok = all(checks.values())\n print(f\"spread: {stats['spread_orders']:.1f} orders; \"\n f\"t_c min {stats['tc_min']:.3e} vs median {stats['tc_median']:.3e}\")\n print(f\"ODE first collision at t={t_coll_ode:.6e} (pair {j_coll + 1}); \"\n f\"two-body {t_coll_tb:.6e} (pair {j_tb + 1}); \"\n f\"ratio {ode_stats['ratio_ode_over_two_body']:.3f}\")\n print(f\"wrote {CSV.name}, {JSON.name} — \"\n f\"{'ALL CHECKS PASS' if ok else 'CHECK FAILURE: ' + str(checks)}\")\n return 0 if ok else 1\n\n\nif __name__ == \"__main__\":\n raise SystemExit(main())\n"},"extra_content":null}]