CAFF / integrity_check.py
MrDhifallah's picture
Add files using upload-large-folder tool
0f27df2 verified
Raw
History Blame Contribute Delete
3.57 kB
"""
integrity_check.py -- Verify that today's work is intact and consistent.
Run from the CAFF root:
python integrity_check.py
Checks that the critical files exist, have expected line counts, and
that the trained checkpoints from today's experiments are present.
"""
import hashlib
from pathlib import Path
def md5_short(path: Path) -> str:
h = hashlib.md5(path.read_bytes()).hexdigest()
return h[:12]
def check_file(label: str, path: str, expected_lines: int | None = None,
must_contain: list[str] | None = None) -> bool:
p = Path(path)
if not p.exists():
print(f" [MISS] {label}: {path}")
return False
text = p.read_text(encoding="utf-8")
lines = text.count("\n") + (0 if text.endswith("\n") else 1)
h = md5_short(p)
line_ok = (expected_lines is None) or (lines == expected_lines)
contain_ok = True
missing = []
if must_contain:
for s in must_contain:
if s not in text:
contain_ok = False
missing.append(s)
status = "OK " if (line_ok and contain_ok) else "WARN"
print(f" [{status}] {label}: {lines} lines, md5={h}, path={path}")
if not line_ok:
print(f" expected {expected_lines} lines, got {lines}")
if missing:
print(f" missing: {missing}")
return line_ok and contain_ok
def check_checkpoint(label: str, path: str) -> bool:
p = Path(path)
if not p.exists():
print(f" [MISS] {label}: {path}")
return False
size_mb = p.stat().st_size / (1024 * 1024)
print(f" [OK ] {label}: {size_mb:.1f} MB at {path}")
return True
def main() -> None:
print("=" * 70)
print(" Integrity check for today's work (May 29, 2026)")
print("=" * 70)
print()
print("Critical files:")
print("-" * 50)
all_ok = True
all_ok &= check_file(
"README.md (v2, reframed)", "README.md",
expected_lines=589,
must_contain=["0.5764", "CAFF is a triple filter", "Scope and Future Work"],
)
all_ok &= check_file(
"caff_full.yaml (DEPRECATED)", "configs/caff_full.yaml",
must_contain=["DEPRECATED", "d: 768"],
)
all_ok &= check_file(
"no_dc.yaml (current default)", "configs/no_dc.yaml",
must_contain=["use_dc: false"],
)
all_ok &= check_file(
"theta_sensitivity.py", "scripts/theta_sensitivity.py",
must_contain=["def run_one_theta"],
)
all_ok &= check_file(
"per_relation_f1.py", "scripts/per_relation_f1.py",
must_contain=["sys.path.insert", "from caff import"],
)
print()
print("Checkpoints (no_dc, 3 seeds):")
print("-" * 50)
for seed in [42, 1337, 2024]:
all_ok &= check_checkpoint(
f"no_dc seed {seed}", f"runs/no_dc/seed_{seed}/best.pt"
)
print()
print("Results from today:")
print("-" * 50)
for seed in [42, 1337, 2024]:
check_file(
f"per_relation seed {seed}",
f"results/per_relation_seed{seed}.json",
must_contain=['"is_a"', '"has_phenotype"'],
)
for seed in [42, 1337, 2024]:
check_file(
f"theta_sens summary seed {seed}",
f"results/theta_sens_seed{seed}/summary.json",
must_contain=['"thetas"', '"f1"'],
)
print()
print("=" * 70)
if all_ok:
print(" ALL CRITICAL CHECKS PASSED")
else:
print(" SOME CHECKS FAILED -- review above")
print("=" * 70)
if __name__ == "__main__":
main()