#!/usr/bin/env bash # Monitor n=300 runs and print decision matrix when all finish set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "${ROOT}" echo "Watching for n=300 completion..." echo "(Exit with Ctrl+C)" echo "" while true; do completed=0 total=3 for seed in 42 123 456; do summary="experiments/runs/20260502-214859_grokking_n300_s${seed}/results/summary.json" if [ -f "$summary" ]; then ((completed++)) fi done echo -ne "\rProgress: $completed / $total complete..." if [ "$completed" -eq "$total" ]; then echo "" echo "" echo "════════════════════════════════════════════════════════════════════════════════════" echo " n=300 Completion — Decision Matrix" echo "════════════════════════════════════════════════════════════════════════════════════" echo "" python3 << 'EOF' import json print(f"{'seed':<6} {'best_ood':>10} {'final_ood':>10} {'delta':>10} {'grok_ep':>10} {'interpretation':<30}") print("-"*90) results = [] for seed in [42, 123, 456]: summary = f"experiments/runs/20260502-214859_grokking_n300_s{seed}/results/summary.json" try: s = json.load(open(summary)) best = s.get("best_ood", 0) final = s.get("final_ood", 0) delta = final - best grok = s.get("grokking_epoch", -1) if delta < -0.05: interp = "Ungrokking (collapse)" elif abs(delta) < 0.05 and best > 0.70: interp = "Stable grokking ✓" elif best > 0.70: interp = "Found causal, drift" elif best > 0.65: interp = "Partial grokking" else: interp = "No grokking" results.append((seed, best, final, delta, grok, interp)) print(f"{seed:<6} {best:>10.4f} {final:>10.4f} {delta:>+10.4f} {grok:>10.0f} {interp:<30}") except: print(f"{seed:<6} ERROR reading summary.json") print("") print("="*90) print(" OUTCOME CLASSIFICATION:") print("="*90) # Check which outcome all_stable = all(abs(r[3]) < 0.05 and r[1] > 0.70 for r in results) all_ungrok = all(r[3] < -0.05 for r in results) any_high = any(r[1] > 0.75 for r in results) if all_stable: print("\n✅ OUTCOME A: n=300 all seeds stable grokking (best ≈ final, all > 0.70)") print(" → Fire ablation grid immediately") elif all_ungrok: print("\n⚠️ OUTCOME B: n=300 systematic ungrokking (all show collapse)") print(" → Ungrokking is a finding. Paper: instability + early stopping criterion") elif any_high and all(r[3] < 0 for r in results): print("\n⚠️ OUTCOME C: n=300 finds high OOD peaks but collapses") print(" → Grokking as search procedure. Paper: early stopping at peak") else: print("\n❓ OUTCOME D or mixed: heterogeneous results") print(" → Need to interpret case-by-case") EOF echo "" echo "════════════════════════════════════════════════════════════════════════════════════" break fi sleep 5 done