Forgetting-Aware Memory Accuracy ported to drift-core: valid = active AND (wash>0 OR rock/established); missing rows skipped; empty = 0.0. 5-case battery from the live oracle incl. the missing-row path. First-run green.
52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
"""gen_drift_fama_truth.py — factory batch 12 truth battery (live oracle)."""
|
|
import json
|
|
import sqlite3
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
REPO = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(REPO / "src"))
|
|
sys.path.insert(0, str(REPO / "src" / "rune"))
|
|
|
|
import drift_core as dc # noqa: E402
|
|
|
|
|
|
def main():
|
|
tmp = Path(tempfile.mkdtemp(prefix="fama-truth-"))
|
|
db = sqlite3.connect(str(tmp / "t.db"))
|
|
db.row_factory = sqlite3.Row
|
|
db.execute("CREATE TABLE entries (id INTEGER PRIMARY KEY, status TEXT, rock_status TEXT, wash_count INTEGER)")
|
|
rows = [
|
|
(1, "active", "washable", 5), # valid (wash>0)
|
|
(2, "active", "established", 0), # valid (established)
|
|
(3, "active", "rock", 0), # valid (rock)
|
|
(4, "active", "washable", 0), # INVALID (active, no wash, washable)
|
|
(5, "superseded", "washable", 9), # invalid (not active)
|
|
]
|
|
db.executemany("INSERT INTO entries VALUES (?,?,?,?)", rows)
|
|
db.commit()
|
|
|
|
cases = []
|
|
for name, ids in [("all_valid", [1, 2, 3]), ("mixed", [1, 2, 4]),
|
|
("with_missing", [1, 999]), ("empty", []),
|
|
("all_invalid", [4, 5])]:
|
|
fetched = []
|
|
for eid in ids:
|
|
r = db.execute("SELECT status, rock_status, wash_count FROM entries WHERE id=?", (eid,)).fetchone()
|
|
if r:
|
|
fetched.append(dict(r))
|
|
cases.append({
|
|
"fn": "fama", "name": name,
|
|
"input": {"rows": fetched, "count": len(ids)},
|
|
"expected": {"fama": dc.compute_fama(db, "q", ids)},
|
|
})
|
|
|
|
out = {"oracle": "drift_core.compute_fama (live)", "generated": "2026-10-08", "cases": cases}
|
|
(REPO / "src/go/drift-core" / "truth_fama.json").write_text(json.dumps(out, indent=1) + "\n")
|
|
print(f"wrote {len(cases)} cases")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|