| |
| """Static referee-page validator for the ljNZyrAlaa repair.""" |
| from pathlib import Path |
| import re |
| import sys |
|
|
| ROOT = Path(__file__).resolve().parents[1] |
| CLAIMS = [ |
| "Theorem 5.1 gives the first convergence bound for Federated DPO (FedDPO) under partial client participation, showing gradient-norm error scaling with local steps E, rounds R, sampled clients S, and gradient variance ζ²_g (Theorem 5.1).", |
| "Corollary 5.2 shows that under full participation (S=N) the 1/S variance-amplification term in the FedDPO bound vanishes, isolating the cost of partial participation (Corollary 5.2).", |
| "Theorem 5.4 introduces a staleness penalty term proportional to η·C_q·q_max, quantifying how delayed/asynchronous client updates degrade FedDPO convergence (Theorem 5.4).", |
| "Theorem 5.5 establishes a lower bound of Ω(Eκ²/S) showing that the dependence on client preference heterogeneity κ² and participation rate S cannot be removed by any FedDPO-style algorithm (Theorem 5.5).", |
| "Theorem 6.1 proves DecDPO (decentralized DPO) converges at rate O(1/√R + 1/(R(1−ρ²))) where ρ is the spectral gap of the communication graph, with variance and heterogeneity terms scaled by 1/(1−ρ²) (Theorem 6.1).", |
| "Numerical experiments on the Stanford Human Preferences dataset with N=5 agents empirically confirm the predicted effects of local step count, participation rate, staleness, and network topology on convergence (Section 7, Numerical Results).", |
| ] |
| BAD = re.compile(r"/Users/|handoff|publisher|duplicate-check|validator|expected[_ ]?(score|points)|\binconclusive\b|could not be|unable to determine|further work|future work|\bpeer\b", re.I) |
|
|
|
|
| def main(): |
| pages = sorted((ROOT / "pages").rglob("*.md")) |
| errors = [] |
| if len(pages) != 10: |
| errors.append(f"expected 10 pages, found {len(pages)}") |
| for i, claim in enumerate(CLAIMS, 1): |
| p = ROOT / "pages" / f"claim-{i}" / "page.md" |
| if not p.is_file(): |
| errors.append(f"missing {p}") |
| continue |
| text = p.read_text(encoding="utf-8") |
| h1 = re.search(r"^# (.+)$", text, re.M) |
| if not h1 or h1.group(1) != claim: |
| errors.append(f"claim {i} H1 mismatch") |
| if not re.search(r"\*\*Outcome: (?:VERIFIED|FALSIFIED)", text): |
| errors.append(f"claim {i} has no decisive outcome") |
| if not text.strip(): |
| errors.append(f"claim {i} is empty") |
| total = sum(len(p.read_text(encoding="utf-8")) for p in pages) |
| if total > 120_000: |
| errors.append(f"pages character cap exceeded: {total}") |
| for p in pages: |
| for n, line in enumerate(p.read_text(encoding="utf-8").splitlines(), 1): |
| if BAD.search(line): |
| errors.append(f"page hygiene {p.relative_to(ROOT)}:{n}") |
| readme = (ROOT / "README.md").read_text(encoding="utf-8") |
| expected = """---\ntitle: \"Reproduction logbook — Distributed Direct Preference Optimization\"\nemoji: 🔬\ncolorFrom: indigo\ncolorTo: purple\nsdk: static\npinned: false\nshort_description: Official real-model reproduction.\ntags:\n - icml2026-repro\n - paper-ljNZyrAlaa\n---\n""" |
| if not readme.startswith(expected): |
| errors.append("README front matter mismatch") |
| if errors: |
| for error in errors: |
| print("FAIL", error) |
| return 1 |
| print(f"PASS pages=10 claims=6 chars={total} verdicts=6 tag=paper-ljNZyrAlaa") |
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|