File size: 3,502 Bytes
dd90a4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python3
"""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())